diff --git a/babsi/BabsiApp Test/bin/AndroidManifest.xml b/babsi/BabsiApp Test/bin/AndroidManifest.xml deleted file mode 100644 index fa18b015b84c8e37fe7605c7dccc56a8af2e7e28..0000000000000000000000000000000000000000 --- a/babsi/BabsiApp Test/bin/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="cau.swp.babsi.test" - android:versionCode="1" - android:versionName="1.0" > - - <uses-sdk android:minSdkVersion="14" /> - - <instrumentation - android:name="android.test.InstrumentationTestRunner" - android:targetPackage="cau.swp.babsi" /> - - <application - android:icon="@drawable/ic_launcher" - android:label="@string/app_name" > - <uses-library android:name="android.test.runner" /> - </application> - -</manifest> \ No newline at end of file diff --git a/babsi/BabsiWeb/.classpath b/babsi/BabsiWeb/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..e5f704ff35fe4e3119084bd65aabee4af0aa9cc0 --- /dev/null +++ b/babsi/BabsiWeb/.classpath @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src/java"/> + <classpathentry kind="src" path="src/groovy"/> + <classpathentry kind="src" path="grails-app/conf"/> + <classpathentry kind="src" path="grails-app/controllers"/> + <classpathentry kind="src" path="grails-app/domain"/> + <classpathentry kind="src" path="grails-app/services"/> + <classpathentry kind="src" path="grails-app/taglib"/> + <classpathentry kind="src" path="grails-app/utils"/> + <classpathentry kind="src" path="test/integration"/> + <classpathentry kind="src" path="test/unit"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry excluding="BuildConfig.groovy|*DataSource.groovy|UrlMappings.groovy|Config.groovy|BootStrap.groovy|spring/resources.groovy" kind="src" path=".link_to_grails_plugins/cache-1.0.1/grails-app/conf"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/cache-1.0.1/grails-app/services"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/cache-1.0.1/grails-app/taglib"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/cache-1.0.1/src/groovy"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/cache-1.0.1/src/java"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="BuildConfig.groovy|*DataSource.groovy|UrlMappings.groovy|Config.groovy|BootStrap.groovy|spring/resources.groovy" kind="src" path=".link_to_grails_plugins/database-migration-1.3.2/grails-app/conf"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/database-migration-1.3.2/grails-app/controllers"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/database-migration-1.3.2/grails-app/views"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/database-migration-1.3.2/src/groovy"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="BuildConfig.groovy|*DataSource.groovy|UrlMappings.groovy|Config.groovy|BootStrap.groovy|spring/resources.groovy" kind="src" path=".link_to_grails_plugins/jquery-1.8.3/grails-app/conf"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/jquery-1.8.3/grails-app/i18n"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/jquery-1.8.3/grails-app/services"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/jquery-1.8.3/grails-app/taglib"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/jquery-1.8.3/src/groovy"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="BuildConfig.groovy|*DataSource.groovy|UrlMappings.groovy|Config.groovy|BootStrap.groovy|spring/resources.groovy" kind="src" path=".link_to_grails_plugins/resources-1.2/grails-app/conf"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/resources-1.2/grails-app/i18n"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/resources-1.2/grails-app/resourceMappers"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/resources-1.2/grails-app/taglib"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/resources-1.2/src/groovy"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/resources-1.2/src/java"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="BuildConfig.groovy|*DataSource.groovy|UrlMappings.groovy|Config.groovy|BootStrap.groovy|spring/resources.groovy" kind="src" path=".link_to_grails_plugins/webxml-1.4.1/grails-app/conf"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path=".link_to_grails_plugins/webxml-1.4.1/src/groovy"> + <attributes> + <attribute name="org.grails.ide.eclipse.core.SOURCE_FOLDER" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.grails.ide.eclipse.core.CLASSPATH_CONTAINER"/> + <classpathentry exported="true" kind="con" path="GROOVY_DSL_SUPPORT"/> + <classpathentry kind="output" path="target-eclipse/classes"/> +</classpath> diff --git a/babsi/BabsiWeb/.project b/babsi/BabsiWeb/.project new file mode 100644 index 0000000000000000000000000000000000000000..9aa3acb9a743b995a548f3d593013bddc9a5511a --- /dev/null +++ b/babsi/BabsiWeb/.project @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>BabsiWeb</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.wst.common.project.facet.core.builder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.grails.ide.eclipse.core.nature</nature> + <nature>org.eclipse.jdt.groovy.core.groovyNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.wst.common.project.facet.core.nature</nature> + </natures> + <linkedResources> + <link> + <name>.link_to_grails_plugins</name> + <type>2</type> + <locationURI>GRAILS_ROOT/2.2.4/projects/BabsiWeb/plugins</locationURI> + </link> + </linkedResources> +</projectDescription> diff --git a/babsi/BabsiWeb/.settings/org.eclipse.core.resources.prefs b/babsi/BabsiWeb/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..3862f28d30ace21827653a8bcef1bd925ba61338 --- /dev/null +++ b/babsi/BabsiWeb/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,20 @@ +eclipse.preferences.version=1 +encoding//.link_to_grails_plugins/jquery-1.8.3/grails-app/i18n/messages.properties=UTF-8 +encoding//.link_to_grails_plugins/resources-1.2/grails-app/i18n/messages.properties=UTF-8 +encoding//grails-app/i18n/messages.properties=UTF-8 +encoding//grails-app/i18n/messages_cs_CZ.properties=UTF-8 +encoding//grails-app/i18n/messages_da.properties=UTF-8 +encoding//grails-app/i18n/messages_de.properties=UTF-8 +encoding//grails-app/i18n/messages_es.properties=UTF-8 +encoding//grails-app/i18n/messages_fr.properties=UTF-8 +encoding//grails-app/i18n/messages_it.properties=UTF-8 +encoding//grails-app/i18n/messages_ja.properties=UTF-8 +encoding//grails-app/i18n/messages_nb.properties=UTF-8 +encoding//grails-app/i18n/messages_nl.properties=UTF-8 +encoding//grails-app/i18n/messages_pl.properties=UTF-8 +encoding//grails-app/i18n/messages_pt_BR.properties=UTF-8 +encoding//grails-app/i18n/messages_pt_PT.properties=UTF-8 +encoding//grails-app/i18n/messages_ru.properties=UTF-8 +encoding//grails-app/i18n/messages_sv.properties=UTF-8 +encoding//grails-app/i18n/messages_th.properties=UTF-8 +encoding//grails-app/i18n/messages_zh_CN.properties=UTF-8 diff --git a/babsi/BabsiWeb/.settings/org.eclipse.jdt.groovy.core.prefs b/babsi/BabsiWeb/.settings/org.eclipse.jdt.groovy.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..a0aa4d41331cbf2afa869a98af5e3abc35b74ab0 --- /dev/null +++ b/babsi/BabsiWeb/.settings/org.eclipse.jdt.groovy.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +groovy.compiler.level=20 diff --git a/babsi/BabsiWeb/.settings/org.eclipse.wst.common.project.facet.core.xml b/babsi/BabsiWeb/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000000000000000000000000000000000000..13ac95c65429ad0b520f8ad3ba0d3b9007b2d879 --- /dev/null +++ b/babsi/BabsiWeb/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<faceted-project> + <installed facet="grails.app" version="1.0"/> +</faceted-project> diff --git a/babsi/BabsiWeb/.settings/org.grails.ide.eclipse.core.prefs b/babsi/BabsiWeb/.settings/org.grails.ide.eclipse.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..eab0767638caa40e28645bef8102c21f3c6c5b2a --- /dev/null +++ b/babsi/BabsiWeb/.settings/org.grails.ide.eclipse.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.grails.ide.eclipse.core.org.grails.ide.eclipse.core.install.name=grails 2.2.4 +org.grails.ide.eclipse.core.use.default.install=false diff --git a/babsi/BabsiWeb/application.properties b/babsi/BabsiWeb/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..e5cd551e38c95453385c0065fbf8bfaf392b8a62 --- /dev/null +++ b/babsi/BabsiWeb/application.properties @@ -0,0 +1,7 @@ +#Grails Metadata file +#Wed Nov 20 15:38:39 CET 2013 +app.grails.version=2.2.4 +app.name=BabsiWeb +app.version=0.1 +plugins.flot=0.2.3 +plugins.platform-core=1.0.RC5 diff --git a/babsi/BabsiWeb/grails-app/conf/ApplicationResources.groovy b/babsi/BabsiWeb/grails-app/conf/ApplicationResources.groovy new file mode 100644 index 0000000000000000000000000000000000000000..06b60c71113a74b89593beb66a8c004df7d15687 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/ApplicationResources.groovy @@ -0,0 +1,5 @@ +modules = { + application { + resource url:'js/application.js' + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/conf/BootStrap.groovy b/babsi/BabsiWeb/grails-app/conf/BootStrap.groovy new file mode 100644 index 0000000000000000000000000000000000000000..71de4fefaea07cd65b9b3a9c3864dfcda98c9676 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/BootStrap.groovy @@ -0,0 +1,755 @@ +import grails.converters.JSON + +import java.text.SimpleDateFormat + +import org.apache.shiro.crypto.hash.Sha256Hash + +import babsi.* +import cau.swp.babsi.Role +import cau.swp.babsi.Station +import cau.swp.babsi.User +import cau.swp.babsi.medication.Antibiotic +import cau.swp.babsi.medication.ApplicationRate +import cau.swp.babsi.medication.DrugApplicationType +import cau.swp.babsi.medication.DrugData +import cau.swp.babsi.medication.InterventionStatus +import cau.swp.babsi.medication.InterventionType +import cau.swp.babsi.medication.PrescriptionReason +import cau.swp.babsi.medication.Strength +import cau.swp.babsi.wardround.Checklist +import cau.swp.babsi.wardround.Cycle +import cau.swp.babsi.wardround.Infection +import cau.swp.babsi.wardround.MiBiStatus +import cau.swp.babsi.wardround.WardRound + +class BootStrap { + + def init = { servletContext -> + + /* overwrite JSONMarshaller for Antibiotic */ + JSON.registerObjectMarshaller(Antibiotic) { + def returnArray = [:] + returnArray['name'] = it.name + return returnArray + } + + /* overwrite JSONMarshaller for Infection */ + JSON.registerObjectMarshaller(Infection) { + def returnArray = [:] + returnArray['name'] = it.name + return returnArray + } + /* overwrite JSONMarshaller for InterventionType */ + JSON.registerObjectMarshaller(InterventionType) { + def returnArray = [:] + returnArray['name'] = it.name + return returnArray + } + + /* overwrite JSONMarshaller for User */ + JSON.registerObjectMarshaller(User) { + def returnArray = [:] + returnArray['username'] = it.username + returnArray['passwordHash'] = it.passwordHash + return returnArray + } + + /* overwrite JSONMarshaller for Station */ + JSON.registerObjectMarshaller(Station) { + def returnArray = [:] + returnArray['name'] = it.name + return returnArray + } + + // Beginn Antibiotika aus Liste, ohne oral/iv + + def antibiotic1 = new Antibiotic(name: "Amoxicillin") + antibiotic1.save() + + def antibiotic2 = new Antibiotic(name: "Ampicillin") + antibiotic2.save() + + def antibiotic3 = new Antibiotic(name: "Ampicillin/Sulbactam (Unacid)") + antibiotic3.save() + + def antibiotic4 = new Antibiotic(name: "Azithromycin") + antibiotic4.save() + + def antibiotic5 = new Antibiotic(name: "Benzylpenicillin") + antibiotic5.save() + + def antibiotic6 = new Antibiotic(name: "Cefaclor") + antibiotic6.save() + + def antibiotic7 = new Antibiotic(name: "Cefazolin (Basocef)") + antibiotic7.save() + + def antibiotic8 = new Antibiotic(name: "Cefixim") + antibiotic8.save() + + def antibiotic9 = new Antibiotic(name: "Cefotaxim (Claforan)") + antibiotic9.save() + + def antibiotic10 = new Antibiotic(name: "Cefpodoxim (Orelox)") + antibiotic10.save() + + def antibiotic11 = new Antibiotic(name: "Ceftazidim (Fortum)") + antibiotic11.save() + + def antibiotic12 = new Antibiotic(name: "Ceftriaxon (Rocephin)") + antibiotic12.save() + + def antibiotic13 = new Antibiotic(name: "Cefuroxim") + antibiotic13.save() + + def antibiotic14 = new Antibiotic(name: "Ciprofloxacin") + antibiotic14.save() + + def antibiotic15 = new Antibiotic(name: "Ciprofloxacin") + antibiotic15.save() + + def antibiotic16 = new Antibiotic(name: "Clarithromycin (Klacid)") + antibiotic16.save() + + def antibiotic17 = new Antibiotic(name: "Clindamycin") + antibiotic17.save() + + def antibiotic18 = new Antibiotic(name: "Colistin") + antibiotic18.save() + + def antibiotic19 = new Antibiotic(name: "Colistin") + antibiotic18.save() + + def antibiotic20 = new Antibiotic(name: "Cotrimoxazol") + antibiotic20.save() + + def antibiotic21 = new Antibiotic(name: "Daptomycin (Cubicin)") + antibiotic21.save() + + def antibiotic22 = new Antibiotic(name: "Doxycyclin") + antibiotic22.save() + + def antibiotic23 = new Antibiotic(name: "Ertapenem (Invanz)") + antibiotic23.save() + + def antibiotic24 = new Antibiotic(name: "Erythromycin") + antibiotic24.save() + + def antibiotic25 = new Antibiotic(name: "Flucloxacillin (Staphylex)") + antibiotic25.save() + + def antibiotic26 = new Antibiotic(name: "Fosfomycin (Infectofos)") + antibiotic26.save() + + def antibiotic27 = new Antibiotic(name: "Fosfomycin (Monuril)") + antibiotic27.save() + + def antibiotic28 = new Antibiotic(name: "Gentamicin") + antibiotic28.save() + + def antibiotic29 = new Antibiotic(name: "Imipenem/Cilastin (Zienam)") + antibiotic29.save() + + def antibiotic30 = new Antibiotic(name: "Levofloxacin (Tavanic)") + antibiotic30.save() + + def antibiotic31 = new Antibiotic(name: "Linezolid (Zyvoxid)") + antibiotic31.save() + + def antibiotic32 = new Antibiotic(name: "Meropenem") + antibiotic32.save() + + def antibiotic33 = new Antibiotic(name: "Metronidazol (Clont)") + antibiotic33.save() + + def antibiotic34 = new Antibiotic(name: "Minocyclin") + antibiotic34.save() + + def antibiotic35 = new Antibiotic(name: "Moxifloxacin (Avalox)") + antibiotic35.save() + + def antibiotic36 = new Antibiotic(name: "Phenoxymethylpenicillin") + antibiotic36.save() + + def antibiotic37 = new Antibiotic(name: "Piperacillin") + antibiotic37.save() + + def antibiotic38 = new Antibiotic(name: "Piperacillin/Tazobactam (Tazobac)") + antibiotic38.save() + + def antibiotic39 = new Antibiotic(name: "Rifampicin") + antibiotic39.save() + + def antibiotic40 = new Antibiotic(name: "Roxithromycin") + antibiotic40.save() + + def antibiotic41 = new Antibiotic(name: "Sultamicillin (Unacid PD)") + antibiotic41.save() + + def antibiotic42 = new Antibiotic(name: "Teicoplanin (Targocid)") + antibiotic42.save() + + def antibiotic43 = new Antibiotic(name: "Tigecyclin (Zygacil)") + antibiotic43.save() + + def antibiotic44 = new Antibiotic(name: "Tobramycin (Gernebcin)") + antibiotic44.save() + + def antibiotic45 = new Antibiotic(name: "Vancomycin") + antibiotic45.save() + + // Antibiotika Ende + + + // Beginn Stärken aus Liste (für "Strength") + + def Strength strength1 = new Strength(strength: "40mg") + strength1.save() + + def Strength strength2 = new Strength(strength: "50mg") + strength2.save() + + def Strength strength3 = new Strength(strength: "80mg") + strength3.save() + + def Strength strength4 = new Strength(strength: "100mg") + strength4.save() + + def Strength strength5 = new Strength(strength: "150mg") + strength5.save() + + def Strength strength6 = new Strength(strength: "160mg") + strength6.save() + + def Strength strength7 = new Strength(strength: "150mg") + strength7.save() + + def Strength strength8 = new Strength(strength: "200mg") + strength8.save() + + def Strength strength9 = new Strength(strength: "240mg") + strength9.save() + + def Strength strength10 = new Strength(strength: "250mg") + strength10.save() + + def Strength strength11 = new Strength(strength: "300mg") + strength11.save() + + def Strength strength12 = new Strength(strength: "350mg") + strength12.save() + + def Strength strength13 = new Strength(strength: "375mg") + strength13.save() + + def Strength strength14 = new Strength(strength: "400mg") + strength14.save() + + def Strength strength15 = new Strength(strength: "480mg") + strength15.save() + + def Strength strength16 = new Strength(strength: "500mg") + strength16.save() + + def Strength strength17 = new Strength(strength: "600mg") + strength17.save() + + def Strength strength18 = new Strength(strength: "750mg") + strength18.save() + + def Strength strength19 = new Strength(strength: "0,5g") + strength19.save() + + def Strength strength20 = new Strength(strength: "1,0g") + strength20.save() + + def Strength strength21 = new Strength(strength: "1,5g") + strength21.save() + + def Strength strength22 = new Strength(strength: "2,0g") + strength22.save() + + def Strength strength23 = new Strength(strength: "3,0g") + strength23.save() + + def Strength strength24 = new Strength(strength: "4,0g") + strength24.save() + + def Strength strength25 = new Strength(strength: "4,5g") + strength25.save() + + def Strength strength26 = new Strength(strength: "5,0g") + strength26.save() + + def Strength strength27 = new Strength(strength: "1,0 Mio IE") + strength27.save() + + def Strength strength28 = new Strength(strength: "1,2 Moi IE") + strength28.save() + + def Strength strength29 = new Strength(strength: "2,0 Mio IE") + strength29.save() + + def Strength strength30 = new Strength(strength: "5,0 Mio IE") + strength30.save() + + def Strength strength31 = new Strength(strength: "10,0 Mio IE") + strength31.save() + + def Strength strength32 = new Strength(strength: "körpergewichtsadaptiert") + strength32.save() + + def Strength strength33 = new Strength(strength: "nach Ansage") + strength33.save() + + // Ende Stärken + + + // Beginn Häufigkeiten aus Liste (für "ApplicationRate") + + def ApplicationRate applicationRate1 = new ApplicationRate(rate: "1x täglich") + applicationRate1.save() + + def ApplicationRate applicationRate2 = new ApplicationRate(rate: "2x täglich") + applicationRate2.save() + + def ApplicationRate applicationRate3 = new ApplicationRate(rate: "3x täglich") + applicationRate3.save() + + def ApplicationRate applicationRate4 = new ApplicationRate(rate: "4x täglich") + applicationRate4.save() + + def ApplicationRate applicationRate5 = new ApplicationRate(rate: "alle 48h 1x") + applicationRate5.save() + + def ApplicationRate applicationRate6 = new ApplicationRate(rate: "nach Ansage") + applicationRate6.save() + + def ApplicationRate applicationRate7 = new ApplicationRate(rate: "3x pro Woche") + applicationRate7.save() + + def ApplicationRate applicationRate8 = new ApplicationRate(rate: "einmalig") + applicationRate8.save() + + def ApplicationRate applicationRate9 = new ApplicationRate(rate: "bei Zugangswechsel") + applicationRate9.save() + + // Ende Häufigkeiten + + + // Begin Verabreichungsarten entnommen aus Liste Antibiotika (für "DrugApplicationType") + + def DrugApplicationType drugApplicationType1 = new DrugApplicationType(name: "oral") + drugApplicationType1.save() + + def DrugApplicationType drugApplicationType2 = new DrugApplicationType(name: "intravenös") + drugApplicationType2.save() + + def DrugApplicationType drugApplicationType3 = new DrugApplicationType(name: "inhalativ") + drugApplicationType3.save() + + // Ende Verabreichungsarten + + + // Beginn Interventionsarten aus Liste "Interventionen" (für "InterventionType") + + def InterventionType interventionType1 = new InterventionType(name: "Fokussuche empfohlen") + interventionType1.save() + + def InterventionType interventionType2 = new InterventionType(name: "Eskalation") + interventionType2.save() + + def InterventionType interventionType3 = new InterventionType(name: "Deeskalation") + interventionType3.save() + + def InterventionType interventionType4 = new InterventionType(name: "Regimewechsel") + interventionType4.save() + + def InterventionType interventionType5 = new InterventionType(name: "Zugangswechsel") + interventionType5.save() + + def InterventionType interventionType6 = new InterventionType(name: "MiBi empfohlen") + interventionType6.save() + + def InterventionType interventionType7 = new InterventionType(name: "Oralisierung") + interventionType7.save() + + def InterventionType interventionType8 = new InterventionType(name: "Dosisoptimierung") + interventionType8.save() + + def InterventionType interventionType9 = new InterventionType(name: "Absetzen") + interventionType9.save() + + // Ende Interventionsarten + + + // Beginn Infektionsdiagnosen aus Liste (für "Infection") + + def Infection infection1 = new Infection(name: "CAP") + infection1.save() + + def Infection infection2 = new Infection(name: "HAP") + infection2.save() + + def Infection infection3 = new Infection(name: "HWI") + infection3.save() + + def Infection infection4 = new Infection(name: "HAWT") + infection4.save() + + def Infection infection5 = new Infection(name: "Sepsis") + infection5.save() + + def Infection infection6 = new Infection(name: "COPD") + infection6.save() + + def Infection infection7 = new Infection(name: "Pankreatitis") + infection7.save() + + def Infection infection8 = new Infection(name: "Divertikulitis") + infection8.save() + + def Infection infection9 = new Infection(name: "Gelenkinfektion") + infection9.save() + + def Infection infection10 = new Infection(name: "FUO") + infection10.save() + + def Infection infection11 = new Infection(name: "ZNS") + infection11.save() + + def Infection infection12 = new Infection(name: "Endokarditis") + infection12.save() + + def Infection infection13 = new Infection(name: "Peritonitis") + infection13.save() + + def Infection infection14 = new Infection(name: "CDAD") + infection14.save() + + def Infection infection15 = new Infection(name: "Osteomyelitis") + infection15.save() + + def Infection infection16 = new Infection(name: "Prophylaxe") + infection16.save() + + def Infection infection17 = new Infection(name: "V.a.") + infection17.save() + + def Infection infection18 = new Infection(name: "keine") + infection18.save() + + def Infection infection19 = new Infection(name: "unklar") + infection19.save() + + // Ende Infektionsdiagnosen + + + // Interventionstatus (für InterventionStatus) + + def InterventionStatus interventionStatus1 = new InterventionStatus(description: "unbekannt") + interventionStatus1.save() + + def InterventionStatus interventionStatus2 = new InterventionStatus(description: "angenommen") + interventionStatus2.save() + + def InterventionStatus interventionStatus3 = new InterventionStatus(description: "abgelehnt") + interventionStatus3.save() + + // Ende Interventionstatus + + + // Beginn MiBi-Status (für MiBiStatus) + + def MiBiStatus mibiStatus1 = new MiBiStatus(name: "unklar") + mibiStatus1.save() + + def MiBiStatus mibiStatus2 = new MiBiStatus(name: "Befund vorhanden") + mibiStatus2.save() + + def MiBiStatus mibiStatus3 = new MiBiStatus(name: "nicht durchgeführt") + mibiStatus3.save() + + def MiBiStatus mibiStatus4 = new MiBiStatus(name: "angefordert") + mibiStatus4.save() + + // Ende MiBiStatus + + + // Beginn Verschreibungsgrund (für PrescriptionReason) + + def PrescriptionReason prescriptionReason1 = new PrescriptionReason(name: "unbekannt") + prescriptionReason1.save() + + def PrescriptionReason prescriptionReason2 = new PrescriptionReason(name: "prophylaktisch") + prescriptionReason2.save() + + def PrescriptionReason prescriptionReason3 = new PrescriptionReason(name: "therapeutisch") + prescriptionReason3.save() + + // Ende Verschreibungsgrund + + + + + // Testdaten + + // Role + Role absUserRole = new Role(name: "absUser") + absUserRole.addToPermissions("*:*:*") + absUserRole.save() + + + // TestUser + def User user1 = new User(username: "user123", passwordHash: new Sha256Hash("password").toHex()) + user1.addToRoles(absUserRole) + user1.save() + + def User user2 = new User(username: "otherUser", passwordHash: new Sha256Hash("otherPassword").toHex()) + user2.addToRoles(absUserRole) + user2.save() + + def User user3 = new User(username: "thirdUser", passwordHash: new Sha256Hash("thirdPassword").toHex()) + user3.addToRoles(absUserRole) + user3.save() + + + // Teststationen + + def Station station1 = new Station(name: "Community") + station1.save() + + def Station station2 = new Station(name: "Breaking Bad") + station2.save(flush: true) + + def Station station3 = new Station(name: "The Simpsons") + station3.save() + + def Station station4 = new Station(name: "Game of Thrones") + station4.save() + + // Turnus + + SimpleDateFormat sdf = new SimpleDateFormat ("dd.mm.yyyy"); + + + // Testvisiten + + def WardRound wardRound1 = new WardRound(station: station1, date: new Date(1379455200000), durationInSeconds: 4365, createdBy: user2) + wardRound1.save() + Cycle.addToCurrentCycle(wardRound1) + + def WardRound wardRound2 = new WardRound(station: station2, date: new Date(1379541600000), durationInSeconds: 3467, createdBy: user1) + wardRound2.save() + Cycle.addToCurrentCycle(wardRound2) + + def WardRound wardRound3 = new WardRound(station: station3, date: new Date(1379628000000), durationInSeconds: 3210, createdBy: user1) + wardRound3.save() + Cycle.addToCurrentCycle(wardRound3) + + def WardRound wardRound4 = new WardRound(station: station4, date: new Date(1379714400000), durationInSeconds: 2912, createdBy: user3) + wardRound4.save() + Cycle.addToCurrentCycle(wardRound4) + + def WardRound wardRound5 = new WardRound(station: station1, date: new Date(1379714400000), durationInSeconds: 3921, createdBy: user2) + wardRound5.save() + Cycle.addToCurrentCycle(wardRound5) + + + // TestDrugData für Intervention + def DrugData drugData1 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic1, drugApplicationType: drugApplicationType1, + strength: strength4, applicationRate: applicationRate5, durationInDays: 5, intervention: interventionType2, + interventionStatus: interventionStatus3, prescriptionReason: prescriptionReason1) + drugData1.save() + + def DrugData drugData2 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic5, drugApplicationType: drugApplicationType2, + strength: strength8, applicationRate: applicationRate4, durationInDays: 9, intervention: interventionType3, + interventionStatus: interventionStatus1, prescriptionReason: prescriptionReason1) + drugData2.save() + + def DrugData drugData3 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic3, drugApplicationType: drugApplicationType1, + strength: strength8, applicationRate: applicationRate9, durationInDays: 4, intervention: interventionType1, + interventionStatus: interventionStatus2, prescriptionReason: prescriptionReason2) + drugData3.save() + + def DrugData drugData4 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic7, drugApplicationType: drugApplicationType1, + strength: strength9, applicationRate: applicationRate8, durationInDays: 6, intervention: interventionType7, + interventionStatus: interventionStatus3, prescriptionReason: prescriptionReason1) + drugData4.save() + + def DrugData drugData5 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic2, drugApplicationType: drugApplicationType1, + strength: strength3, applicationRate: applicationRate3, durationInDays: 12, intervention: interventionType5, + interventionStatus: interventionStatus2, prescriptionReason: prescriptionReason2) + drugData5.save() + + def DrugData drugData6 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic3, drugApplicationType: drugApplicationType1, + strength: strength12, applicationRate: applicationRate1, durationInDays: 14, intervention: interventionType3, + interventionStatus: interventionStatus1, prescriptionReason: prescriptionReason3) + drugData6.save() + + def DrugData drugData7 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic11, drugApplicationType: drugApplicationType2, + strength: strength6, applicationRate: applicationRate2, durationInDays: 8, intervention: interventionType4, + interventionStatus: interventionStatus1, prescriptionReason: prescriptionReason1) + drugData7.save() + + def DrugData drugData8 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic7, drugApplicationType: drugApplicationType3, + strength: strength2, applicationRate: applicationRate4, durationInDays: 10, intervention: interventionType3, + interventionStatus: interventionStatus3, prescriptionReason: prescriptionReason1) + drugData8.save() + + def DrugData drugData9 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic5, drugApplicationType: drugApplicationType2, + strength: strength10, applicationRate: applicationRate5, durationInDays: 4, intervention: interventionType4, + interventionStatus: interventionStatus2, prescriptionReason: prescriptionReason1) + drugData9.save() + + def DrugData drugData10 = new DrugData(comment: "Ein Kommentar.", antibiotic: antibiotic12, drugApplicationType: drugApplicationType1, + strength: strength11, applicationRate: applicationRate7, durationInDays: 17, intervention: interventionType3, + interventionStatus: interventionStatus1, prescriptionReason: prescriptionReason2) + drugData10.save() + + // Begin Testchecklisten + + def Checklist checklist1 = new Checklist(patientDescription: "Jeff Winger", patientDateOfBirth: sdf.parse("20.11.1978"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "wehe dir!", wardRound: wardRound1) + checklist1.addToDrugData(drugData1) + checklist1.addToInfections(infection3) + checklist1.addToInfections(infection7) + checklist1.save() + wardRound1.addToChecklists(checklist1) + + def Checklist checklist2 = new Checklist(patientDescription: "Jeff Winger", patientDateOfBirth: sdf.parse("20.11.1978"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "im Ernst?") + checklist2.addToDrugData(drugData2) + checklist2.addToInfections(infection5) + checklist2.addToInfections(infection1) + checklist2.wardRound = wardRound5 + checklist2.save() + wardRound5.addToChecklists(checklist2) + + def Checklist checklist3 = new Checklist(patientDescription: "Walther White", patientDateOfBirth: sdf.parse("07.09.1959"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "Sie haben da Senf.") + checklist3.addToDrugData(drugData3) + checklist3.addToInfections(infection5) + checklist3.addToInfections(infection1) + checklist3.wardRound = wardRound2 + checklist3.save() + wardRound2.addToChecklists(checklist3) + + def Checklist checklist4 = new Checklist(patientDescription: "Jesse Pinkman", patientDateOfBirth: sdf.parse("16.09.1984"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "Science, bitch!") + checklist4.addToDrugData(drugData4) + checklist4.addToInfections(infection5) + checklist4.addToInfections(infection1) + checklist4.wardRound = wardRound2 + checklist4.save() + wardRound2.addToChecklists(checklist4) + + def Checklist checklist5 = new Checklist(patientDescription: "Moe Szyslak", patientDateOfBirth: sdf.parse("08.01.1973"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "Whats-a-matter, Homer?") + checklist5.addToDrugData(drugData5) + checklist5.addToInfections(infection5) + checklist5.addToInfections(infection1) + checklist5.wardRound = wardRound3 + checklist5.save() + wardRound3.addToChecklists(checklist5) + + def Checklist checklist6 = new Checklist(patientDescription: "Hans Maulwurf", patientDateOfBirth: sdf.parse("06.03.1891"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "Das Verspeisen einer Apfelsine ist zu vergleichen mit einer guten Ehe!") + checklist6.addToDrugData(drugData6) + checklist6.addToInfections(infection5) + checklist6.addToInfections(infection1) + checklist6.wardRound = wardRound3 + checklist6.save() + wardRound3.addToChecklists(checklist6) + + def Checklist checklist7 = new Checklist(patientDescription: "Tyrion Lannister", patientDateOfBirth: sdf.parse("06.08.1091"), patientSex:"male", + mibiStatus: mibiStatus1, comment: "It's not easy being drunk all the time. Everyone would do it, if it were easy.") + checklist7.addToDrugData(drugData7) + checklist7.addToInfections(infection5) + checklist7.addToInfections(infection1) + checklist7.wardRound = wardRound3 + checklist7.save() + wardRound4.addToChecklists(checklist7) + + def Checklist checklist8 = new Checklist(patientDescription: "Arya Stark", patientDateOfBirth: sdf.parse("29.02.1112"), patientSex:"female", + mibiStatus: mibiStatus1, comment: "Not today.") + checklist8.addToDrugData(drugData8) + checklist8.addToInfections(infection5) + checklist8.addToInfections(infection1) + checklist8.wardRound = wardRound3 + checklist8.save() + wardRound4.addToChecklists(checklist8) + + def Checklist checklist9 = new Checklist(patientDescription: "Annie Edison", patientDateOfBirth: sdf.parse("09.12.1990"), patientSex:"female", + mibiStatus: mibiStatus1, comment: "That was a game. This is paintball.") + checklist9.addToDrugData(drugData9) + checklist9.addToInfections(infection5) + checklist9.addToInfections(infection1) + checklist9.wardRound = wardRound3 + checklist9.save() + wardRound1.addToChecklists(checklist9) + + def Checklist checklist10 = new Checklist(patientDescription: "Annie Edison", patientDateOfBirth: sdf.parse("09.12.1990"), patientSex:"female", + mibiStatus: mibiStatus1, comment: "That was a game. This is paintball.") + checklist10.addToDrugData(drugData10) + checklist10.addToInfections(infection5) + checklist10.addToInfections(infection1) + checklist10.wardRound = wardRound3 + checklist10.save() + wardRound5.addToChecklists(checklist10) + + + + + // Testintervention für Patient 2 + // def Intervention intervention3 = new Intervention(interventionType: interventionType4, comment: "Er blutet aus dem Hintern.") + // intervention3.save() + // + // def Intervention intervention4 = new Intervention(interventionType: interventionType3, comment: "Er blutet aus dem Hintern.") + // intervention4.save() + + // TestDrugData für Intervention + // def DrugData drugData3 = new DrugData(comment: "Am Arsch hängt der Hammer.", antibiotic: antibiotic1, drugApplicationType: drugApplicationType1, + // strength: strength4, applicationRate: applicationRate1, durationInDays: 5, intervention: interventionType4, + // interventionStatus: interventionStatus3, prescriptionReason: prescriptionReason1) + // drugData3.save() + // + // def DrugData drugData4 = new DrugData(comment: "Am Arsch hängt der Hammer.", antibiotic: antibiotic5, drugApplicationType: drugApplicationType2, + // strength: strength8, applicationRate: applicationRate7, durationInDays: 9, intervention: interventionType3, + // interventionStatus: interventionStatus2, prescriptionReason: prescriptionReason2) + // drugData4.save() + // + // // Begin TestCheckliste 1 + // cal1.set(1991, 11, 20) + // def Checklist checklist3 = new Checklist(patientDescription: "Daniel Jay", patientDateOfBirth: cal1.getTime(), patientSex:"male", + // mibiStatus: mibiStatus3, comment: "wehe dir!", wardRound: wardRound1) + // checklist3.addToDrugData(drugData3) + // checklist3.addToInfections(infection1) + // checklist3.addToInfections(infection9) + // checklist3.save() + // + // // Begin TestCheckliste 2 + // cal1.set(1991, 11, 20) + // def Checklist checklist4 = new Checklist(patientDescription: "Daniel Jay", patientDateOfBirth: cal1.getTime(), patientSex:"male", + // mibiStatus: mibiStatus2, comment: "im Ernst?") + // checklist4.addToDrugData(drugData4) + // checklist4.addToInfections(infection2) + // checklist4.addToInfections(infection5) + // checklist4.save() + // + // wardRound1.addToChecklists(checklist3) + // wardRound2.addToChecklists(checklist4) + + + + + + + + + + + } + def destroy = { + } +} diff --git a/babsi/BabsiWeb/grails-app/conf/BuildConfig.groovy b/babsi/BabsiWeb/grails-app/conf/BuildConfig.groovy new file mode 100644 index 0000000000000000000000000000000000000000..ae2f701cd8b433d3c25916a4af3965ccdca6c880 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/BuildConfig.groovy @@ -0,0 +1,64 @@ +grails.servlet.version = "2.5" // Change depending on target container compliance (2.5 or 3.0) +grails.project.class.dir = "target/classes" +grails.project.test.class.dir = "target/test-classes" +grails.project.test.reports.dir = "target/test-reports" +grails.project.target.level = 1.6 +grails.project.source.level = 1.6 +//grails.project.war.file = "target/${appName}-${appVersion}.war" + +// uncomment (and adjust settings) to fork the JVM to isolate classpaths +//grails.project.fork = [ +// run: [maxMemory:1024, minMemory:64, debug:false, maxPerm:256] +//] + +grails.project.dependency.resolution = { + // inherit Grails' default dependencies + inherits("global") { + // specify dependency exclusions here; for example, uncomment this to disable ehcache: + // excludes 'ehcache' + } + log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' + checksums true // Whether to verify checksums on resolve + legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility + + repositories { + inherits true // Whether to inherit repository definitions from plugins + mavenRepo "http://maven.restlet.org/" //needed for JAX-RS plugin + grailsPlugins() + grailsHome() + grailsCentral() + + mavenLocal() + mavenCentral() + + // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories + //mavenRepo "http://snapshots.repository.codehaus.org" + //mavenRepo "http://repository.codehaus.org" + //mavenRepo "http://download.java.net/maven/2/" + //mavenRepo "http://repository.jboss.com/maven2/" + } + + dependencies { + // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g. + + runtime 'mysql:mysql-connector-java:5.1.22' + } + + plugins { + runtime ":hibernate:$grailsVersion" + runtime ":jquery:1.8.3" + runtime ":resources:1.2" + + // Uncomment these (or add new ones) to enable additional resources capabilities + //runtime ":zipped-resources:1.0" + //runtime ":cached-resources:1.0" + //runtime ":yui-minify-resources:0.1.5" + + build ":tomcat:$grailsVersion" + + runtime ":database-migration:1.3.2" + + compile ":shiro:1.1.4" + compile ':cache:1.0.1' + } +} diff --git a/babsi/BabsiWeb/grails-app/conf/Config.groovy b/babsi/BabsiWeb/grails-app/conf/Config.groovy new file mode 100644 index 0000000000000000000000000000000000000000..2a8ef3f5f1506bb7557de663f2ba3332360f18b8 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/Config.groovy @@ -0,0 +1,91 @@ +// locations to search for config files that get merged into the main config; +// config files can be ConfigSlurper scripts, Java properties files, or classes +// in the classpath in ConfigSlurper format + +// grails.config.locations = [ "classpath:${appName}-config.properties", +// "classpath:${appName}-config.groovy", +// "file:${userHome}/.grails/${appName}-config.properties", +// "file:${userHome}/.grails/${appName}-config.groovy"] + +// if (System.properties["${appName}.config.location"]) { +// grails.config.locations << "file:" + System.properties["${appName}.config.location"] +// } + +grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination +grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format +grails.mime.use.accept.header = false +grails.mime.types = [ + all: '*/*', + atom: 'application/atom+xml', + css: 'text/css', + csv: 'text/csv', + form: 'application/x-www-form-urlencoded', + html: ['text/html','application/xhtml+xml'], + js: 'text/javascript', + json: ['application/json', 'text/json'], + multipartForm: 'multipart/form-data', + rss: 'application/rss+xml', + text: 'text/plain', + xml: ['text/xml', 'application/xml'] +] + +// URL Mapping Cache Max Size, defaults to 5000 +//grails.urlmapping.cache.maxsize = 1000 + +// What URL patterns should be processed by the resources plugin +grails.resources.adhoc.patterns = ['/images/*', '/css/*', '/js/*', '/plugins/*'] + +// The default codec used to encode data with ${} +grails.views.default.codec = "none" // none, html, base64 +grails.views.gsp.encoding = "UTF-8" +grails.converters.encoding = "UTF-8" +// enable Sitemesh preprocessing of GSP pages +grails.views.gsp.sitemesh.preprocess = true +// scaffolding templates configuration +grails.scaffolding.templates.domainSuffix = 'Instance' + +// Set to false to use the new Grails 1.2 JSONBuilder in the render method +grails.json.legacy.builder = false +// enabled native2ascii conversion of i18n properties files +grails.enable.native2ascii = true +// packages to include in Spring bean scanning +grails.spring.bean.packages = [] +// whether to disable processing of multi part requests +grails.web.disable.multipart=false + +// request parameters to mask when logging exceptions +grails.exceptionresolver.params.exclude = ['password'] + +// configure auto-caching of queries by default (if false you can cache individual queries with 'cache: true') +grails.hibernate.cache.queries = false + +environments { + development { + grails.logging.jul.usebridge = true + } + production { + grails.logging.jul.usebridge = false + // TODO: grails.serverURL = "http://www.changeme.com" + } +} + +// log4j configuration +log4j = { + // Example of changing the log pattern for the default console appender: + // + //appenders { + // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n') + //} + + error 'org.codehaus.groovy.grails.web.servlet', // controllers + 'org.codehaus.groovy.grails.web.pages', // GSP + 'org.codehaus.groovy.grails.web.sitemesh', // layouts + 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping + 'org.codehaus.groovy.grails.web.mapping', // URL mapping + 'org.codehaus.groovy.grails.commons', // core / classloading + 'org.codehaus.groovy.grails.plugins', // plugins + 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration + 'org.springframework', + 'org.hibernate', + 'net.sf.ehcache.hibernate' +} diff --git a/babsi/BabsiWeb/grails-app/conf/DataSource.groovy b/babsi/BabsiWeb/grails-app/conf/DataSource.groovy new file mode 100644 index 0000000000000000000000000000000000000000..bafe26762707fc24337026356d71237651175d84 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/DataSource.groovy @@ -0,0 +1,59 @@ +dataSource { + pooled = true + driverClassName = "org.h2.Driver" + username = "sa" + password = "" +} +hibernate { + cache.use_second_level_cache = true + cache.use_query_cache = false + cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' +} +// environment specific settings +environments { + development { + dataSource { + dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' + url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000" + } +// dataSource { +// pooled = true +// dbCreate = "create-drop" +// url = "jdbc:mysql://localhost/babsi?useUnicode=yes&characterEncoding=UTF-8" +// driverClassName = "com.mysql.jdbc.Driver" +// username = "root" +// password = "root" +// } + } + test { + dataSource { + dbCreate = "update" + url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000" + } + } + production { +// dataSource { +// dbCreate = "update" +// url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000" +// pooled = true +// properties { +// maxActive = -1 +// minEvictableIdleTimeMillis=1800000 +// timeBetweenEvictionRunsMillis=1800000 +// numTestsPerEvictionRun=3 +// testOnBorrow=true +// testWhileIdle=true +// testOnReturn=true +// validationQuery="SELECT 1" +// } +// } + dataSource { + pooled = true + dbCreate = "create-drop" + url = "jdbc:mysql://localhost/babsi" + driverClassName = "com.mysql.jdbc.Driver" + username = "root" + password = "root" + } + } +} diff --git a/babsi/BabsiWeb/grails-app/conf/UrlMappings.groovy b/babsi/BabsiWeb/grails-app/conf/UrlMappings.groovy new file mode 100644 index 0000000000000000000000000000000000000000..86e1cb2b8169f2bedf6c4a4843fd82b09d9ba67e --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/UrlMappings.groovy @@ -0,0 +1,22 @@ +class UrlMappings { + + static mappings = { + "/$controller/$action?/$id?"{ constraints { // apply constraints here + } + } + + "/" { + controller = "Dashboard" + action = "index" + } + + /* get requests are mapped to standard (list) */ + + /* mapping for checklist post request */ + "/checklist/post"(controller: "checklist", action: "consumeAsJSON", parseRequest:true) + + // "/"(view:"/index") + + "500"(view:'/error') + } +} diff --git a/babsi/BabsiWeb/grails-app/conf/babsi/SecurityFilters.groovy b/babsi/BabsiWeb/grails-app/conf/babsi/SecurityFilters.groovy new file mode 100644 index 0000000000000000000000000000000000000000..eac023df91f1382a33365397dc70243a04032be1 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/babsi/SecurityFilters.groovy @@ -0,0 +1,111 @@ +package babsi + +/** + * Generated by the Shiro plugin. This filters class protects all URLs + * via access control by convention. + */ +class SecurityFilters { + + /** + * Array of controller/action combinations which will be skipped from authentication + * if the controller and action names match. The action value can also be '*' if it + * encompasses all actions within the controller. + */ + static nonAuthenticatedActions = [ + + [controller: "checklist", action: "consumeAsJSON"], + [controller: "antibiotic", action: "getJSON"], + [controller: "station", action: "getJSON"], + [controller: "interventionType", action: "getJSON"], + [controller: "infection", action: "getJSON"], + [controller: "user", action: "getJSON"] + + ] + + /** + * Array of controller/action combinations that will be authenticated against the user's + * role. The map also includes the roles which the controller/action pair will match + * against. + */ + static authenticatedActions = [ + + [controller: "dashboard", action: "*", roles:["absUser"]], + [controller: "data", action: "*", roles:["absUser"]], + [controller: "station", action: "*", roles:["absUser"]], + [controller: "statistic", action: "*", roles:["absUser"]], + [controller: "user", action: "*", roles:["absUser"]], + + [controller: "antibiotic", action: "*", roles:["absUser"]], + [controller: "interventionType", action: "*", roles:["absUser"]], + + [controller: "checklist", action: "*", roles:["absUser"]], + [controller: "cycle", action: "*", roles:["absUser"]], + [controller: "infection", action: "*", roles:["absUser"]], + [controller: "wardRound", action: "*", roles:["absUser"]] + ] + + def filters = { + + // so können weiter Checklisten gesendet werden... + +// notPost(controller: "checklist", action: "consumeAsJSON", invert: true) { +// before = { +// accessControl() +// } +// +// } + + + // schnell mal auskommentiert ... + + // all(uri: "/**") { + // before = { + // // Ignore direct views (e.g. the default main index page). + // // if (!controllerName) return true + // + // accessControl() } + // } + + + + all(controller: '*', action: '*') { + before = { + + // Determine if the controller/action belongs is not to be authenticated + def needsAuth = !nonAuthenticatedActions.find { + (it.controller == controllerName) && + ((it.action == '*') || (it.action == actionName)) + } + + if (needsAuth) { + + // Get the map within the authenticated actions which pertain to the current + // controller and view. + def authRoles = authenticatedActions.find { + (it.controller == controllerName) && + ((it.action == '*') || (it.action == actionName)) + } + + if (authRoles) { + + // Perform the access control for each of the roles provided in the authRoles + accessControl { + authRoles.roles.each { roleName -> role(roleName) } + } + } + + // Skip authentication if the authRoles was not found + else { + return true + } + } + + // Skip authentication if no auth is needed + else { + return true + } + } + } + } + +} diff --git a/babsi/BabsiWeb/grails-app/conf/spring/resources.groovy b/babsi/BabsiWeb/grails-app/conf/spring/resources.groovy new file mode 100644 index 0000000000000000000000000000000000000000..fa950068bbf09933b338207af9cbbc2f5888e960 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/conf/spring/resources.groovy @@ -0,0 +1,3 @@ +// Place your Spring DSL code here +beans = { +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/AuthController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/AuthController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..87fe74ce6557bbf1a74271e7935a40a60ec38662 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/AuthController.groovy @@ -0,0 +1,98 @@ +package cau.swp.babsi + +import org.apache.shiro.SecurityUtils +import org.apache.shiro.authc.AuthenticationException +import org.apache.shiro.authc.UsernamePasswordToken +import org.apache.shiro.web.util.SavedRequest +import org.apache.shiro.web.util.WebUtils +import org.apache.shiro.grails.ConfigUtils + +/** + * Babsi Controller AuthController: + * + * Managed die Authentifizierung der Benutzer + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class AuthController { + def shiroSecurityManager + + static navigationScope = 'debug' + + def index = { redirect(action: "login", params: params) } + + def login = { + return [ username: params.username, rememberMe: (params.rememberMe != null), targetUri: params.targetUri ] + } + + def signIn = { + def authToken = new UsernamePasswordToken(params.username, params.password as String) + + // Support for "remember me" + if (params.rememberMe) { + authToken.rememberMe = true + } + + // If a controller redirected to this page, redirect back + // to it. Otherwise redirect to the root URI. + def targetUri = params.targetUri ?: "/" + + // Handle requests saved by Shiro filters. + def savedRequest = WebUtils.getSavedRequest(request) + if (savedRequest) { + targetUri = savedRequest.requestURI - request.contextPath + if (savedRequest.queryString) targetUri = targetUri + '?' + savedRequest.queryString + } + + try{ + // Perform the actual login. An AuthenticationException + // will be thrown if the username is unrecognised or the + // password is incorrect. + SecurityUtils.subject.login(authToken) + + // aktuellen User in session hinterlegen + session.setAttribute("userID", User.findByUsername(params.username).id) + + log.info "Redirecting to '${targetUri}'." + redirect(uri: targetUri) + } + catch (AuthenticationException ex){ + // Authentication failed, so display the appropriate message + // on the login page. + log.info "Authentication failure for user '${params.username}'." + flash.message = message(code: "login.failed") + + // Keep the username and "remember me" setting so that the + // user doesn't have to enter them again. + def m = [ username: params.username ] + if (params.rememberMe) { + m["rememberMe"] = true + } + + // Remember the target URI too. + if (params.targetUri) { + m["targetUri"] = params.targetUri + } + + // Now redirect back to the login page. + redirect(action: "login", params: m) + } + } + + def signOut = { + // Log the user out of the application. + def principal = SecurityUtils.subject?.principal + SecurityUtils.subject?.logout() + // For now, redirect back to the home page. + if (ConfigUtils.getCasEnable() && ConfigUtils.isFromCas(principal)) { + redirect(uri:ConfigUtils.getLogoutUrl()) + }else { + redirect(uri: "/") + } + ConfigUtils.removePrincipal(principal) + } + + def unauthorized = { render "You do not have permission to access this page." } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DashboardController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DashboardController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..60e50fc9fc791dabac9f3f4522dd35b263bd8bf4 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DashboardController.groovy @@ -0,0 +1,18 @@ +package cau.swp.babsi + +/** + * Babsi Controller BashboardController: + * + * Managed die Startseite der Weboberfläche + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class DashboardController { + + static navigationScope = 'debug' + def index() { + [user: User.get(session.getAttribute("userID")).username] + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DataController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DataController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..922c6fa3909206ea896160eb5f16b861acb4ebb2 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/DataController.groovy @@ -0,0 +1,41 @@ +package cau.swp.babsi + +import cau.swp.babsi.wardround.Checklist; + +/** + * Babsi Controller AuthController: + * + * Managed die ABS Daten + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class DataController { + + static String Header = "Station;Datum;Patientenbezeichnung;Patientengeburtsdatum;Geschlecht;MikrobiologieStatus;Kommentar;" + + "Antibiotika1:Antibiotika;Verabreichungsart;Stärke;Verabreichungsrate;DauerinTagen;Intervention;InterventionsStatus;Kommentar;" + + "Antibiotika2:Antibiotika;Verabreichungsart;Stärke;Verabreichungsrate;DauerinTagen;Intervention;InterventionsStatus;Kommentar;" + + "Antibiotika3:Antibiotika;Verabreichungsart;Stärke;Verabreichungsrate;DauerinTagen;Intervention;InterventionsStatus;Kommentar;" + + "Antibiotika4:Antibiotika;Verabreichungsart;Stärke;Verabreichungsrate;DauerinTagen;Intervention;InterventionsStatus;Kommentar;" + + "Antibiotika5:Antibiotika;Verabreichungsart;Stärke;Verabreichungsrate;DauerinTagen;Intervention;InterventionsStatus;Kommentar;" + + "Infektion1:Name;Infektion2:Name;Infektion3:Name;Infektion4:Name;Infektion5:Name\n" + + def index() { } + + def export() { + + response.setContentType("application/octet-stream") + response.setHeader("Content-disposition", "attachment; filename=\"checklist.csv\"") + + def allChecklists = Checklist.getAll() + + def data = Header; + + for (int i = 0; i < allChecklists.size(); i++) { + data = (data + allChecklists.get(i).toCSV()); + } + + render data + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StationController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StationController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..88957483bef9e5aa27297e1c1f19a30eecb248c6 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StationController.groovy @@ -0,0 +1,155 @@ +package cau.swp.babsi + +import org.springframework.dao.DataIntegrityViolationException + +import cau.swp.babsi.Station; +import grails.converters.JSON +import grails.converters.XML + +/** + * Babsi Controller StationController: + * + * Managed die Methoden auf Station(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class StationController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + /** + * Gibt formatierte Daten entsprechend der Anfrage zurück + * + * @param max + * @return html or json or xml + */ + def list(Integer max) { + params.max = Math.min(max ?: 10, 100) + params.sort="name" + params.order="asc" + [stationInstanceList: Station.list(params), stationInstanceTotal: Station.count()] + } + + def getJSON(Integer max) { + // Stationen nach Namen sortiert an App liefern + params.sort="name" + params.order="asc" + render Station.list(params) as JSON + } + + def create() { + [stationInstance: new Station(params)] + } + + def save() { + def stationInstance = new Station(params) + if (!stationInstance.save(flush: true)) { + render(view: "create", model: [stationInstance: stationInstance]) + return + } + + flash.message = message(code: 'default.created.message', args: [ + message(code: 'station.label', default: 'Station'), + stationInstance.id + ]) + redirect(action: "show", id: stationInstance.id) + } + + def show(Long id) { + def stationInstance = Station.get(id) + if (!stationInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "list") + return + } + + [stationInstance: stationInstance] + } + + def edit(Long id) { + def stationInstance = Station.get(id) + if (!stationInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "list") + return + } + + [stationInstance: stationInstance] + } + + def update(Long id, Long version) { + def stationInstance = Station.get(id) + if (!stationInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "list") + return + } + + if (version != null) { + if (stationInstance.version > version) { + stationInstance.errors.rejectValue("version", "default.optimistic.locking.failure", + [ + message(code: 'station.label', default: 'Station')] as Object[], + "Another user has updated this Station while you were editing") + render(view: "edit", model: [stationInstance: stationInstance]) + return + } + } + + stationInstance.properties = params + + if (!stationInstance.save(flush: true)) { + render(view: "edit", model: [stationInstance: stationInstance]) + return + } + + flash.message = message(code: 'default.updated.message', args: [ + message(code: 'station.label', default: 'Station'), + stationInstance.id + ]) + redirect(action: "show", id: stationInstance.id) + } + + def delete(Long id) { + def stationInstance = Station.get(id) + if (!stationInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "list") + return + } + + try { + stationInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [ + message(code: 'station.label', default: 'Station'), + id + ]) + redirect(action: "show", id: id) + } + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StatisticController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StatisticController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..36a04f62a1504023f08f40e8d8ed5617d8545131 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/StatisticController.groovy @@ -0,0 +1,149 @@ +package cau.swp.babsi + +import grails.converters.JSON +import cau.swp.babsi.medication.DrugData +import cau.swp.babsi.wardround.Checklist +import cau.swp.babsi.wardround.Cycle +import cau.swp.babsi.wardround.WardRound + +/** + * Babsi Controller StatisticController: + * + * Managed die Methoden für die Statistiken + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class StatisticController { + + def defaultStartDate = new Date().time - 2592000000 + def defaultEndDate = new Date().time + + def index() { + [stations: Station.findAll(), startDate: defaultStartDate, endDate: defaultEndDate, users: User.findAll(), statistic1Id: 0, statistic3Id:session.getAttribute("userID")] + } + + def stationInterventions(long id){ + def long startDate = defaultStartDate + def long endDate = defaultEndDate + + if(params.containsKey("startDate") && params.startDate.isLong()) startDate = params.startDate.toLong() + if(params.containsKey("endDate") && params.endDate.isLong()) endDate = params.endDate.toLong() + + Station station = Station.get(id); + def message = station.wardrounds.size() + if(station == null) return render ("Unbekannte Station") + + + def i = 0; + def output = [:]; + def counter = 0; + def typeName; + + for(WardRound wardround:station.wardrounds){ + if(wardround.date.time < startDate || wardround.date.time > endDate) continue + for(Checklist checklist:wardround.checklists){ + for(DrugData drugData: checklist.drugData){ + + if(drugData.intervention != null) { + typeName = drugData.intervention.name + if(output.get(typeName) != null){ + counter = output.get(typeName)+1 + } else counter = 1; + + output.put(typeName, counter) + counter = 0 + } + } + } + } + + // create data that flot can work with + output = output.sort { a,b -> + def valueCompare = a.value <=> b.value + if(valueCompare == 0) return a.key <=> b.key // sort alphabetically if equal + valueCompare + + } // sort by value +// render output + + render (getTupelList(output) as JSON) + } + + /** durchschnittliche Interventionszahl im Visitenturnus pro Patient. + * pro Zyklus hat ein Patient z.B. 0.3 Interventionen + * + * @return Liste von Tupel mit dem ersten Element als Turnus Id und dann dem Durchschnitt + */ + def cycleInterventions() { + def long startDate = 0 + def long endDate = new Date().time + + if(params.containsKey("startDate") && params.startDate.isLong()) startDate = params.startDate.toLong() + if(params.containsKey("endDate") && params.endDate.isLong()) endDate = params.endDate.toLong() + + + def output = [:] + + long cycleId; + double average = 0; + int interventions = 0; // Anzahl Interventionen + int checklistCounter = 0; // anzahl der Patienten + for(Cycle cycle:Cycle.findAll()){ + cycleId = cycle.id + + // filtern + if((cycle.beginDate.time < startDate && cycle.endDate != null && cycle.endDate.time <= startDate) // komplett vor dem Zeitraum + || cycle.beginDate.time > endDate) continue;// komplett nach dem Zeitraum + + for(WardRound wardround: cycle.wardrounds){ + for(Checklist checklist: wardround.checklists){ + checklistCounter++ // neuer Patient + if(checklist.drugData == null || checklist.drugData.isEmpty()) continue; // kann nur durch Synchronisationsfehler passieren (unsere Testdaten) + + for(DrugData drugData:checklist.drugData){ + if(drugData == null) continue // kann nur durch Synchronisationsfehler passieren (unsere Testdaten) + if(drugData.intervention != null) { + interventions++ + } + } + } + } + average = interventions/checklistCounter + + output.put(cycleId, average) + average = 0 + interventions = 0 + checklistCounter = 0 + } +// output = output.sort{ a,b -> a.key <=> b.key} // sort by key + + render (getLongTupelList(output) as JSON) + + // Dev Daten:render ([[1,2], [2,3], [3,1], [6,7]] as JSON) + } + + def userDurations(long id){ + def user = User.get(id); + + def i=0 + def output=[] + for(WardRound wardround:WardRound.findAllWhere(createdBy:user)){ + // akzeptiert die direkten Controllerdaten nicht, deshalb /1000 + output.add([wardround.date.time/1000,Math.round(wardround.durationInSeconds/60)]) //minuten sind sinnvoller + } + render (output as JSON) + } + + def private getTupelList(Map<String, Object> map){ + def formatted = []; + for(String key : map.keySet()) formatted.push([key,map.get(key)]) + return formatted; + } + def private getLongTupelList(Map<Long, Object> map){ + def formatted = []; + for(long key : map.keySet()) formatted.push([key,map.get(key)]) + return formatted; + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/UserController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/UserController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..8834ca850e3bb05ab7560e86eef844413746b331 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/UserController.groovy @@ -0,0 +1,212 @@ +package cau.swp.babsi + +import cau.swp.babsi.wardround.WardRound +import grails.converters.JSON +import grails.converters.XML + +import org.apache.shiro.crypto.hash.Sha256Hash +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller UserController: + * + * Managed die Methoden auf User(-objekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class UserController { + + def shiroSecurityService + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + /** + * Gibt formatierte Daten entsprechend der Anfrage zurück + * + * @param max + * @return html or json or xml + */ + def list(Integer max) { + withFormat{ + html { + params.max = Math.min(max ?: 10, 100) + [userInstanceList: User.list(params), userInstanceTotal: User.count()] + } + xml { render User.list(params) as XML } + json { render User.list(params) as JSON } + } + } + + def getJSON(Integer max) { + render User.list(params) as JSON + } + + def create() { + + [userInstance: new User(params)] + } + + def save() { + + // Erstelle neue User-Instanz + def userInstance = new User(username: params.username) + + // Prüfe, ob das eingegebene Passwort und dessen Wiederholung übereinstimmen + if (params.pw1 == params.pw2){ + // speichere Hash des Passworts + userInstance.passwordHash = shiroSecurityService.encodePassword(params.pw1) + } else { + // ggf. zeige wieder das Forumlar mit entsprechender Benachrichtigung + render(view: "create", model: [userInstance: userInstance]) + flash.message = message(code: "user.edit.password.repeat.error") + return + } + + // einzige Benutzerrolle + Role absUserRole = Role.findByName("absUser") + + // füge Rolle zum neuen Benutzer hinzu + userInstance.addToRoles(absUserRole) + + // setzte Benutzernamen + userInstance.username = params.username + + // dann normal weiter und Instanz speichern + if (!userInstance.save(flush: true)) { + render(view: "create", model: [userInstance: userInstance]) + return + } + + flash.message = message(code: 'default.created.message', args: [ + message(code: 'user.label', default: 'User'), + userInstance.id + ]) + redirect(action: "show", id: userInstance.id) + } + + def show(Long id) { + def userInstance = User.get(id) + if (!userInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "list") + return + } + + [userInstance: userInstance] + } + + def edit(Long id) { + def userInstance = User.get(id) + if (!userInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "list") + return + } + + [userInstance: userInstance] + } + + def update(Long id, Long version) { + + + def userInstance = User.get(id) + if (!userInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "list") + return + } + + if (version != null) { + if (userInstance.version > version) { + userInstance.errors.rejectValue("version", "default.optimistic.locking.failure", + [ + message(code: 'user.label', default: 'User')] as Object[], + "Another user has updated this User while you were editing") + render(view: "edit", model: [userInstance: userInstance]) + return + } + } + + // Prüfe, ob das eingegebene Passwort und dessen Wiederholung übereinstimmen + if (params.pw1 == params.pw2){ + // speichere Hash des Passworts + userInstance.passwordHash = shiroSecurityService.encodePassword(params.pw1) + } else { + // ggf. zeige wieder das Forumlar mit entsprechender Benachrichtigung + render(view: "edit", model: [userInstance: userInstance]) + flash.message = message(code: "user.edit.password.repeat.error") + return + } + + // setzte Benutzernamen + userInstance.username = params.username + + // dann normal weiter und Instanz speichern + if (!userInstance.save(flush: true)) { + render(view: "edit", model: [userInstance: userInstance]) + return + } + + flash.message = message(code: 'default.updated.message', args: [ + message(code: 'user.label', default: 'User'), + userInstance.id + ]) + redirect(action: "show", id: userInstance.id) + } + + def delete(Long id) { + def userInstance = User.get(id) + + // prüfe, ob eigener User gelüscht werden soll + if (userInstance.id == session.getAttribute("userID")) { + flash.message = message(code: 'user.delete.active.user') + redirect(action: "list") + return + } + + if (!userInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "list") + return + } + + try { + // setze bei allen Betroffenen Visiten den Benutzer auf null + Collection<WardRound> wardRounds = WardRound.findAllByCreatedBy(userInstance) + wardRounds*.delete() + + userInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [ + message(code: 'user.label', default: 'User'), + id + ]) + redirect(action: "show", id: id) + } + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/AntibioticController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/AntibioticController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..ba1e4d50e969bdce476d51b9b2cb712ac40fef59 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/AntibioticController.groovy @@ -0,0 +1,146 @@ +package cau.swp.babsi.medication + +import grails.converters.JSON +import grails.converters.XML +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller AntibiotiController: + * + * Managed die Methoden auf Antibiotika(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class AntibioticController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.sort="name" + params.order="asc" + params.max = Math.min(max ?: 10, 100) + [antibioticInstanceList: Antibiotic.list(params), antibioticInstanceTotal: Antibiotic.count()] + } + + def getJSON(Integer max) { + + render Antibiotic.list(params) as JSON + } + + def create() { + [antibioticInstance: new Antibiotic(params)] + } + + def save() { + def antibioticInstance = new Antibiotic(params) + if (!antibioticInstance.save(flush: true)) { + render(view: "create", model: [antibioticInstance: antibioticInstance]) + return + } + + flash.message = message(code: 'default.created.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + antibioticInstance.id + ]) + redirect(action: "show", id: antibioticInstance.id) + } + + def show(Long id) { + def antibioticInstance = Antibiotic.get(id) + if (!antibioticInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "list") + return + } + + [antibioticInstance: antibioticInstance] + } + + def edit(Long id) { + def antibioticInstance = Antibiotic.get(id) + if (!antibioticInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "list") + return + } + + [antibioticInstance: antibioticInstance] + } + + def update(Long id, Long version) { + def antibioticInstance = Antibiotic.get(id) + if (!antibioticInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "list") + return + } + + if (version != null) { + if (antibioticInstance.version > version) { + antibioticInstance.errors.rejectValue("version", "default.optimistic.locking.failure", + [ + message(code: 'antibiotic.label', default: 'Antibiotic')] as Object[], + "Another user has updated this Antibiotic while you were editing") + render(view: "edit", model: [antibioticInstance: antibioticInstance]) + return + } + } + + antibioticInstance.properties = params + + if (!antibioticInstance.save(flush: true)) { + render(view: "edit", model: [antibioticInstance: antibioticInstance]) + return + } + + flash.message = message(code: 'default.updated.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + antibioticInstance.id + ]) + redirect(action: "show", id: antibioticInstance.id) + } + + def delete(Long id) { + def antibioticInstance = Antibiotic.get(id) + if (!antibioticInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "list") + return + } + + try { + antibioticInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [ + message(code: 'antibiotic.label', default: 'Antibiotic'), + id + ]) + redirect(action: "show", id: id) + } + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/InterventionTypeController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/InterventionTypeController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..b86da4efdec19fa28b485d0238c628b5bdcef3c5 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/medication/InterventionTypeController.groovy @@ -0,0 +1,146 @@ +package cau.swp.babsi.medication + +import grails.converters.JSON +import grails.converters.XML +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller InterventionTypeController: + * + * Managed die Methoden auf Interventions(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class InterventionTypeController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.sort="name" + params.order="asc" + params.max = Math.min(max ?: 10, 100) + [interventionTypeInstanceList: InterventionType.list(params), interventionTypeInstanceTotal: InterventionType.count()] + } + + def getJSON(Integer max) { + + render InterventionType.list(params) as JSON + } + + def create() { + [interventionTypeInstance: new InterventionType(params)] + } + + def save() { + def interventionTypeInstance = new InterventionType(params) + if (!interventionTypeInstance.save(flush: true)) { + render(view: "create", model: [interventionTypeInstance: interventionTypeInstance]) + return + } + + flash.message = message(code: 'default.created.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + interventionTypeInstance.id + ]) + redirect(action: "show", id: interventionTypeInstance.id) + } + + def show(Long id) { + def interventionTypeInstance = InterventionType.get(id) + if (!interventionTypeInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "list") + return + } + + [interventionTypeInstance: interventionTypeInstance] + } + + def edit(Long id) { + def interventionTypeInstance = InterventionType.get(id) + if (!interventionTypeInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "list") + return + } + + [interventionTypeInstance: interventionTypeInstance] + } + + def update(Long id, Long version) { + def interventionTypeInstance = InterventionType.get(id) + if (!interventionTypeInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "list") + return + } + + if (version != null) { + if (interventionTypeInstance.version > version) { + interventionTypeInstance.errors.rejectValue("version", "default.optimistic.locking.failure", + [ + message(code: 'interventionType.label', default: 'InterventionType')] as Object[], + "Another user has updated this InterventionType while you were editing") + render(view: "edit", model: [interventionTypeInstance: interventionTypeInstance]) + return + } + } + + interventionTypeInstance.properties = params + + if (!interventionTypeInstance.save(flush: true)) { + render(view: "edit", model: [interventionTypeInstance: interventionTypeInstance]) + return + } + + flash.message = message(code: 'default.updated.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + interventionTypeInstance.id + ]) + redirect(action: "show", id: interventionTypeInstance.id) + } + + def delete(Long id) { + def interventionTypeInstance = InterventionType.get(id) + if (!interventionTypeInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "list") + return + } + + try { + interventionTypeInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [ + message(code: 'interventionType.label', default: 'InterventionType'), + id + ]) + redirect(action: "show", id: id) + } + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/ChecklistController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/ChecklistController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..7c72632d4abfb3538e54ed8feba135bafcdf098d --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/ChecklistController.groovy @@ -0,0 +1,452 @@ +package cau.swp.babsi.wardround + +import org.codehaus.groovy.grails.web.json.JSONObject +import org.springframework.dao.DataIntegrityViolationException + +import cau.swp.babsi.Station +import cau.swp.babsi.User +import cau.swp.babsi.medication.Antibiotic +import cau.swp.babsi.medication.ApplicationRate +import cau.swp.babsi.medication.DrugApplicationType +import cau.swp.babsi.medication.DrugData +import cau.swp.babsi.medication.InterventionStatus +import cau.swp.babsi.medication.InterventionType +import cau.swp.babsi.medication.PrescriptionReason +import cau.swp.babsi.medication.Strength + + +/** + * Babsi Controller ChecklistController: + * + * Managed die Methoden auf Checklist(-objekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class ChecklistController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST", consumeAsJSON: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.max = Math.min(max ?: 10, 100) + [checklistInstanceList: Checklist.list(params), checklistInstanceTotal: Checklist.count()] + } + + def show(Long id) { + def checklistInstance = Checklist.get(id) + if (!checklistInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'checklist.label', default: 'Checklist'), + id + ]) + redirect(action: "list") + return + } + + [checklistInstance: checklistInstance] + } + + /** + * Verarbeitet eine von der App als JSON gesendete Checkliste und pflegt diese ins System ein. + */ + def consumeAsJSON = { + + // Das JSON-Objekt aus dem POST-Request + def jsonObject = request.JSON + + println "Incoming Checklist as JSON: " + println jsonObject.toString() + + // Parse Informationen zur Visite + WardRound wardRoundInstance = parseWardRound(jsonObject) + + + // Bereite Checklist-Daten aus JSON vor + + // Patient description + String patientDescription = jsonObject.patientLabel + + // Patient date of birth + Date patientDateOfBirth = new Date(jsonObject.birthday) + + // Patient sex + String patientSex = parsePatientSex(jsonObject.sex) + + // MiBi-Status + int mibiStatusAsInt = jsonObject.microbiology + MiBiStatus mibiStatus = parseMiBiStatus(mibiStatusAsInt) + + // Checklist comment + String checklistComment = jsonObject.notes + + + // Erzeuge entsprechende Checkliste + Checklist checklistInstance = new Checklist(patientDescription: patientDescription, + patientDateOfBirth: patientDateOfBirth, + patientSex: patientSex, + mibiStatus: mibiStatus, + comment: checklistComment) + + + // Bereite Antibiotika-Daten aus JSON vor + + // Antibiotics-Array (Antibiotika von der App) + def antibiotics = jsonObject.antibiotics + + // Antibiotics + // Verarbeite die einzelnen Antibiotics von der App zu entsprechenden DrugData-Objekten + // und füge sie zur Checkliste hinzu. + for(int i = 0; i < antibiotics.size(); i++){ + def antibioticJSON = antibiotics[i] + + DrugData drugDataInstance = parseAntibiotic(antibioticJSON) + + checklistInstance.addToDrugData(drugDataInstance) + } + + // Diagnosis-Array (Infektionen von der App) + def diagnosis = jsonObject.diagnosis + + // Infection + // Verarbeite die einzelnen Infektionsdiagnosen von der App zu Infection-Objekten + // Füge diese der Checkliste hinzu + for(int i = 0; i < diagnosis.size(); i++){ + Infection infectionInstance = parseInfection(diagnosis[i]) + checklistInstance.addToInfections(infectionInstance) + } + + // setze Ward Round für die Checkliste + checklistInstance.wardRound = wardRoundInstance + + // speichere die Checkliste in der DB + checklistInstance.save(flush: true) + + // füge die Checkliste der Visite hinzu + wardRoundInstance.addToChecklists(checklistInstance) + + // Antworte mit Status 200 auf den Request und gib das empfangene JSON-Objekt zurück + response.setStatus(200) + render jsonObject + } + + /** + * Verarbeitet ein von der App als JSON gesendetes Anibiotic-Objekt und gibt ein passendes DrugData-Objekt zurück. + * @param antibioticJSON Von der App gesendetes Antibiotic-Objekt + * @return DrugData-Objekt entsprechend des von der App gesendeten Antiobiotic-Objektes + */ + private DrugData parseAntibiotic(JSONObject antibioticJSON){ + + // Hole die passende Antibiotic-Instanz zum Namen des Antibiotikums von der App-Checkliste + Antibiotic antibioticInstance = parseAntibioticName(antibioticJSON.name) + + // Hole die passende Strength-Instanz zur Dosierung des Antibiotikums von der App-Checkliste + Strength strengthInstance = parseStrength(antibioticJSON.dosage) + + // Hole die passende DrugApplicationType-Instanz zur Verabreichungsart des Antibiotikums von der App-Checkliste + int applicationTypeAsInt = antibioticJSON.applicationType + DrugApplicationType applicationTypeInstance = parseApplicationType(applicationTypeAsInt) + + // Hole die passende ApplicationRate-Instanz zur Verabreichungsrate des Antibiotikums von der App-Checkliste + ApplicationRate applicationRateInstance = parseApplicationRate(antibioticJSON.frequency) + + // Antibiotic duration in days + int antibioticDurationInDays = antibioticJSON.duration + + // Hole die passende InterventionStatus-Instanz zum int-Code von der App-Checkliste + int interventionStatusAsInt = antibioticJSON.acceptance + InterventionStatus interventionStatusInstance = parseInterventionStatus(interventionStatusAsInt) + + // Antibiotic comment + String antibioticComment = antibioticJSON.notes + + // Hole die passende PrescriptionReason zum int-Code von der App-Checkliste + int prescriptionReasonAsInt = antibioticJSON.therapy + PrescriptionReason prescriptionReasonInstance = parsePrescriptionReason(prescriptionReasonAsInt) + + // Hole die passende InterventionType-Instanz zum Interventionstyp von der App-Checkliste + InterventionType interventionTypeInstance = parseInterventionType(antibioticJSON.interventionSuggestion) + + // Erstelle entsprechendes DrugData-Objekt und füge es zur Checkliste hinzu + DrugData drugDataInstance = new DrugData(antibiotic: antibioticInstance, + applicationRate: applicationRateInstance, + strength: strengthInstance, + drugApplicationType: applicationTypeInstance, + durationInDays: antibioticDurationInDays, + prescriptionReason: prescriptionReasonInstance, + intervention: interventionTypeInstance, + interventionStatus: interventionStatusInstance, + comment: antibioticComment) + + return drugDataInstance + } + + /** + * Liefert zu einem Infektionsnamen (Infektionsdiagnose) das passende Infection-Objekt. + * Falls dieses noch nicht im System existiert, wird es erstellt. + * @param infectionNameFromJSON Der Name der Infektion (bzw. Infektionsdiagnose) + * @return Das zum Namen gehörende Infection-Object + */ + private Infection parseInfection(String infectionNameFromJSON){ + + // Suche die Infektion im System + Infection infectionInstance = Infection.findByName(infectionNameFromJSON) + + // Erstelle die Infektion, falls noch nicht im System vorhanden + if(!infectionInstance){ + infectionInstance = new Infection(name: infectionNameFromJSON) + infectionInstance.save() + } + + return infectionInstance + } + + /** + * Liefert zu einem Integer-Code von der App das entsprechende MiBiStatus-Objekt. + * @param mibiStatusAsInt Integer-Code der App für einen MiBi-Status + * @return Das zum Integer-Code passende MiBiStatus-Objekt + */ + private MiBiStatus parseMiBiStatus(int mibiStatusAsInt){ + + MiBiStatus mibiStatus + + // Setzte den MiBi-Status entsprechend des int-Codes + if(mibiStatusAsInt == 0){ + mibiStatus = MiBiStatus.findByName("unklar") + } else if(mibiStatusAsInt == 1){ + mibiStatus = MiBiStatus.findByName("Befund vorhanden") + } else if(mibiStatusAsInt == 2){ + mibiStatus = MiBiStatus.findByName("nicht durchgeführt") + } else if(mibiStatusAsInt == 3){ + mibiStatus = MiBiStatus.findByName("angefordert") + } else{ + throw new Exception("Unknow int-Code for MiBi-Status: " + mibiStatusAsInt) + } + + if(!mibiStatus){ + throw new Exception("MiBi-Status is null, int-Code: " + mibiStatusAsInt) + } + + return mibiStatus + } + + /** + * Liefert zu einem Integer-Code von der App das entsprechende DrugApplicationType-Objekt. + * @param mibiStatusAsInt Integer-Code der App für einen Verabreichungstyp (DrugApplicationType) + * @return Das zum Integer-Code passende DrugApplicationType-Objekt + */ + private DrugApplicationType parseApplicationType(int applicationTypeAsInt){ + + DrugApplicationType applicationTypeInstance + + // Setzte die Verabreichungsart entsprechend des int-Codes + if(applicationTypeAsInt == 0){ + applicationTypeInstance = DrugApplicationType.findByName("oral") + } else if(applicationTypeAsInt == 1){ + applicationTypeInstance = DrugApplicationType.findByName("intravenös") + } else if(applicationTypeAsInt == 2){ + applicationTypeInstance = DrugApplicationType.findByName("inhalativ") + } else { + throw new Exception("Unknow int-Code for DrugApplicationType: " + applicationTypeAsInt) + } + + if(!applicationTypeInstance){ + throw new Exception("DrugApplicationType is null, int-Code: " + applicationTypeAsInt) + } + + return applicationTypeInstance + } + + /** + * Liefert zu einem Integer-Code von der App das entsprechende InterventionStatus-Objekt. + * @param mibiStatusAsInt Integer-Code der App für einen Interventionsstatus (InterventionStatus) + * @return Das zum Integer-Code passende InterventionStatus-Objekt + */ + private InterventionStatus parseInterventionStatus(int interventionStatusAsInt){ + + InterventionStatus interventionStatusInstance + + // Setzte den Interventionsstatus entsprechend des int-Codes + if(interventionStatusAsInt == 0){ + interventionStatusInstance = InterventionStatus.findByDescription("unbekannt") + } else if(interventionStatusAsInt == 1){ + interventionStatusInstance = InterventionStatus.findByDescription("angenommen") + } else if(interventionStatusAsInt == 2){ + interventionStatusInstance = InterventionStatus.findByDescription("abgelehnt") + } else { + throw new Exception("Unknow int-Code for InterventionStatus: " + interventionStatusAsInt) + } + + if(!interventionStatusInstance){ + throw new Exception("InterventionStatus is null, int-Code: " + interventionStatusAsInt) + } + + return interventionStatusInstance + } + + /** + * Liefert zu einem Integer-Code von der App das entsprechende PrescriptionReason-Objekt. + * @param mibiStatusAsInt Integer-Code der App für einen Verschreibungsgrund (PrescriptionReason) + * @return Das zum Integer-Code passende PrescriptionReason-Objekt + */ + private PrescriptionReason parsePrescriptionReason(int prescriptionReasonAsInt){ + + PrescriptionReason prescriptionReasonInstance + + // Setzte den Verschreibungsgrund entsprechend des int-Codes + if(prescriptionReasonAsInt == 0){ + prescriptionReasonInstance = PrescriptionReason.findByName("unbekannt") + } else if(prescriptionReasonAsInt == 1){ + prescriptionReasonInstance = PrescriptionReason.findByName("prophylaktisch") + } else if(prescriptionReasonAsInt == 2){ + prescriptionReasonInstance = PrescriptionReason.findByName("therapeutisch") + } else { + throw new Exception("Unknow int-Code for PrescriptionReason: " + prescriptionReasonAsInt) + } + + if(!prescriptionReasonInstance){ + throw new Exception("PrescriptionReason is null, int-Code: " + prescriptionReasonAsInt) + } + + return prescriptionReasonInstance + } + + /** + * Liefert für eine von der App als JSON gesendete Checkliste das passende WardRound-Objekt (Visite). + * Falls dabei die Vistie im System noch nicht angelegt wurde, wird eine neue Visite angelegt. + * Dabei wird auch der Visitenturnus berücksichtigt und eventuell ein neuer Turnus angelegt. + * @param jsonObject Das von der App gesendete JSON-Objekt (Chekliste) + * @return Das zur Checkliste passende WardRoundObjekt, also die dazugehörige Visite + */ + private WardRound parseWardRound(JSONObject jsonObject){ + + // Bereite WardRound-Daten aus JSON vor + + Date wardRoundDate = new Date(jsonObject.wardRound.date) + + long wardRoundDurationInSeconds = jsonObject.wardRound.durationInSeconds + + // Setze passende Station + Station wardRoundStation = Station.findByName(jsonObject.wardRound.station) + if(!wardRoundStation){ + throw new Exception("Cannot find Station: " + jsonObject.wardRound.station) + } + + // Setze passenden Benutzer + User wardRoundUser = User.findByUsername(jsonObject.wardRound.creator) + if(!wardRoundUser){ + throw new Exception("Cannot find User: " + jsonObject.wardRound.creator) + } + + // Suche existierende WardRound über Datum, Station und Benutzer + WardRound wardRoundInstance = WardRound.findByDateAndStationAndCreatedBy(wardRoundDate, wardRoundStation, wardRoundUser) + + // ... falls nicht gefunden erstelle neue WardRound + if(!wardRoundInstance){ + wardRoundInstance = new WardRound(date: wardRoundDate, createdBy: wardRoundUser, station: wardRoundStation, durationInSeconds: wardRoundDurationInSeconds) + wardRoundInstance.save() + + // Verarbeite die Visite im Turnus + Cycle.addToCurrentCycle(wardRoundInstance); + } + + return wardRoundInstance + } + + /** + * Liefert zu einem Boolean-Code von der App das Geschlecht des Patienten als String. + * @param patientSexAsBoolean Der für das Geschlecht stehende Boolean von der App + * @return Das Geschlecht des Patienten als String entsprechend des Boolean-Codes. + */ + private String parsePatientSex(boolean patientSexAsBoolean){ + + String patientSex = "female" + if(!patientSexAsBoolean) patientSex = "male" + + return patientSex + } + + /** + * Liefert zu einem Namen eines Antibiotikums von der App das passende Antibiotic-Objekt. + * Falls noch kein solches Objekt im System existiert, wird es erstellt. + * @param antibioticNameFromJSON Der Name eines Antibiotikums von der App + * @return Das zum Namen gehörende Antibiotic-Object + */ + private Antibiotic parseAntibioticName(String antibioticNameFromJSON){ + + // Setze pasendes Antibiotikum + Antibiotic antibioticInstance = Antibiotic.findByName(antibioticNameFromJSON) + + // ggf. erstelle neues Antibiotikum + if(!antibioticInstance){ + antibioticInstance = new Antibiotic(name: antibioticNameFromJSON) + antibioticInstance.save() + } + + return antibioticInstance + } + + /** + * Liefert zu einer Dosierung von der App das dazugehörige Strength-Objekt. + * Falls dieses im System noch nicht existiert, wird es erstellt. + * @param strengthFromJSON Die Dosierung von der App + * @return Das entsprechende Strength-Objekt + */ + private Strength parseStrength(String strengthFromJSON){ + + // Setzt passende Dosierung + Strength strengthInstance = Strength.findByStrength(strengthFromJSON) + + // ggf. erstelle neue Dosierung + if(!strengthInstance){ + strengthInstance = new Strength(strength: strengthFromJSON) + strengthInstance.save() + } + + return strengthInstance + } + + /** + * Liefert zu einer Verabreichungsrate von der App das passende ApplicationRate-Objekt. + * Falls dieses noch nicht existiert, wird es erstellt. + * @param applicationRateFromJSON Die Verabreichungsraate von der App + * @return Das dazugehörige ApplicationRate-Objekt + */ + private ApplicationRate parseApplicationRate(String applicationRateFromJSON){ + + // Setze passende Verabreichungsrate + ApplicationRate applicationRateInstance = ApplicationRate.findByRate(applicationRateFromJSON) + + // ggf. erstelle neue Verabreichungsrate + if(!applicationRateInstance){ + applicationRateInstance = new ApplicationRate(rate: applicationRateFromJSON) + applicationRateInstance.save() + } + + return applicationRateInstance + } + + /** + * Liefert zu einem Interventionstyp von der App das passende InterventionType-Objekt. + * Falls das entsorechende Objekt noch nich im System existiert, wird es erstellt. + * @param interventionTypeNameFromJSON Der Interventionstyp von der App + * @return Das entsprechende InterventionType-Objekt + */ + private InterventionType parseInterventionType(String interventionTypeNameFromJSON){ + + // Setze passenden Interventionstyp + InterventionType interventionTypeInstance = InterventionType.findByName(interventionTypeNameFromJSON) + + // ggf. erstelle neuen Interventionstyp + if(!interventionTypeInstance){ + interventionTypeInstance = new InterventionType(name: interventionTypeNameFromJSON) + interventionTypeInstance.save() + } + + return interventionTypeInstance + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/CycleController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/CycleController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..b2ec0da1e907de40adce123fd0501126e9540ddb --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/CycleController.groovy @@ -0,0 +1,44 @@ +package cau.swp.babsi.wardround + +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller CycleController: + * + * Managed die Methoden auf Turnus(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class CycleController { + + + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.max = Math.min(max ?: 10, 100) + if(!params.containsKey("order")) params.order = "desc"; + [cycleInstanceList: Cycle.list(params), cycleInstanceTotal: Cycle.count()] + } + + def show(Long id) { + def cycleInstance = Cycle.get(id) + if (!cycleInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'cycle.label', default: 'Cycle'), + id + ]) + redirect(action: "list") + return + } + + [cycleInstance: cycleInstance] + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/InfectionController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/InfectionController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..f32db48b54def5b8c251e65c224f4abcafb87517 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/InfectionController.groovy @@ -0,0 +1,146 @@ +package cau.swp.babsi.wardround + +import grails.converters.JSON +import grails.converters.XML +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller InfectionController: + * + * Managed die Methoden auf Infektion(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class InfectionController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.sort="name" + params.order="asc" + params.max = Math.min(max ?: 10, 100) + [infectionInstanceList: Infection.list(params), infectionInstanceTotal: Infection.count()] + } + + def getJSON(Integer max) { + + render Infection.list(params) as JSON + } + + def create() { + [infectionInstance: new Infection(params)] + } + + def save() { + def infectionInstance = new Infection(params) + if (!infectionInstance.save(flush: true)) { + render(view: "create", model: [infectionInstance: infectionInstance]) + return + } + + flash.message = message(code: 'default.created.message', args: [ + message(code: 'infection.label', default: 'Infection'), + infectionInstance.id + ]) + redirect(action: "show", id: infectionInstance.id) + } + + def show(Long id) { + def infectionInstance = Infection.get(id) + if (!infectionInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "list") + return + } + + [infectionInstance: infectionInstance] + } + + def edit(Long id) { + def infectionInstance = Infection.get(id) + if (!infectionInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "list") + return + } + + [infectionInstance: infectionInstance] + } + + def update(Long id, Long version) { + def infectionInstance = Infection.get(id) + if (!infectionInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "list") + return + } + + if (version != null) { + if (infectionInstance.version > version) { + infectionInstance.errors.rejectValue("version", "default.optimistic.locking.failure", + [ + message(code: 'infection.label', default: 'Infection')] as Object[], + "Another user has updated this Infection while you were editing") + render(view: "edit", model: [infectionInstance: infectionInstance]) + return + } + } + + infectionInstance.properties = params + + if (!infectionInstance.save(flush: true)) { + render(view: "edit", model: [infectionInstance: infectionInstance]) + return + } + + flash.message = message(code: 'default.updated.message', args: [ + message(code: 'infection.label', default: 'Infection'), + infectionInstance.id + ]) + redirect(action: "show", id: infectionInstance.id) + } + + def delete(Long id) { + def infectionInstance = Infection.get(id) + if (!infectionInstance) { + flash.message = message(code: 'default.not.found.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "list") + return + } + + try { + infectionInstance.delete(flush: true) + flash.message = message(code: 'default.deleted.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "list") + } + catch (DataIntegrityViolationException e) { + flash.message = message(code: 'default.not.deleted.message', args: [ + message(code: 'infection.label', default: 'Infection'), + id + ]) + redirect(action: "show", id: id) + } + } +} diff --git a/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/WardRoundController.groovy b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/WardRoundController.groovy new file mode 100644 index 0000000000000000000000000000000000000000..20ef359b264f58fd7725d531a47df2c8da13431c --- /dev/null +++ b/babsi/BabsiWeb/grails-app/controllers/cau/swp/babsi/wardround/WardRoundController.groovy @@ -0,0 +1,38 @@ +package cau.swp.babsi.wardround + +import org.springframework.dao.DataIntegrityViolationException + + +/** + * Babsi Controller WardRoundController: + * + * Managed die Methoden auf Visiten(-sobjekten) + * + * @package cau.swp.babsi + * @author Babsi Team + */ + +class WardRoundController { + + static allowedMethods = [save: "POST", update: "POST", delete: "POST"] + + def index() { + redirect(action: "list", params: params) + } + + def list(Integer max) { + params.max = Math.min(max ?: 10, 100) + [wardRoundInstanceList: WardRound.list(params), wardRoundInstanceTotal: WardRound.count()] + } + + def show(Long id) { + def wardRoundInstance = WardRound.get(id) + if (!wardRoundInstance) { + flash.message = message(code: 'default.not.found.message', args: [message(code: 'wardRound.label', default: 'WardRound'), id]) + redirect(action: "list") + return + } + + [wardRoundInstance: wardRoundInstance] + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Role.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Role.groovy new file mode 100644 index 0000000000000000000000000000000000000000..cc342166597c3ee2383cff4fd032abc1449d9dfd --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Role.groovy @@ -0,0 +1,22 @@ +package cau.swp.babsi +/** + * Babsi Domainklasse Role: + * + * Eine Rolle für einen Benutzer gibt ihm bestimmte Berechtigungen + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ +class Role { + + String name + + static hasMany = [ users: User, permissions: String ] + + static belongsTo = User + + static constraints = { + name(unique: true, length:1..100, matches:/[a-zA-Z0-9üöäÜÖÄ]+/) + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Station.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Station.groovy new file mode 100644 index 0000000000000000000000000000000000000000..bed34422484dabd31d0304c77e5a76054673eef4 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/Station.groovy @@ -0,0 +1,31 @@ +package cau.swp.babsi + +import cau.swp.babsi.wardround.WardRound + +/** + * Babsi Domainklasse Station: + * + * Eine Station beherbergt Patienten, die während einer Visite besucht werden. + * + * @package cau.swp.babsi + * @author Babsi Team + * @params name + * @see WardRound + */ + +class Station { + + String name; + + static hasMany = [wardrounds: WardRound] + + + + static constraints = { + name(unique: true, size:3..80, matches:/[a-zA-Z0-9öüäÖÜÄ ]+/) + } + + String toString(){ + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/User.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/User.groovy new file mode 100644 index 0000000000000000000000000000000000000000..68862d87d2dac13a0af61ad3d894064c10de7c48 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/User.groovy @@ -0,0 +1,30 @@ +package cau.swp.babsi + +/** + * Babsi Domainklasse User: + * + * Benutzer loggen sich mit Benutzerdaten ein und führen Visiten und andere Tätigkeiten entsprechend ihren - + * durch ihre Rolle erhaltenen - Berechtigungen durch. + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: username, passwordHash + * @see Role + */ + +class User { + String username + String passwordHash + + static hasMany = [ roles: Role, permissions: String ] + + static constraints = { + username(unique: true, length:1..100, matches:/[a-zA-Z0-9öüäÖÜÄ]+/) + passwordHash(blank: false, matches:/[a-z0-9]+/) + } + + @Override + public String toString() { + return username + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Antibiotic.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Antibiotic.groovy new file mode 100644 index 0000000000000000000000000000000000000000..f08152963077ef6785fc265e82339c8cdfe491db --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Antibiotic.groovy @@ -0,0 +1,24 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse Antibiotic: + * + * Ein Antibiotikum mit einem Namen + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ + +class Antibiotic { + + String name + + static constraints = { + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/ApplicationRate.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/ApplicationRate.groovy new file mode 100644 index 0000000000000000000000000000000000000000..064243adb6d2c3a856291241241de1402d7b2771 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/ApplicationRate.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse ApplicationRate: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: rate + */ + +class ApplicationRate { + + String rate + + static constraints = { + } + + @Override + public String toString() { + return rate; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugApplicationType.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugApplicationType.groovy new file mode 100644 index 0000000000000000000000000000000000000000..976eb63991f74bffd24e7b765f47f12ed37d3278 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugApplicationType.groovy @@ -0,0 +1,24 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse DrugApplicationType: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ + +class DrugApplicationType { + + String name + + static constraints = { + + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugData.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugData.groovy new file mode 100644 index 0000000000000000000000000000000000000000..063762eefe5a75b3dc37ea201f27288115de33f3 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/DrugData.groovy @@ -0,0 +1,62 @@ +package cau.swp.babsi.medication + +import org.apache.commons.lang.StringEscapeUtils; + +/** + * Babsi Domainklasse DrugData: + * + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: comment, + * antibiotic : Name des Antibiotikums gemäß Liste, aber ohne "iv"/"oral", s.u. + * prescriptionReason : Grund für die Verschreibung der Medikation + * drugApplicationType : Art der Verabreichung, also "iv" oder "oral" + * strength : Stärke gemäß Liste, z.B. "100mg" oder "körpergewichtsadaptiert" + * applicationRate : Anwendungsrate gemäß Liste, z.b. "3x pro Tag" + * durationInDays : Anwendungsdauer in Tagen + * intervention : Intervention bezüglich dieses Antibiotikums mit Typ und Kommentar + * interventionStatus : Rückmeldung des behandelnden Arztes bezüglich dieser Intervention s.o. + * + * @see Antibiotic + * @see DrugApplicationType + * @see ApplicationRate + * @see InterventionStatus + * @see InterventionType + * @see PrescriptionReason + * @see Strength + */ + +class DrugData { + + String comment + + Antibiotic antibiotic + PrescriptionReason prescriptionReason + DrugApplicationType drugApplicationType + Strength strength + ApplicationRate applicationRate + int durationInDays + InterventionType intervention + InterventionStatus interventionStatus + + + + static constraints = { + } + + @Override + public String toString() { + return antibiotic.toString(); + } + + String toCSV() { + return ("\"" + StringEscapeUtils.escapeJava(antibiotic.toString()) + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(drugApplicationType.toString()) + "\"" + + ";" + "\"" + StringEscapeUtils.escapeJava(strength.toString()) + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(applicationRate.toString()) + "\"" + + ";" + "\"" + StringEscapeUtils.escapeJava(durationInDays.toString()) + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(intervention.name) + "\"" + + ";" + "\"" + StringEscapeUtils.escapeJava(interventionStatus.toString()) + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(comment) + "\"") + + + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionStatus.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionStatus.groovy new file mode 100644 index 0000000000000000000000000000000000000000..caba6685e24e66cbb241d579e76fb9a297ba75a1 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionStatus.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse InterventionStatus: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: description + */ + +class InterventionStatus { + + String description + + static constraints = { + } + + @Override + public String toString() { + return description; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionType.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionType.groovy new file mode 100644 index 0000000000000000000000000000000000000000..380b89146c64ff11c50007d8aa092268af260926 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/InterventionType.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse InterventionType: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ + +class InterventionType { + + String name + + static constraints = { + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/PrescriptionReason.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/PrescriptionReason.groovy new file mode 100644 index 0000000000000000000000000000000000000000..6cfc2643207079dcf0d701b999dde381b3700781 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/PrescriptionReason.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse PrescriptionReason: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ + +class PrescriptionReason { + + String name; + + static constraints = { + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Strength.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Strength.groovy new file mode 100644 index 0000000000000000000000000000000000000000..ba32fb874300b2ce1c33e04f52a46ce0a80110d0 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/medication/Strength.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + +/** + * Babsi Domainklasse Strentgh: + * + * + * @package cau.swp.babsi + * @author Babsi Team + * @params: name + */ + +class Strength { + + String strength + + static constraints = { + } + + @Override + public String toString() { + return strength; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Checklist.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Checklist.groovy new file mode 100644 index 0000000000000000000000000000000000000000..65b56d9636f32810a0424c15e72ed61eb485a9b9 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Checklist.groovy @@ -0,0 +1,80 @@ +package cau.swp.babsi.wardround + +import java.text.DateFormat +import java.text.SimpleDateFormat + +import org.apache.commons.lang.StringEscapeUtils + +import cau.swp.babsi.medication.DrugData + +/** + * Babsi Domainklasse Checklist: + * + * Beinhaltet alle Daten einer typischen ABS Checkliste + * + * @package cau.swp.babsi + * @author Babsi Team + * @params patientDescription : + * patientDateOfBirth : + * patientSex : + * mibiStatus : Status der Probe für die MiBi + * comment : allgemeiner Freitextkommentar für diese Checkliste + * @see DrugData + * @see Infection + */ + + +class Checklist { + + // Patient + String patientDescription + Date patientDateOfBirth + String patientSex + + MiBiStatus mibiStatus + String comment + + static hasMany = [drugData: DrugData, infections: Infection] // Infektionsdiagnosen und verabreichte Antibiotika + + static belongsTo = [wardRound: WardRound] // Visite in deren Rahmen diese Checkliste ausgefüllt wurde + + static constraints = { + infections(nullable: true) + drugData(nullable: true) + //constraints für drugData und infections .size() != 5 ?? + } + + String toString(){ + SimpleDateFormat dt = new SimpleDateFormat("dd.mm.yyyy") + return patientDescription +" "+ dt.format(patientDateOfBirth) + " "+ patientSex + + } + + + String toCSV() { + String drugDataTwo = ""//helper for getting all strings in csv from list drugData + for (int i = 0; i < 5; i++) { //(at most 5) + if ( i != drugData.size() && !(i > drugData.size())) { + drugDataTwo += (drugData.toList().get(i).toCSV() + ";"); //going through all objects from list + } + else { + drugDataTwo += (";;;;;;;;") + } + } + //helper for getting all strings in csv from list infections + String infectionList = "" //helper for getting all strings in csv from list infections + for (int i = 0; i < 5; i++) { //(at most 5) + if (i != infections.size() && !(i > infections.size())) { + infectionList += ("\"" + StringEscapeUtils.escapeJava(infections.toList().get(i).toString()) + "\"" + ";"); //same as for-loop before + } + else { + infectionList += ";"; + } + } + return ("\"" + StringEscapeUtils.escapeJava(wardRound.station.toString()) + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(wardRound.date.toString()) + + "\"" + ";" + "\"" + StringEscapeUtils.escapeJava(patientDescription) + "\"" + ";" + "\"" +StringEscapeUtils.escapeJava(patientDateOfBirth.toString()) + "\"" + + ";" + "\"" + patientSex + "\"" + ";" + "\"" + mibiStatus.toString() + "\"" + ";" + "\"" + + StringEscapeUtils.escapeJava(comment) + "\"" + ";" + drugDataTwo + infectionList + "\n") + } + +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Cycle.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Cycle.groovy new file mode 100644 index 0000000000000000000000000000000000000000..03443e6dd138a849e7b832f55b43e817e72bb63d --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Cycle.groovy @@ -0,0 +1,77 @@ +package cau.swp.babsi.wardround + +import cau.swp.babsi.Station +import cau.swp.babsi.wardround.WardRound +import java.text.SimpleDateFormat + +/** + * Babsi Domainklasse Cycle: + * + * Beinhaltet alle Checklisten eines Turnus + * + * @package cau.swp.babsi + * @author Babsi Team + * @params beginDate + * endDate + * @see WardRound + */ + +class Cycle { + + Date beginDate + Date endDate + + static hasMany = [wardrounds: WardRound] + + static constraints = { + beginDate(nullable:false) + endDate(nullable: true) + wardrounds(nullable: false) + } + + @Override + public String toString() { + + SimpleDateFormat dt = new SimpleDateFormat("dd.mm.yyyy") + + return dt.format(beginDate) + " - " + dt.format(endDate) + } + + /** + * prüft, ob ein Zyklus abgeschlossen ist. + * Dies ist erfüllt, sobald für jede Station eine Visite hinterlegt ist. + * @return + */ + def boolean isComplete() { + + def stations = new HashSet<Station>(); + + for(WardRound wardround:wardrounds){ + stations.add(wardround.station) + } + + stations.containsAll(Station.getAll()) + } + + /** + * Sortiert eine Visite automatisch den nötigen Visitenzyklus ein. + * Wenn für alle Stationen eine Visite im aktuellsten Zyklus hinterlegt wurde, beginnt eine neue. + * @param wardround + * + */ + static public void addToCurrentCycle(WardRound wardround){ + def current = Cycle.last(); + if(current == null || current.endDate != null){ + current = new Cycle(beginDate: wardround.date); + } + current.addToWardrounds(wardround) + + if(current.isComplete()){ // fehlte nur noch diese eine Visite? + // Ende wird auf "ca." nach Abschluss der Visite gesetzt, dabei werden Pausen der Visite missachtet + current.endDate = new Date(wardround.date.time + (wardround.durationInSeconds*1000)); + } + current.save() + + } + +} \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Infection.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Infection.groovy new file mode 100644 index 0000000000000000000000000000000000000000..697f684285bf1870f4d52d485265b7c94d5dc57e --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/Infection.groovy @@ -0,0 +1,24 @@ +package cau.swp.babsi.wardround + +/** + * Babsi Domainklasse Infection: + * + * Speichert eine Infection mit ihrem Namen + * + * @package cau.swp.babsi + * @author Babsi Team + * @params name + */ + +class Infection { + + String name + + static constraints = { + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/MiBiStatus.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/MiBiStatus.groovy new file mode 100644 index 0000000000000000000000000000000000000000..df19284bde43ab812f5b8a929638fc114e1a6639 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/MiBiStatus.groovy @@ -0,0 +1,24 @@ +package cau.swp.babsi.wardround + +/** + * Babsi Domainklasse MiBiStatus: + * + * Speichert den Status der Microbiologie mit ihrem Namen + * + * @package cau.swp.babsi + * @author Babsi Team + * @params name + */ + +class MiBiStatus { + + String name + + static constraints = { + } + + @Override + public String toString() { + return name; + } +} diff --git a/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/WardRound.groovy b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/WardRound.groovy new file mode 100644 index 0000000000000000000000000000000000000000..909b03177b731bcfcd97218b888de996da7ef20d --- /dev/null +++ b/babsi/BabsiWeb/grails-app/domain/cau/swp/babsi/wardround/WardRound.groovy @@ -0,0 +1,40 @@ +package cau.swp.babsi.wardround + +import java.text.SimpleDateFormat + +import cau.swp.babsi.Station +import cau.swp.babsi.User + +/** + * Babsi Domainklasse WardRound: + * + * Speichert eine Visite mit allen Daten + * + * @package cau.swp.babsi + * @author Babsi Team + * @params date + * durationInSeconds + * createdBy + * @see Checklist + */ + +class WardRound { + + Date date + long durationInSeconds + User createdBy + + static hasMany = [checklists: Checklist] + + static belongsTo = [station: Station] + + static constraints = { + createdBy(nullable: true) + } + + @Override + public String toString() { + SimpleDateFormat dt = new SimpleDateFormat("dd.mm.yyyy") + return dt.format(date) + " " + station.toString(); + } +} diff --git a/babsi/BabsiWeb/grails-app/i18n/messages.properties b/babsi/BabsiWeb/grails-app/i18n/messages.properties new file mode 100644 index 0000000000000000000000000000000000000000..26e1484d195f3ee33415c4b4c3186d3d292eb962 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages.properties @@ -0,0 +1,69 @@ +default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}] +default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL +default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number +default.invalid.email.message=Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address +default.invalid.range.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid range from [{3}] to [{4}] +default.invalid.size.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid size range from [{3}] to [{4}] +default.invalid.max.message=Property [{0}] of class [{1}] with value [{2}] exceeds maximum value [{3}] +default.invalid.min.message=Property [{0}] of class [{1}] with value [{2}] is less than minimum value [{3}] +default.invalid.max.size.message=Property [{0}] of class [{1}] with value [{2}] exceeds the maximum size of [{3}] +default.invalid.min.size.message=Property [{0}] of class [{1}] with value [{2}] is less than the minimum size of [{3}] +default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation +default.not.inlist.message=Property [{0}] of class [{1}] with value [{2}] is not contained within the list [{3}] +default.blank.message=Property [{0}] of class [{1}] cannot be blank +default.not.equal.message=Property [{0}] of class [{1}] with value [{2}] cannot equal [{3}] +default.null.message=Property [{0}] of class [{1}] cannot be null +default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must be unique + +default.paginate.prev=Previous +default.paginate.next=Next +default.boolean.true=True +default.boolean.false=False +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} created +default.updated.message={0} {1} updated +default.deleted.message={0} {1} deleted +default.not.deleted.message={0} {1} could not be deleted +default.not.found.message={0} not found with id {1} +default.optimistic.locking.failure=Another user has updated this {0} while you were editing + +default.home.label=Home +default.list.label={0} List +default.add.label=Add {0} +default.new.label=New {0} +default.create.label=Create {0} +default.show.label=Show {0} +default.edit.label=Edit {0} + +default.button.create.label=Create +default.button.edit.label=Edit +default.button.update.label=Update +default.button.delete.label=Delete +default.button.delete.confirm.message=Are you sure? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Property {0} must be a valid URL +typeMismatch.java.net.URI=Property {0} must be a valid URI +typeMismatch.java.util.Date=Property {0} must be a valid Date +typeMismatch.java.lang.Double=Property {0} must be a valid number +typeMismatch.java.lang.Integer=Property {0} must be a valid number +typeMismatch.java.lang.Long=Property {0} must be a valid number +typeMismatch.java.lang.Short=Property {0} must be a valid number +typeMismatch.java.math.BigDecimal=Property {0} must be a valid number +typeMismatch.java.math.BigInteger=Property {0} must be a valid number + + + +# Custom Babsi +nav.login=Login +nav.logout=Logout +nav.edituserdata=Edit own userdata +nav.app.data.index=Export +nav.app.data=Export + +user.delete.active.user=Cannot delete active user! +user.edit.password.repeat.error=New password and repeated password are not the same! + +wardRound.durationInSeconds.label=Duration in minutes diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_cs_CZ.properties b/babsi/BabsiWeb/grails-app/i18n/messages_cs_CZ.properties new file mode 100644 index 0000000000000000000000000000000000000000..c617dca035a4491a3bb027aa7a95067ba91210ac --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_cs_CZ.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] neodpovÃdá požadovanému vzoru [{3}] +default.invalid.url.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà validnà URL +default.invalid.creditCard.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà validnà ÄÃslo kreditnà karty +default.invalid.email.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà validnà emailová adresa +default.invalid.range.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà v povoleném rozmezà od [{3}] do [{4}] +default.invalid.size.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà v povoleném rozmezà od [{3}] do [{4}] +default.invalid.max.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] pÅ™ekraÄuje maximálnà povolenou hodnotu [{3}] +default.invalid.min.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] je menÅ¡Ã než minimálnà povolená hodnota [{3}] +default.invalid.max.size.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] pÅ™ekraÄuje maximálnà velikost [{3}] +default.invalid.min.size.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] je menÅ¡Ã než minimálnà velikost [{3}] +default.invalid.validator.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] neproÅ¡la validacà +default.not.inlist.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nenà obsažena v seznamu [{3}] +default.blank.message=Položka [{0}] tÅ™Ãdy [{1}] nemůže být prázdná +default.not.equal.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] nemůže být stejná jako [{3}] +default.null.message=Položka [{0}] tÅ™Ãdy [{1}] nemůže být prázdná +default.not.unique.message=Položka [{0}] tÅ™Ãdy [{1}] o hodnotÄ› [{2}] musà být unikátnà + +default.paginate.prev=PÅ™edcházejÃcà +default.paginate.next=NásledujÃcà +default.boolean.true=Pravda +default.boolean.false=Nepravda +default.date.format=dd. MM. yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} vytvoÅ™eno +default.updated.message={0} {1} aktualizováno +default.deleted.message={0} {1} smazáno +default.not.deleted.message={0} {1} nelze smazat +default.not.found.message={0} nenalezen s id {1} +default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právÄ› když byl vámi editován + +default.home.label=Domů +default.list.label={0} Seznam +default.add.label=PÅ™idat {0} +default.new.label=Nový {0} +default.create.label=VytvoÅ™it {0} +default.show.label=Ukázat {0} +default.edit.label=Editovat {0} + +default.button.create.label=VytvoÅ™ +default.button.edit.label=Edituj +default.button.update.label=Aktualizuj +default.button.delete.label=Smaž +default.button.delete.confirm.message=Jste si jistý? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Položka {0} musà být validnà URL +typeMismatch.java.net.URI=Položka {0} musà být validnà URI +typeMismatch.java.util.Date=Položka {0} musà být validnà datum +typeMismatch.java.lang.Double=Položka {0} musà být validnà desetinné ÄÃslo +typeMismatch.java.lang.Integer=Položka {0} musà být validnà ÄÃslo +typeMismatch.java.lang.Long=Položka {0} musà být validnà ÄÃslo +typeMismatch.java.lang.Short=Položka {0} musà být validnà ÄÃslo +typeMismatch.java.math.BigDecimal=Položka {0} musà být validnà ÄÃslo +typeMismatch.java.math.BigInteger=Položka {0} musà být validnà ÄÃslo \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_da.properties b/babsi/BabsiWeb/grails-app/i18n/messages_da.properties new file mode 100644 index 0000000000000000000000000000000000000000..858b22903cfa750b226164c17a558f49ea5fdcb0 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_da.properties @@ -0,0 +1,56 @@ +default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}] +default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL +default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer +default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse +default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}] +default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}] +default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}] +default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}] +default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse pÃ¥ [{3}] +default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse pÃ¥ [{3}] +default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering +default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}] +default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom +default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] mÃ¥ ikke være [{3}] +default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null +default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik + +default.paginate.prev=Forrige +default.paginate.next=Næste +default.boolean.true=Sand +default.boolean.false=Falsk +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} oprettet +default.updated.message={0} {1} opdateret +default.deleted.message={0} {1} slettet +default.not.deleted.message={0} {1} kunne ikke slettes +default.not.found.message={0} med id {1} er ikke fundet +default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser + +default.home.label=Hjem +default.list.label={0} Liste +default.add.label=Tilføj {0} +default.new.label=Ny {0} +default.create.label=Opret {0} +default.show.label=Vis {0} +default.edit.label=Ret {0} + +default.button.create.label=Opret +default.button.edit.label=Ret +default.button.update.label=Opdater +default.button.delete.label=Slet +default.button.delete.confirm.message=Er du sikker? + +# Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author) +typeMismatch.java.net.URL=Feltet {0} skal være en valid URL +typeMismatch.java.net.URI=Feltet {0} skal være en valid URI +typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato +typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal +typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal +typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal + diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_de.properties b/babsi/BabsiWeb/grails-app/i18n/messages_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..3f1d70dc988dbb0788e4f93d7620ce2b2e84fd51 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_de.properties @@ -0,0 +1,127 @@ +default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] +default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL +default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer +default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse +default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] +default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] +default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] +default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] +default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig +default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. +default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein +default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein +default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein +default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen + +default.paginate.prev=Vorherige +default.paginate.next=Nächste +default.boolean.true=Wahr +default.boolean.false=Falsch +default.date.format=dd.MM.yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} wurde angelegt +default.updated.message={0} {1} wurde geändert +default.deleted.message={0} {1} wurde gelöscht +default.not.deleted.message={0} {1} konnte nicht gelöscht werden +default.not.found.message={0} mit der id {1} wurde nicht gefunden +default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben + +default.home.label=Home +default.list.label={0} Ãœbersicht +default.add.label={0} hinzufügen +default.new.label={0} anlegen +default.create.label={0} anlegen +default.show.label={0} anzeigen +default.edit.label={0} bearbeiten + +default.button.create.label=Anlegen +default.button.edit.label=Bearbeiten +default.button.update.label=Aktualisieren +default.button.delete.label=Löschen +default.button.delete.confirm.message=Sind Sie sicher? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein +typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein +typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein +typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein + +# Custom Babsi +nav.login=Anmelden +nav.logout=Abmelden +nav.edituserdata=Eigene Daten ändern +nav.app.data=Export +nav.app.statistic=Statistiken +nav.app.cycle=Visitenturnus +nav.app.wardRound=Visiten +nav.app.user=Benutzer +nav.app.station=Stationen +nav.app.antibiotic=Antibiotika +nav.app.interventionType=Interventionen +nav.app.checklist=Checklisten +nav.app.infection=Infektionen +data.label=Export +default.home.label=Dashboard +checklist.label=Checklisten +antibiotic.label=Antibiotika +statistic.label=Statistiken +interventionType.label=Interventionen +cycle.label=Visitenturnus +station.label=Stationen +infection.label=Infektionen +wardRound.label=Visiten +user.label=Benutzer +data.export.checklists=Checklisten Exportieren + +# Benutzerverwaltung +user.username.label=Benutzername +user.password.label=Passwort +user.newpassword.label=Neues Passwort +user.newpassword.repeat=Passwort wiederholen +user.delete.active.user=Der aktive Benutzer kann nicht gelöscht werden! +user.edit.password.repeat.error=Das neue Passwort und die wiederholte Eingabe stimmen nicht überein! + + +#Checklist +checklist.patientDateOfBirth.label=Geburtstag +checklist.patientSex.label=Geschlecht +checklist.patientSex.male=männlich +checklist.patientSex.female=weiblich +checklist.drugData.label= Antibiotika Nr. {0} +checklist.drugData.reason.label=Diagnose +checklist.drugData.type.label=Anwendung +checklist.drugData.duration.label=Dauer +checklist.drugData.strength.label=Stärke +checklist.drugData.rate.label=Dosis +checklist.drugData.intervention.label=Intervention +checklist.drugData.interventionstatus.label=Interventionsstatus + + +# Statistiken +statistics.nodata=Keine Daten gefunden +statistics.selectTime=Zeitraum wählen +statistics.loading=Lade Daten... +statistics.statistic1.ylabel=Häufigkeit +statistics.statistic1.xlabel=getroffene Interventionen +statistics.statistic2.ylabel=Interventions-Durchschnitt +statistics.statistic2.xlabel=Visitenturnus Nr. +statistics.statistic3.ylabel=Visitendauer +statistics.statistic3.xlabel=Visite + +# Turnus +cycle.endDate.doesNotExist=Turnus läuft noch +cycle.id.label=Nr. + +# Visite +wardRound.durationInSeconds.label=Dauer in Minuten +wardRound.createdBy.label=Erstellt von +wardRound.date.label=Datum +wardRound.checklists.label=Checklisten diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_es.properties b/babsi/BabsiWeb/grails-app/i18n/messages_es.properties new file mode 100644 index 0000000000000000000000000000000000000000..f0ede539685ea6464e57e758bf1d25eea48427cd --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_es.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] +default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida +default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida +default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida +default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] +default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] +default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] +default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mÃnimo [{3}] +default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] +default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mÃnimo de [{3}] +default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido +default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] +default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacÃa +default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] +default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo +default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única + +default.paginate.prev=Anterior +default.paginate.next=Siguiente +default.boolean.true=Verdadero +default.boolean.false=Falso +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} creado +default.updated.message={0} {1} actualizado +default.deleted.message={0} {1} eliminado +default.not.deleted.message={0} {1} no puede eliminarse +default.not.found.message=No se encuentra {0} con id {1} +default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0} + +default.home.label=Principal +default.list.label={0} Lista +default.add.label=Agregar {0} +default.new.label=Nuevo {0} +default.create.label=Crear {0} +default.show.label=Mostrar {0} +default.edit.label=Editar {0} + +default.button.create.label=Crear +default.button.edit.label=Editar +default.button.update.label=Actualizar +default.button.delete.label=Eliminar +default.button.delete.confirm.message=¿Está usted seguro? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida +typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida +typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida +typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido +typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido +typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_fr.properties b/babsi/BabsiWeb/grails-app/i18n/messages_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b1d665c3181e4a36a1b2c5d8dbfe3165e2346a50 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_fr.properties @@ -0,0 +1,19 @@ +default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] +default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide +default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide +default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide +default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide +default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] +default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide +default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] +default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle +default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique + +default.paginate.prev=Précédent +default.paginate.next=Suivant diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_it.properties b/babsi/BabsiWeb/grails-app/i18n/messages_it.properties new file mode 100644 index 0000000000000000000000000000000000000000..462ec1c2a4c014b2ef15cdcefa760d5bc18baa48 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_it.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] +default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido +default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido +default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido +default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] +default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] +default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida +default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] +default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota +default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] +default.null.message=La proprietà [{0}] della classe [{1}] non può essere null +default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica + +default.paginate.prev=Precedente +default.paginate.next=Successivo +default.boolean.true=Vero +default.boolean.false=Falso +default.date.format=dd/MM/yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} creato +default.updated.message={0} {1} aggiornato +default.deleted.message={0} {1} eliminato +default.not.deleted.message={0} {1} non può essere eliminato +default.not.found.message={0} non trovato con id {1} +default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica + +default.home.label=Home +default.list.label={0} Elenco +default.add.label=Aggiungi {0} +default.new.label=Nuovo {0} +default.create.label=Crea {0} +default.show.label=Mostra {0} +default.edit.label=Modifica {0} + +default.button.create.label=Crea +default.button.edit.label=Modifica +default.button.update.label=Aggiorna +default.button.delete.label=Elimina +default.button.delete.confirm.message=Si è sicuri? + +# Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) +typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido +typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido +typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida +typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_ja.properties b/babsi/BabsiWeb/grails-app/i18n/messages_ja.properties new file mode 100644 index 0000000000000000000000000000000000000000..b5e4d18af2e5aacee3696b990f7b1fb39b123c28 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_ja.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€[{3}]パターンã¨ä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“。 +default.invalid.url.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ‰åŠ¹ãªURLã§ã¯ã‚ã‚Šã¾ã›ã‚“。 +default.invalid.creditCard.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ‰åŠ¹ãªã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚«ãƒ¼ãƒ‰ç•ªå·ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 +default.invalid.email.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 +default.invalid.range.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€[{3}]ã‹ã‚‰[{4}]範囲内を指定ã—ã¦ãã ã•ã„。 +default.invalid.size.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€[{3}]ã‹ã‚‰[{4}]以内を指定ã—ã¦ãã ã•ã„。 +default.invalid.max.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ€å¤§å€¤[{3}]より大ãã„ã§ã™ã€‚ +default.invalid.min.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ€å°å€¤[{3}]よりå°ã•ã„ã§ã™ã€‚ +default.invalid.max.size.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ€å¤§å€¤[{3}]より大ãã„ã§ã™ã€‚ +default.invalid.min.size.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€æœ€å°å€¤[{3}]よりå°ã•ã„ã§ã™ã€‚ +default.invalid.validator.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€ã‚«ã‚¹ã‚¿ãƒ ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’通éŽã§ãã¾ã›ã‚“。 +default.not.inlist.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€[{3}]リスト内ã«å˜åœ¨ã—ã¾ã›ã‚“。 +default.blank.message=[{1}]クラスã®ãƒ—ãƒãƒ‘ティ[{0}]ã®ç©ºç™½ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。 +default.not.equal.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯ã€[{3}]ã¨åŒç‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 +default.null.message=[{1}]クラスã®ãƒ—ãƒãƒ‘ティ[{0}]ã«nullã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。 +default.not.unique.message=クラス[{1}]プãƒãƒ‘ティ[{0}]ã®å€¤[{2}]ã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ + +default.paginate.prev=戻る +default.paginate.next=次㸠+default.boolean.true=ã¯ã„ +default.boolean.false=ã„ã„㈠+default.date.format=yyyy/MM/dd HH:mm:ss z +default.number.format=0 + +default.created.message={0}(id:{1})を作æˆã—ã¾ã—ãŸã€‚ +default.updated.message={0}(id:{1})ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚ +default.deleted.message={0}(id:{1})を削除ã—ã¾ã—ãŸã€‚ +default.not.deleted.message={0}(id:{1})ã¯å‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +default.not.found.message={0}(id:{1})ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ +default.optimistic.locking.failure=ã“ã®{0}ã¯ç·¨é›†ä¸ã«ä»–ã®ãƒ¦ãƒ¼ã‚¶ã«ã‚ˆã£ã¦å…ˆã«æ›´æ–°ã•ã‚Œã¦ã„ã¾ã™ã€‚ + +default.home.label=ホーム+default.list.label={0}リスト +default.add.label={0}ã‚’è¿½åŠ +default.new.label={0}ã‚’æ–°è¦ä½œæˆ +default.create.label={0}ã‚’ä½œæˆ +default.show.label={0}詳細 +default.edit.label={0}を編集 + +default.button.create.label=ä½œæˆ +default.button.edit.label=編集 +default.button.update.label=æ›´æ–° +default.button.delete.label=削除 +default.button.delete.confirm.message=本当ã«å‰Šé™¤ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL={0}ã¯æœ‰åŠ¹ãªURLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.net.URI={0}ã¯æœ‰åŠ¹ãªURIã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.util.Date={0}ã¯æœ‰åŠ¹ãªæ—¥ä»˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.lang.Double={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.lang.Integer={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.lang.Long={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.lang.Short={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.math.BigDecimal={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 +typeMismatch.java.math.BigInteger={0}ã¯æœ‰åŠ¹ãªæ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_nb.properties b/babsi/BabsiWeb/grails-app/i18n/messages_nb.properties new file mode 100644 index 0000000000000000000000000000000000000000..47a8a1abe7cd555d2b8c21f35fe00b0b0d7f2986 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_nb.properties @@ -0,0 +1,56 @@ +default.doesnt.match.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke mønsteret [{3}] +default.invalid.url.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig URL +default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke et gyldig kredittkortnummer +default.invalid.email.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig epostadresse +default.invalid.range.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] +default.invalid.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] +default.invalid.max.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumsverdien pÃ¥ [{3}] +default.invalid.min.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er under minimumsverdien pÃ¥ [{3}] +default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumslengden pÃ¥ [{3}] +default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er kortere enn minimumslengden pÃ¥ [{3}] +default.invalid.validator.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke den brukerdefinerte valideringen +default.not.inlist.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] finnes ikke i listen [{3}] +default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom +default.not.equal.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] kan ikke være [{3}] +default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null +default.not.unique.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] mÃ¥ være unik + +default.paginate.prev=Forrige +default.paginate.next=Neste +default.boolean.true=Ja +default.boolean.false=Nei +default.date.format=dd.MM.yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} opprettet +default.updated.message={0} {1} oppdatert +default.deleted.message={0} {1} slettet +default.not.deleted.message={0} {1} kunne ikke slettes +default.not.found.message={0} med id {1} ble ikke funnet +default.optimistic.locking.failure=En annen bruker har oppdatert denne {0} mens du redigerte + +default.home.label=Hjem +default.list.label={0}liste +default.add.label=Legg til {0} +default.new.label=Ny {0} +default.create.label=Opprett {0} +default.show.label=Vis {0} +default.edit.label=Endre {0} + +default.button.create.label=Opprett +default.button.edit.label=Endre +default.button.update.label=Oppdater +default.button.delete.label=Slett +default.button.delete.confirm.message=Er du sikker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Feltet {0} mÃ¥ være en gyldig URL +typeMismatch.java.net.URI=Feltet {0} mÃ¥ være en gyldig URI +typeMismatch.java.util.Date=Feltet {0} mÃ¥ være en gyldig dato +typeMismatch.java.lang.Double=Feltet {0} mÃ¥ være et gyldig tall +typeMismatch.java.lang.Integer=Feltet {0} mÃ¥ være et gyldig heltall +typeMismatch.java.lang.Long=Feltet {0} mÃ¥ være et gyldig heltall +typeMismatch.java.lang.Short=Feltet {0} mÃ¥ være et gyldig heltall +typeMismatch.java.math.BigDecimal=Feltet {0} mÃ¥ være et gyldig tall +typeMismatch.java.math.BigInteger=Feltet {0} mÃ¥ være et gyldig heltall + diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_nl.properties b/babsi/BabsiWeb/grails-app/i18n/messages_nl.properties new file mode 100644 index 0000000000000000000000000000000000000000..cd5cc94ee755450fc4d9884d695e1dd326117501 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_nl.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}] +default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL +default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer +default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres +default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}] +default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}] +default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}] +default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}] +default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}] +default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}] +default.invalid.validator.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is niet geldig +default.not.inlist.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet voor in de lijst [{3}] +default.blank.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn +default.not.equal.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] mag niet gelijk zijn aan [{3}] +default.null.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn +default.not.unique.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] moet uniek zijn + +default.paginate.prev=Vorige +default.paginate.next=Volgende +default.boolean.true=Ja +default.boolean.false=Nee +default.date.format=dd-MM-yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} ingevoerd +default.updated.message={0} {1} gewijzigd +default.deleted.message={0} {1} verwijderd +default.not.deleted.message={0} {1} kon niet worden verwijderd +default.not.found.message={0} met id {1} kon niet worden gevonden +default.optimistic.locking.failure=Een andere gebruiker heeft deze {0} al gewijzigd + +default.home.label=Home +default.list.label={0} Overzicht +default.add.label=Toevoegen {0} +default.new.label=Invoeren {0} +default.create.label=Invoeren {0} +default.show.label=Details {0} +default.edit.label=Wijzigen {0} + +default.button.create.label=Invoeren +default.button.edit.label=Wijzigen +default.button.update.label=Opslaan +default.button.delete.label=Verwijderen +default.button.delete.confirm.message=Weet je het zeker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Attribuut {0} is geen geldige URL +typeMismatch.java.net.URI=Attribuut {0} is geen geldige URI +typeMismatch.java.util.Date=Attribuut {0} is geen geldige datum +typeMismatch.java.lang.Double=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Integer=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Long=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Short=Attribuut {0} is geen geldig nummer +typeMismatch.java.math.BigDecimal=Attribuut {0} is geen geldig nummer +typeMismatch.java.math.BigInteger=Attribuut {0} is geen geldig nummer diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_pl.properties b/babsi/BabsiWeb/grails-app/i18n/messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..959296cee30e83d02686da574fd71c1d46ccb3bd --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_pl.properties @@ -0,0 +1,59 @@ +# +# Translated by Matthias Hryniszak - padcom@gmail.com +# + +default.doesnt.match.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie pasuje do wymaganego wzorca [{3}] +default.invalid.url.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] jest niepoprawnym adresem URL +default.invalid.creditCard.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] with value [{2}] nie jest poprawnym numerem karty kredytowej +default.invalid.email.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie jest poprawnym adresem e-mail +default.invalid.range.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie zawiera siÄ™ zakÅ‚adanym zakresie od [{3}] do [{4}] +default.invalid.size.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie zawiera siÄ™ w zakÅ‚adanym zakresie rozmiarów od [{3}] do [{4}] +default.invalid.max.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] przekracza maksymalnÄ… wartość [{3}] +default.invalid.min.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] jest mniejsza niż minimalna wartość [{3}] +default.invalid.max.size.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] przekracza maksymalny rozmiar [{3}] +default.invalid.min.size.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] jest mniejsza niż minimalny rozmiar [{3}] +default.invalid.validator.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie speÅ‚nia zaÅ‚ożonych niestandardowych warunków +default.not.inlist.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie zawiera siÄ™ w liÅ›cie [{3}] +default.blank.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] nie może być pusta +default.not.equal.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] nie może równać siÄ™ [{3}] +default.null.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] nie może być null +default.not.unique.message=WÅ‚aÅ›ciwość [{0}] klasy [{1}] o wartoÅ›ci [{2}] musi być unikalna + +default.paginate.prev=Poprzedni +default.paginate.next=NastÄ™pny +default.boolean.true=Prawda +default.boolean.false=FaÅ‚sz +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message=Utworzono {0} {1} +default.updated.message=Zaktualizowano {0} {1} +default.deleted.message=UsuniÄ™to {0} {1} +default.not.deleted.message={0} {1} nie mógÅ‚ zostać usuniÄ™ty +default.not.found.message=Nie znaleziono {0} o id {1} +default.optimistic.locking.failure=Inny użytkownik zaktualizowaÅ‚ ten obiekt {0} w trakcie twoich zmian + +default.home.label=Strona domowa +default.list.label=Lista {0} +default.add.label=Dodaj {0} +default.new.label=Utwórz {0} +default.create.label=Utwórz {0} +default.show.label=Pokaż {0} +default.edit.label=Edytuj {0} + +default.button.create.label=Utwórz +default.button.edit.label=Edytuj +default.button.update.label=Zaktualizuj +default.button.delete.label=UsuÅ„ +default.button.delete.confirm.message=Czy jesteÅ› pewien? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=WÅ‚aÅ›ciwość {0} musi być poprawnym adresem URL +typeMismatch.java.net.URI=WÅ‚aÅ›ciwość {0} musi być poprawnym adresem URI +typeMismatch.java.util.Date=WÅ‚aÅ›ciwość {0} musi być poprawnÄ… datÄ… +typeMismatch.java.lang.Double=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… +typeMismatch.java.lang.Integer=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… +typeMismatch.java.lang.Long=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… +typeMismatch.java.lang.Short=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… +typeMismatch.java.math.BigDecimal=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… +typeMismatch.java.math.BigInteger=WÅ‚aÅ›ciwość {0} musi być poprawnyÄ… liczbÄ… diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_pt_BR.properties b/babsi/BabsiWeb/grails-app/i18n/messages_pt_BR.properties new file mode 100644 index 0000000000000000000000000000000000000000..0c368f22eb409608254b5d8acf655f5382aab9a9 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_pt_BR.properties @@ -0,0 +1,59 @@ +# +# Translated by Lucas Teixeira - lucastex@gmail.com +# + +default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] +default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida +default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito +default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. +default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] +default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] +default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mÃnimo [{3}] +default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] +default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mÃnimo de [{3}] +default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação +default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] +default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco +default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia +default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único + +default.paginate.prev=Anterior +default.paginate.next=Próximo +default.boolean.true=Sim +default.boolean.false=Não +default.date.format=dd/MM/yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} criado +default.updated.message={0} {1} atualizado +default.deleted.message={0} {1} removido +default.not.deleted.message={0} {1} não pode ser removido +default.not.found.message={0} não foi encontrado com id {1} +default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo + +default.home.label=Principal +default.list.label={0} Listagem +default.add.label=Adicionar {0} +default.new.label=Novo {0} +default.create.label=Criar {0} +default.show.label=Ver {0} +default.edit.label=Editar {0} + +default.button.create.label=Criar +default.button.edit.label=Editar +default.button.update.label=Alterar +default.button.delete.label=Remover +default.button.delete.confirm.message=Tem certeza? + +# Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. +typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. +typeMismatch.java.util.Date=O campo {0} deve ser uma data válida +typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_pt_PT.properties b/babsi/BabsiWeb/grails-app/i18n/messages_pt_PT.properties new file mode 100644 index 0000000000000000000000000000000000000000..43a64163718fecc5d93e9f1dd20a4cddfd7678b6 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_pt_PT.properties @@ -0,0 +1,34 @@ +# +# translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com +# + +default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] +default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido +default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito +default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereÂço de email válido. +default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] +default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] +default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mÃnimo [{3}] +default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] +default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mÃnimo de [{3}] +default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validaÂção +default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] +default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único + +default.paginate.prev=Anterior +default.paginate.next=Próximo + +# Mensagens de erro em atribuiÂção de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) +typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. +typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. +typeMismatch.java.util.Date=O campo {0} deve ser uma data válida +typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. +typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_ru.properties b/babsi/BabsiWeb/grails-app/i18n/messages_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..02239db0a8012a2bcb0ad45920bb3d475f72be7a --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_ru.properties @@ -0,0 +1,31 @@ +default.doesnt.match.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не ÑоответÑтвует образцу [{3}] +default.invalid.url.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым URL-адреÑом +default.invalid.creditCard.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым номером кредитной карты +default.invalid.email.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым e-mail адреÑом +default.invalid.range.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не попадает в допуÑтимый интервал от [{3}] до [{4}] +default.invalid.size.message=Размер Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] (значение: [{2}]) не попадает в допуÑтимый интервал от [{3}] до [{4}] +default.invalid.max.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] больше чем макÑимально допуÑтимое значение [{3}] +default.invalid.min.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] меньше чем минимально допуÑтимое значение [{3}] +default.invalid.max.size.message=Размер Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] (значение: [{2}]) больше чем макÑимально допуÑтимый размер [{3}] +default.invalid.min.size.message=Размер Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] (значение: [{2}]) меньше чем минимально допуÑтимый размер [{3}] +default.invalid.validator.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не допуÑтимо +default.not.inlist.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не попадает в ÑпиÑок допуÑтимых значений [{3}] +default.blank.message=Поле [{0}] клаÑÑа [{1}] не может быть пуÑтым +default.not.equal.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] не может быть равно [{3}] +default.null.message=Поле [{0}] клаÑÑа [{1}] не может иметь значение null +default.not.unique.message=Значение [{2}] Ð¿Ð¾Ð»Ñ [{0}] клаÑÑа [{1}] должно быть уникальным + +default.paginate.prev=ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑˆÐ°Ñ Ñтраница +default.paginate.next=Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница + +# Ошибки при приÑвоении данных. Ð”Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð¹ наÑтройки Ð´Ð»Ñ Ð¿Ð¾Ð»ÐµÐ¹ клаÑÑов иÑпользуйте +# формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) +typeMismatch.java.net.URL=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым URL +typeMismatch.java.net.URI=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым URI +typeMismatch.java.util.Date=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой датой +typeMismatch.java.lang.Double=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +typeMismatch.java.lang.Integer=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +typeMismatch.java.lang.Long=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +typeMismatch.java.lang.Short=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +typeMismatch.java.math.BigDecimal=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +typeMismatch.java.math.BigInteger=Значение Ð¿Ð¾Ð»Ñ {0} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_sv.properties b/babsi/BabsiWeb/grails-app/i18n/messages_sv.properties new file mode 100644 index 0000000000000000000000000000000000000000..61899d79491c39206398d8c046c2af0f05387d05 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_sv.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=Attributet [{0}] för klassen [{1}] med värde [{2}] matchar inte mot uttrycket [{3}] +default.invalid.url.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig URL +default.invalid.creditCard.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte ett giltigt kreditkortsnummer +default.invalid.email.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig e-postadress +default.invalid.range.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte inom intervallet [{3}] till [{4}] +default.invalid.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] har en storlek som inte är inom [{3}] till [{4}] +default.invalid.max.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxvärdet [{3}] +default.invalid.min.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimivärdet [{3}] +default.invalid.max.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxstorleken [{3}] +default.invalid.min.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimistorleken [{3}] +default.invalid.validator.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt enligt anpassad regel +default.not.inlist.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt, mÃ¥ste vara ett av [{3}] +default.blank.message=Attributet [{0}] för klassen [{1}] fÃ¥r inte vara tomt +default.not.equal.message=Attributet [{0}] för klassen [{1}] med värde [{2}] fÃ¥r inte vara lika med [{3}] +default.null.message=Attributet [{0}] för klassen [{1}] fÃ¥r inte vara tomt +default.not.unique.message=Attributet [{0}] för klassen [{1}] med värde [{2}] mÃ¥ste vara unikt + +default.paginate.prev=FöregÃ¥ende +default.paginate.next=Nästa +default.boolean.true=Sant +default.boolean.false=Falskt +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} skapades +default.updated.message={0} {1} uppdaterades +default.deleted.message={0} {1} borttagen +default.not.deleted.message={0} {1} kunde inte tas bort +default.not.found.message={0} med id {1} kunde inte hittas +default.optimistic.locking.failure=En annan användare har uppdaterat det här {0} objektet medan du redigerade det + +default.home.label=Hem +default.list.label= {0} - Lista +default.add.label=Lägg till {0} +default.new.label=Skapa {0} +default.create.label=Skapa {0} +default.show.label=Visa {0} +default.edit.label=Ändra {0} + +default.button.create.label=Skapa +default.button.edit.label=Ändra +default.button.update.label=Uppdatera +default.button.delete.label=Ta bort +default.button.delete.confirm.message=Är du säker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Värdet för {0} mÃ¥ste vara en giltig URL +typeMismatch.java.net.URI=Värdet för {0} mÃ¥ste vara en giltig URI +typeMismatch.java.util.Date=Värdet {0} mÃ¥ste vara ett giltigt datum +typeMismatch.java.lang.Double=Värdet {0} mÃ¥ste vara ett giltigt nummer +typeMismatch.java.lang.Integer=Värdet {0} mÃ¥ste vara ett giltigt heltal +typeMismatch.java.lang.Long=Värdet {0} mÃ¥ste vara ett giltigt heltal +typeMismatch.java.lang.Short=Värdet {0} mÃ¥ste vara ett giltigt heltal +typeMismatch.java.math.BigDecimal=Värdet {0} mÃ¥ste vara ett giltigt nummer +typeMismatch.java.math.BigInteger=Värdet {0} mÃ¥ste vara ett giltigt heltal \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_th.properties b/babsi/BabsiWeb/grails-app/i18n/messages_th.properties new file mode 100644 index 0000000000000000000000000000000000000000..4f4076d16b1d935519e7bd18dcda8533a4eb5f88 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_th.properties @@ -0,0 +1,55 @@ +default.doesnt.match.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูà¸à¸•à¹‰à¸à¸‡à¸•à¸²à¸¡à¸£à¸¹à¸›à¹à¸šà¸šà¸—ี่à¸à¸³à¸«à¸™à¸”ไว้ใน [{3}] +default.invalid.url.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูà¸à¸•à¹‰à¸à¸‡à¸•à¸²à¸¡à¸£à¸¹à¸›à¹à¸šà¸š URL +default.invalid.creditCard.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูà¸à¸•à¹‰à¸à¸‡à¸•à¸²à¸¡à¸£à¸¹à¸›à¹à¸šà¸šà¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚บัตรเครดิต +default.invalid.email.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูà¸à¸•à¹‰à¸à¸‡à¸•à¸²à¸¡à¸£à¸¹à¸›à¹à¸šà¸šà¸à¸µà¹€à¸¡à¸¥à¹Œ +default.invalid.range.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูà¸à¸•à¹‰à¸à¸‡à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¸ˆà¸²à¸ [{3}] ถึง [{4}] +default.invalid.size.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูà¸à¸•à¹‰à¸à¸‡à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¸ˆà¸²à¸ [{3}] ถึง [{4}] +default.invalid.max.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเà¸à¸´à¸”à¸à¸§à¹ˆà¸²à¸„่ามาà¸à¸ªà¸¸à¸” [{3}] +default.invalid.min.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้à¸à¸¢à¸à¸§à¹ˆà¸²à¸„่าต่ำสุด [{3}] +default.invalid.max.size.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸‚นาดมาà¸à¸ªà¸¸à¸”ขà¸à¸‡ [{3}] +default.invalid.min.size.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำà¸à¸§à¹ˆà¸²à¸‚นาดต่ำสุดขà¸à¸‡ [{3}] +default.invalid.validator.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านà¸à¸²à¸£à¸—วนสà¸à¸šà¸„่าที่ตั้งขึ้น +default.not.inlist.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£à¸•à¹ˆà¸à¹„ปนี้ [{3}] +default.blank.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ไม่สามารถเป็นค่าว่างได้ +default.not.equal.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่าà¸à¸±à¸š [{3}] ได้ +default.null.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ไม่สามารถเป็น null ได้ +default.not.unique.message=คุณสมบัติ [{0}] ขà¸à¸‡à¸„ลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้à¸à¸‡à¹„ม่ซ้ำ (unique) + +default.paginate.prev=à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸² +default.paginate.next=ถัดไป +default.boolean.true=จริง +default.boolean.false=เท็จ +default.date.format=dd-MM-yyyy HH:mm:ss z +default.number.format=0 + +default.created.message=สร้าง {0} {1} เรียบร้à¸à¸¢à¹à¸¥à¹‰à¸§ +default.updated.message=ปรับปรุง {0} {1} เรียบร้à¸à¸¢à¹à¸¥à¹‰à¸§ +default.deleted.message=ลบ {0} {1} เรียบร้à¸à¸¢à¹à¸¥à¹‰à¸§ +default.not.deleted.message=ไม่สามารถลบ {0} {1} +default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ +default.optimistic.locking.failure=มีผู้ใช้ท่านà¸à¸·à¹ˆà¸™à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡ {0} ขณะที่คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ขข้à¸à¸¡à¸¹à¸¥à¸à¸¢à¸¹à¹ˆ + +default.home.label=หน้าà¹à¸£à¸ +default.list.label=รายà¸à¸²à¸£ {0} +default.add.label=เพิ่ม {0} +default.new.label=สร้าง {0} ใหม่ +default.create.label=สร้าง {0} +default.show.label=à¹à¸ªà¸”ง {0} +default.edit.label=à¹à¸à¹‰à¹„ข {0} + +default.button.create.label=สร้าง +default.button.edit.label=à¹à¸à¹‰à¹„ข +default.button.update.label=ปรับปรุง +default.button.delete.label=ลบ +default.button.delete.confirm.message=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¹„ม่ ? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้à¸à¸‡à¹€à¸›à¹‡à¸™à¸„่า URL ที่ถูà¸à¸•à¹‰à¸à¸‡ +typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้à¸à¸‡à¹€à¸›à¹‡à¸™à¸„่า URI ที่ถูà¸à¸•à¹‰à¸à¸‡ +typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นวันที่ +typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท Double +typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท Integer +typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท Long +typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท Short +typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท BigDecimal +typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้à¸à¸‡à¸¡à¸µà¸„่าเป็นจำนวนประเภท BigInteger diff --git a/babsi/BabsiWeb/grails-app/i18n/messages_zh_CN.properties b/babsi/BabsiWeb/grails-app/i18n/messages_zh_CN.properties new file mode 100644 index 0000000000000000000000000000000000000000..782580b04634a5219b59c1582a9749f16213d527 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/messages_zh_CN.properties @@ -0,0 +1,18 @@ +default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A +default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D +default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 +default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL +default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 +default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 +default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 +default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 +default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull +default.paginate.next=\u4E0B\u9875 +default.paginate.prev=\u4E0A\u9875 diff --git a/babsi/BabsiWeb/grails-app/i18n/shiro.properties b/babsi/BabsiWeb/grails-app/i18n/shiro.properties new file mode 100644 index 0000000000000000000000000000000000000000..ddba8d9b589263bac938a808fd0f27f768091eab --- /dev/null +++ b/babsi/BabsiWeb/grails-app/i18n/shiro.properties @@ -0,0 +1 @@ +login.failed = Invalid username and/or password diff --git a/babsi/BabsiWeb/grails-app/realms/babsi/DbRealm.groovy b/babsi/BabsiWeb/grails-app/realms/babsi/DbRealm.groovy new file mode 100644 index 0000000000000000000000000000000000000000..59c4077c9c904a0fe14c7e715e234e5cdc8e5288 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/realms/babsi/DbRealm.groovy @@ -0,0 +1,137 @@ +package babsi + +import org.apache.shiro.authc.AccountException +import org.apache.shiro.authc.IncorrectCredentialsException +import org.apache.shiro.authc.SimpleAccount +import org.apache.shiro.authc.UnknownAccountException + +import cau.swp.babsi.User + +class DbRealm { + static authTokenClass = org.apache.shiro.authc.UsernamePasswordToken + + def credentialMatcher + def shiroPermissionResolver + + def authenticate(authToken) { + + log.info "Attempting to authenticate ${authToken.username} in DB realm..." + def username = authToken.username + + // Null username is invalid + if (username == null) { + + throw new AccountException("Null usernames are not allowed by this realm.") + } + + // Get the user with the given username. If the user is not + // found, then they don't have an account and we throw an + // exception. + + def user = User.findByUsername(username) + + if (!user) { + throw new UnknownAccountException("No account found for user [${username}]") + } + + log.info "Found user '${user.username}' in DB" + + // Now check the user's password against the hashed value stored + // in the database. + def account = new SimpleAccount(username, user.passwordHash, "DbRealm") + if (!credentialMatcher.doCredentialsMatch(authToken, account)) { + log.info "Invalid password (DB realm)" + throw new IncorrectCredentialsException("Invalid password for user '${username}'") + } + + return account + } + + def hasRole(principal, roleName) { + def roles = User.withCriteria { + roles { + eq("name", roleName) + } + eq("username", principal) + } + + return roles.size() > 0 + } + + def hasAllRoles(principal, roles) { + def r = User.withCriteria { + roles { + 'in'("name", roles) + } + eq("username", principal) + } + + return r.size() == roles.size() + } + + def isPermitted(principal, requiredPermission) { + // Does the user have the given permission directly associated + // with himself? + // + // First find all the permissions that the user has that match + // the required permission's type and project code. + def user = User.findByUsername(principal) + def permissions = user.permissions + + // Try each of the permissions found and see whether any of + // them confer the required permission. + def retval = permissions?.find { permString -> + // Create a real permission instance from the database + // permission. + def perm = shiroPermissionResolver.resolvePermission(permString) + + // Now check whether this permission implies the required + // one. + if (perm.implies(requiredPermission)) { + // User has the permission! + return true + } + else { + return false + } + } + + if (retval != null) { + // Found a matching permission! + return true + } + + // If not, does he gain it through a role? + // + // Get the permissions from the roles that the user does have. + def results = User.executeQuery("select distinct p from User as user join user.roles as role join role.permissions as p where user.username = '$principal'") + + // There may be some duplicate entries in the results, but + // at this stage it is not worth trying to remove them. Now, + // create a real permission from each result and check it + // against the required one. + retval = results.find { permString -> + // Create a real permission instance from the database + // permission. + def perm = shiroPermissionResolver.resolvePermission(permString) + + // Now check whether this permission implies the required + // one. + if (perm.implies(requiredPermission)) { + // User has the permission! + return true + } + else { + return false + } + } + + if (retval != null) { + // Found a matching permission! + return true + } + else { + return false + } + } +} diff --git a/babsi/BabsiWeb/grails-app/views/antibiotic/_form.gsp b/babsi/BabsiWeb/grails-app/views/antibiotic/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..7f97ace8cd80cc525317b1e7c089bbb0050ea8a3 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/antibiotic/_form.gsp @@ -0,0 +1,12 @@ +<%@ page import="cau.swp.babsi.medication.Antibiotic" %> + + + +<div class="fieldcontain ${hasErrors(bean: antibioticInstance, field: 'name', 'error')} "> + <label for="name"> + <g:message code="antibiotic.name.label" default="Name" /> + + </label> + <g:textField name="name" value="${antibioticInstance?.name}"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/antibiotic/create.gsp b/babsi/BabsiWeb/grails-app/views/antibiotic/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..50fe81e0cc0ec2a6e1e278910a561207d5ed8eb2 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/antibiotic/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="cau.swp.babsi.medication.Antibiotic" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'antibiotic.label', default: 'Antibiotic')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-antibiotic" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-antibiotic" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${antibioticInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${antibioticInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/antibiotic/edit.gsp b/babsi/BabsiWeb/grails-app/views/antibiotic/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..f05ef831d6a6a189d581aee218bcc8b184d7c132 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/antibiotic/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="cau.swp.babsi.medication.Antibiotic" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'antibiotic.label', default: 'Antibiotic')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-antibiotic" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-antibiotic" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${antibioticInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${antibioticInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${antibioticInstance?.id}" /> + <g:hiddenField name="version" value="${antibioticInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/antibiotic/list.gsp b/babsi/BabsiWeb/grails-app/views/antibiotic/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..f52d7763014d106b06feaa39c3e33defc5e7edad --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/antibiotic/list.gsp @@ -0,0 +1,46 @@ + +<%@ page import="cau.swp.babsi.medication.Antibiotic" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'antibiotic.label', default: 'Antibiotic')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-antibiotic" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-antibiotic" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="name" title="${message(code: 'antibiotic.name.label', default: 'Name')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${antibioticInstanceList}" status="i" var="antibioticInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${antibioticInstance.id}">${fieldValue(bean: antibioticInstance, field: "name")}</g:link></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${antibioticInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/antibiotic/show.gsp b/babsi/BabsiWeb/grails-app/views/antibiotic/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..48561743c4aa5af73c2b5852e3fbc874dd249373 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/antibiotic/show.gsp @@ -0,0 +1,45 @@ + +<%@ page import="cau.swp.babsi.medication.Antibiotic" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'antibiotic.label', default: 'Antibiotic')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-antibiotic" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-antibiotic" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list antibiotic"> + + <g:if test="${antibioticInstance?.name}"> + <li class="fieldcontain"> + <span id="name-label" class="property-label"><g:message code="antibiotic.name.label" default="Name" /></span> + + <span class="property-value" aria-labelledby="name-label"><g:fieldValue bean="${antibioticInstance}" field="name"/></span> + + </li> + </g:if> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${antibioticInstance?.id}" /> + <g:link class="edit" action="edit" id="${antibioticInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/auth/login.gsp b/babsi/BabsiWeb/grails-app/views/auth/login.gsp new file mode 100644 index 0000000000000000000000000000000000000000..c42f345ab9c31754e10ab2731e79e7115f58a2df --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/auth/login.gsp @@ -0,0 +1,35 @@ +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta name="layout" content="login" /> + <title>Login</title> +</head> +<body> + <g:if test="${flash.message}"> + <div class="message">${flash.message}</div> + </g:if> + <g:form action="signIn"> + <input type="hidden" name="targetUri" value="${targetUri}" /> + <table> + <tbody> + <tr> + <td>Username:</td> + <td><input type="text" name="username" value="${username}" /></td> + </tr> + <tr> + <td>Password:</td> + <td><input type="password" name="password" value="" /></td> + </tr> + <tr> + <td>Remember me?:</td> + <td><g:checkBox name="rememberMe" value="${rememberMe}" /></td> + </tr> + <tr> + <td /> + <td><input type="submit" value="Sign in" /></td> + </tr> + </tbody> + </table> + </g:form> +</body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/checklist/_drugData.gsp b/babsi/BabsiWeb/grails-app/views/checklist/_drugData.gsp new file mode 100644 index 0000000000000000000000000000000000000000..067bec7ca9b7527a4e21b8d2ee09597ca74fc372 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/checklist/_drugData.gsp @@ -0,0 +1,58 @@ +<%@ page import="cau.swp.babsi.wardround.Checklist"%> + +<g:each in="${checklistInstance.drugData}" var="d" status="counter"> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.label" default="Antibiotic ${counter+1}" args="${counter+1}" /></span> + <span class="property-value" aria-labelledby="drugData-label"> + ${d?.antibiotic.toString()} + </span> + + <ol style="padding-left: 25px; font-size: 0.8em"> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.reason.label" default="Prescription Reason" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.prescriptionReason.toString()} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.type.label" default="Application Type" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.drugApplicationType.toString()} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.duration.label" default="Duration" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.durationInDays + " Days"} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.strength.label" default="Strength" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.strength.toString()} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.rate.label" default="Application Rate" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.applicationRate.toString()} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.intervention.label" default="Intervention" /></span><span + class="property-value" aria-labelledby="drugData-label"> ${d?.intervention.toString()} + </span></li> + + <li class="fieldcontain"><span id="drugData-label" + class="property-label"><g:message + code="checklist.drugData.interventionstatus.label" default="Intervention Status" /></span> + <span class="property-value" aria-labelledby="drugData-label"> + ${d?.interventionStatus.toString()} + </span></li> + + </ol></li> +</g:each> \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/views/checklist/_form.gsp b/babsi/BabsiWeb/grails-app/views/checklist/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..27ac3c24abeaedc47b7b4a31d5e8b694b05dc941 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/checklist/_form.gsp @@ -0,0 +1,68 @@ +<%@ page import="cau.swp.babsi.wardround.Checklist" %> + + + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'infections', 'error')} "> + <label for="infections"> + <g:message code="checklist.infections.label" default="Infections" /> + + </label> + <g:select name="infections" from="${cau.swp.babsi.wardround.Infection.list()}" multiple="multiple" optionKey="id" size="5" value="${checklistInstance?.infections*.id}" class="many-to-many"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'drugData', 'error')} "> + <label for="drugData"> + <g:message code="checklist.drugData.label" default="Drug Data" /> + + </label> + <g:select name="drugData" from="${cau.swp.babsi.medication.DrugData.list()}" multiple="multiple" optionKey="id" size="5" value="${checklistInstance?.drugData*.id}" class="many-to-many"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'comment', 'error')} "> + <label for="comment"> + <g:message code="checklist.comment.label" default="Comment" /> + + </label> + <g:textField name="comment" value="${checklistInstance?.comment}"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'mibiStatus', 'error')} required"> + <label for="mibiStatus"> + <g:message code="checklist.mibiStatus.label" default="Mibi Status" /> + <span class="required-indicator">*</span> + </label> + <g:select id="mibiStatus" name="mibiStatus.id" from="${cau.swp.babsi.wardround.MiBiStatus.list()}" optionKey="id" required="" value="${checklistInstance?.mibiStatus?.id}" class="many-to-one"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'patientDateOfBirth', 'error')} required"> + <label for="patientDateOfBirth"> + <g:message code="checklist.patientDateOfBirth.label" default="Patient Date Of Birth" /> + <span class="required-indicator">*</span> + </label> + <g:datePicker name="patientDateOfBirth" precision="day" value="${checklistInstance?.patientDateOfBirth}" /> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'patientDescription', 'error')} "> + <label for="patientDescription"> + <g:message code="checklist.patientDescription.label" default="Patient Description" /> + + </label> + <g:textField name="patientDescription" value="${checklistInstance?.patientDescription}"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'patientSex', 'error')} "> + <label for="patientSex"> + <g:message code="checklist.patientSex.label" default="Patient Sex" /> + + </label> + <g:textField name="patientSex" value="${checklistInstance?.patientSex}"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: checklistInstance, field: 'wardRound', 'error')} required"> + <label for="wardRound"> + <g:message code="checklist.wardRound.label" default="Ward Round" /> + <span class="required-indicator">*</span> + </label> + <g:select id="wardRound" name="wardRound.id" from="${cau.swp.babsi.wardround.WardRound.list()}" optionKey="id" required="" value="${checklistInstance?.wardRound?.id}" class="many-to-one"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/checklist/list.gsp b/babsi/BabsiWeb/grails-app/views/checklist/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..f5a7cb3c69ce043a5eafba54dc185bb462a3741c --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/checklist/list.gsp @@ -0,0 +1,66 @@ + +<%@ page import="cau.swp.babsi.wardround.Checklist" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'checklist.label', default: 'Checklist')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-checklist" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> +<%-- <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>--%> + </ul> + </div> + <div id="list-checklist" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="patientDescription" title="${message(code: 'checklist.patientDescription.label', default: 'Patient')}" /> + + <g:sortableColumn property="patientDateOfBirth" title="${message(code: 'checklist.patientDateOfBirth.label', default: 'Date of Birth')}" /> + + <g:sortableColumn property="patientSex" title="${message(code: 'checklist.patientSex.label', default: 'Sex')}" /> + + <th><g:message code="checklist.mibiStatus.label" default="Mibi Status" /></th> + + <g:sortableColumn property="comment" title="${message(code: 'checklist.comment.label', default: 'Kommentar')}" /> + + <th><g:message code="checklist.wardRound.label" default="Visite" /></th> + + </tr> + </thead> + <tbody> + <g:each in="${checklistInstanceList}" status="i" var="checklistInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${checklistInstance.id}">${fieldValue(bean: checklistInstance, field: "patientDescription")}</g:link></td> + + <td><g:formatDate format="dd.MM.yyyy" date="${checklistInstance.patientDateOfBirth}" /></td> + + <td><g:if test="${fieldValue(bean: checklistInstance, field: 'patientSex').equals('male')}" >${message(code: 'checklist.patientSex.male', default: 'male')}</g:if><g:elseif test="${fieldValue(bean: checklistInstance, field: 'patientSex').equals('female')}">${message(code: 'checklist.patientSex.female', default: 'female')}</g:elseif></td> + + <td>${fieldValue(bean: checklistInstance, field: "mibiStatus")}</td> + + <td>${fieldValue(bean: checklistInstance, field: "comment")}</td> + + <td>${fieldValue(bean: checklistInstance, field: "wardRound")}</td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${checklistInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/checklist/show.gsp b/babsi/BabsiWeb/grails-app/views/checklist/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..b6ae959597641a82786736bd8ebd751dec344372 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/checklist/show.gsp @@ -0,0 +1,116 @@ + +<%@ page import="cau.swp.babsi.wardround.Checklist"%> +<!DOCTYPE html> +<html> +<head> +<meta name="layout" content="main"> +<g:set var="entityName" + value="${message(code: 'checklist.label', default: 'Checklist')}" /> +<title><g:message code="default.show.label" args="[entityName]" /></title> +</head> +<body> + <a href="#show-checklist" class="skip" tabindex="-1"><g:message + code="default.link.skip.label" default="Skip to content…" /></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message + code="default.home.label" /></a></li> + <li><g:link class="list" action="list"> + <g:message code="default.list.label" args="[entityName]" /> + </g:link></li> + <%-- <li><g:link class="create" action="create">--%> + <%-- <g:message code="default.new.label" args="[entityName]" />--%> + <%-- </g:link></li>--%> + </ul> + </div> + <div id="show-checklist" class="content scaffold-show" role="main"> + <h1> + <g:message code="default.show.label" args="[entityName]" /> + </h1> + <g:if test="${flash.message}"> + <div class="message" role="status"> + ${flash.message} + </div> + </g:if> + <ol class="property-list checklist"> + + <g:if test="${checklistInstance?.wardRound}"> + <li class="fieldcontain"><span id="wardRound-label" + class="property-label"><g:message + code="checklist.wardRound.label" default="Ward Round" /></span> <span + class="property-value" aria-labelledby="wardRound-label"><g:link + controller="wardRound" action="show" + id="${checklistInstance?.wardRound?.id}"> + ${checklistInstance?.wardRound?.encodeAsHTML()} + </g:link></span></li> + </g:if> + + <g:if test="${checklistInstance?.patientDescription}"> + <li class="fieldcontain"><span id="patientDescription-label" + class="property-label"><g:message + code="checklist.patientDescription.label" + default="Patient Description" /></span> <span class="property-value" + aria-labelledby="patientDescription-label"><g:fieldValue + bean="${checklistInstance}" field="patientDescription" /></span></li> + </g:if> + + <g:if test="${checklistInstance?.patientDateOfBirth}"> + <li class="fieldcontain"><span id="patientDateOfBirth-label" + class="property-label"><g:message + code="checklist.patientDateOfBirth.label" + default="Patient Date Of Birth" /></span> <span class="property-value" + aria-labelledby="patientDateOfBirth-label"><g:formatDate + format="dd.MM.yyyy" + date="${checklistInstance?.patientDateOfBirth}" /></span></li> + </g:if> + + <g:if test="${checklistInstance?.patientSex}"> + <li class="fieldcontain"><span id="patientSex-label" + class="property-label"><g:message + code="checklist.patientSex.label" default="Patient Sex" /></span> <span + class="property-value" aria-labelledby="patientSex-label"><g:fieldValue + bean="${checklistInstance}" field="patientSex" /></span></li> + </g:if> + + <g:if test="${checklistInstance?.mibiStatus}"> + <li class="fieldcontain"><span id="mibiStatus-label" + class="property-label"><g:message + code="checklist.mibiStatus.label" default="Mibi Status" /></span> <span + class="property-value" aria-labelledby="mibiStatus-label"><g:link + controller="miBiStatus" action="show" + id="${checklistInstance?.mibiStatus?.id}"> + ${checklistInstance?.mibiStatus?.encodeAsHTML()} + </g:link></span></li> + </g:if> + + <g:if test="${checklistInstance?.comment}"> + <li class="fieldcontain"><span id="comment-label" + class="property-label"><g:message + code="checklist.comment.label" default="Comment" /></span> <span + class="property-value" aria-labelledby="comment-label"><g:fieldValue + bean="${checklistInstance}" field="comment" /></span></li> + </g:if> + + <g:if test="${checklistInstance?.infections}"> + <li class="fieldcontain"><span id="infections-label" + class="property-label"><g:message + code="checklist.infections.label" default="Infections" /></span> <g:each + in="${checklistInstance.infections}" var="i"> + <span class="property-value" aria-labelledby="infections-label"><g:link + controller="infection" action="show" id="${i.id}"> + ${i?.encodeAsHTML()} + </g:link></span> + </g:each></li> + </g:if> + + <g:if test="${checklistInstance?.drugData}"> + + <g:render template="drugData" /> + + </g:if> + + </ol> + + </div> +</body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/cycle/_form.gsp b/babsi/BabsiWeb/grails-app/views/cycle/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..fe3221f3eca6b851dec4edb51b8a2ef59a915c75 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/cycle/_form.gsp @@ -0,0 +1,28 @@ +<%@ page import="cau.swp.babsi.wardround.Cycle" %> + + + +<div class="fieldcontain ${hasErrors(bean: cycleInstance, field: 'beginDate', 'error')} "> + <label for="beginDate"> + <g:message code="cycle.beginDate.label" default="Begin Date" /> + + </label> + <g:datePicker name="beginDate" precision="day" value="${cycleInstance?.beginDate}" default="none" noSelection="['': '']" /> +</div> + +<div class="fieldcontain ${hasErrors(bean: cycleInstance, field: 'endDate', 'error')} "> + <label for="endDate"> + <g:message code="cycle.endDate.label" default="End Date" /> + + </label> + <g:datePicker name="endDate" precision="day" value="${cycleInstance?.endDate}" default="none" noSelection="['': '']" /> +</div> + +<div class="fieldcontain ${hasErrors(bean: cycleInstance, field: 'wardrounds', 'error')} "> + <label for="wardrounds"> + <g:message code="cycle.wardrounds.label" default="Wardrounds" /> + + </label> + <g:select name="wardrounds" from="${cau.swp.babsi.wardround.WardRound.list()}" multiple="multiple" optionKey="id" size="5" value="${cycleInstance?.wardrounds*.id}" class="many-to-many"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/cycle/list.gsp b/babsi/BabsiWeb/grails-app/views/cycle/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..acbbe869631ce6dce55dfb7b3a26197c822abc07 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/cycle/list.gsp @@ -0,0 +1,52 @@ + +<%@ page import="cau.swp.babsi.wardround.Cycle" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'cycle.label', default: 'Cycle')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-cycle" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> +<%-- <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>--%> + </ul> + </div> + <div id="list-cycle" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + <g:sortableColumn property="id" title="${message(code: 'cycle.id.label', default: 'ID')}" /> + + <g:sortableColumn property="beginDate" title="${message(code: 'cycle.beginDate.label', default: 'Anfang')}" /> + + <g:sortableColumn property="endDate" title="${message(code: 'cycle.endDate.label', default: 'Ende')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${cycleInstanceList}" status="i" var="cycleInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + <td><g:link action="show" id="${cycleInstance.id}">${fieldValue(bean: cycleInstance, field: "id")}</g:link></td> + + <td><g:formatDate format="dd.MM.yyyy" date="${cycleInstance.beginDate}" /></td> + + <td><g:if test="${cycleInstance.endDate == null}"><g:message code="cycle.endDate.doesNotExist" default="still running"/></g:if><g:else><g:formatDate format="dd.MM.yyyy" date="${cycleInstance.endDate}" /></g:else></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${cycleInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/cycle/show.gsp b/babsi/BabsiWeb/grails-app/views/cycle/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..247c500aded71adea65ba23ceb58f5d83dc39558 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/cycle/show.gsp @@ -0,0 +1,65 @@ + +<%@ page import="cau.swp.babsi.wardround.Cycle" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'cycle.label', default: 'Cycle')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-cycle" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> +<%-- <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>--%> + </ul> + </div> + <div id="show-cycle" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list cycle"> + + <g:if test="${cycleInstance?.beginDate}"> + <li class="fieldcontain"> + <span id="beginDate-label" class="property-label"><g:message code="cycle.beginDate.label" default="Begin Date" /></span> + + <span class="property-value" aria-labelledby="beginDate-label"><g:formatDate format="dd.MM.yyyy" date="${cycleInstance?.beginDate}" /></span> + + </li> + </g:if> + + <g:if test="${cycleInstance?.endDate}"> + <li class="fieldcontain"> + <span id="endDate-label" class="property-label"><g:message code="cycle.endDate.label" default="End Date" /></span> + + <span class="property-value" aria-labelledby="endDate-label"><g:formatDate format="dd.MM.yyyy" date="${cycleInstance?.endDate}" /></span> + + </li> + </g:if> + + <g:if test="${cycleInstance?.wardrounds}"> + <li class="fieldcontain"> + <span id="wardrounds-label" class="property-label"><g:message code="cycle.wardrounds.label" default="Wardrounds" /></span> + + <g:each in="${cycleInstance.wardrounds}" var="w"> + <span class="property-value" aria-labelledby="wardrounds-label"><g:link controller="wardRound" action="show" id="${w.id}">${w?.encodeAsHTML()}</g:link></span> + </g:each> + + </li> + </g:if> + + </ol> +<%-- <g:form>--%> +<%-- <fieldset class="buttons">--%> +<%-- <g:hiddenField name="id" value="${cycleInstance?.id}" />--%> +<%-- <g:link class="edit" action="edit" id="${cycleInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link>--%> +<%-- <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" />--%> +<%-- </fieldset>--%> +<%-- </g:form>--%> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/dashboard/index.gsp b/babsi/BabsiWeb/grails-app/views/dashboard/index.gsp new file mode 100644 index 0000000000000000000000000000000000000000..7edfc06379c5e2d27a5b9c5139ebe2e4d8b09400 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/dashboard/index.gsp @@ -0,0 +1,19 @@ +<html> +<head> + <title><g:message code="dashboard.label" default="Dashboard" /></title> + <meta name="layout" content="main" /> +</head> +<body> + <div class="clearfix"><p style="text-align: center; float: left"><g:img dir="images" file="logo.png" /></p> + <p class="navbar-brand" style="text-align: center; float: none!important">BABSI</p> + <pre style="text-align: center">Basic Antibiotic Stewardship Interface</pre> + </div> + <p> + Hallo und herzlich Willkommen, <strong><i>${user}</i></strong>.</p> + <p> + Vielen Dank, dass Sie sich für ein Produkt aus der BABSI®-Familie entschieden haben.</p> + <p> + Auf der linken Seite, finden Sie die Navigation - in der mobilen Ansicht oben - dort finden Sie die Links zu den überragenden Funktionen unserer BABSI® Webapplikation.</p> + <p></p> +</body> +</html> \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/views/data/index.gsp b/babsi/BabsiWeb/grails-app/views/data/index.gsp new file mode 100644 index 0000000000000000000000000000000000000000..4fb3d522cd69e900ceb57ee63abf24e491d85b73 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/data/index.gsp @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<head> + <title>${message(code: 'data.label', default: 'Export')}</title> + <meta name="layout" content="main" /> +</head> +<body> + <p class="text-center"> + <a href="<g:createLink controller="data" action="export" />" class="btn btn-success">${message(code: 'data.export.checklists', default: 'Export Checklists')}</a> + </p> +</body> +</html> \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/views/error.gsp b/babsi/BabsiWeb/grails-app/views/error.gsp new file mode 100644 index 0000000000000000000000000000000000000000..d85f57ba2bbd63e86ab4dde65c6d3309297dcc5a --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/error.gsp @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + <head> + <title><g:if env="development">Grails Runtime Exception</g:if><g:else>Error</g:else></title> + <meta name="layout" content="main"> + <g:if env="development"><link rel="stylesheet" href="${resource(dir: 'css', file: 'errors.css')}" type="text/css"></g:if> + </head> + <body> + <g:if env="development"> + <g:renderException exception="${exception}" /> + </g:if> + <g:else> + <ul class="errors"> + <li>An error has occurred</li> + </ul> + </g:else> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/index.gsp b/babsi/BabsiWeb/grails-app/views/index.gsp new file mode 100644 index 0000000000000000000000000000000000000000..cf4c0b438bba152d5f21b8f552794c021859be87 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/index.gsp @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"/> + <title>Welcome to Grails</title> + <style type="text/css" media="screen"> + #status { + background-color: #eee; + border: .2em solid #fff; + margin: 2em 2em 1em; + padding: 1em; + width: 12em; + float: left; + -moz-box-shadow: 0px 0px 1.25em #ccc; + -webkit-box-shadow: 0px 0px 1.25em #ccc; + box-shadow: 0px 0px 1.25em #ccc; + -moz-border-radius: 0.6em; + -webkit-border-radius: 0.6em; + border-radius: 0.6em; + } + + .ie6 #status { + display: inline; /* float double margin fix http://www.positioniseverything.net/explorer/doubled-margin.html */ + } + + #status ul { + font-size: 0.9em; + list-style-type: none; + margin-bottom: 0.6em; + padding: 0; + } + + #status li { + line-height: 1.3; + } + + #status h1 { + text-transform: uppercase; + font-size: 1.1em; + margin: 0 0 0.3em; + } + + #page-body { + margin: 2em 1em 1.25em 18em; + } + + h2 { + margin-top: 1em; + margin-bottom: 0.3em; + font-size: 1em; + } + + p { + line-height: 1.5; + margin: 0.25em 0; + } + + #controller-list ul { + list-style-position: inside; + } + + #controller-list li { + line-height: 1.3; + list-style-position: inside; + margin: 0.25em 0; + } + + @media screen and (max-width: 480px) { + #status { + display: none; + } + + #page-body { + margin: 0 1em 1em; + } + + #page-body h1 { + margin-top: 0; + } + } + </style> + </head> + <body> + <a href="#page-body" class="skip"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div id="status" role="complementary"> + <h1>Application Status</h1> + <ul> + <li>App version: <g:meta name="app.version"/></li> + <li>Grails version: <g:meta name="app.grails.version"/></li> + <li>Groovy version: ${GroovySystem.getVersion()}</li> + <li>JVM version: ${System.getProperty('java.version')}</li> + <li>Reloading active: ${grails.util.Environment.reloadingAgentEnabled}</li> + <li>Controllers: ${grailsApplication.controllerClasses.size()}</li> + <li>Domains: ${grailsApplication.domainClasses.size()}</li> + <li>Services: ${grailsApplication.serviceClasses.size()}</li> + <li>Tag Libraries: ${grailsApplication.tagLibClasses.size()}</li> + </ul> + <h1>Installed Plugins</h1> + <ul> + <g:each var="plugin" in="${applicationContext.getBean('pluginManager').allPlugins}"> + <li>${plugin.name} - ${plugin.version}</li> + </g:each> + </ul> + </div> + <div id="page-body" role="main"> + <h1>Welcome to Grails</h1> + <p>Congratulations, you have successfully started your first Grails application! At the moment + this is the default page, feel free to modify it to either redirect to a controller or display whatever + content you may choose. Below is a list of controllers that are currently deployed in this application, + click on each to execute its default action:</p> + + <div id="controller-list" role="navigation"> + <h2>Available Controllers:</h2> + <ul> + <g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName } }"> + <li class="controller"><g:link controller="${c.logicalPropertyName}">${c.fullName}</g:link></li> + </g:each> + </ul> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/infection/_form.gsp b/babsi/BabsiWeb/grails-app/views/infection/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..afb5ff77ed1c0039da788b7b87f401698cc56cc4 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/infection/_form.gsp @@ -0,0 +1,12 @@ +<%@ page import="cau.swp.babsi.wardround.Infection" %> + + + +<div class="fieldcontain ${hasErrors(bean: infectionInstance, field: 'name', 'error')} "> + <label for="name"> + <g:message code="infection.name.label" default="Name" /> + + </label> + <g:textField name="name" value="${infectionInstance?.name}"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/infection/create.gsp b/babsi/BabsiWeb/grails-app/views/infection/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..992fdcf722d2f78d5dcabb4489ae3db6199af75b --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/infection/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="cau.swp.babsi.wardround.Infection" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'infection.label', default: 'Infection')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-infection" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-infection" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${infectionInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${infectionInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/infection/edit.gsp b/babsi/BabsiWeb/grails-app/views/infection/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..905ebab7efb73213c805c97ab4aa6961257ff02a --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/infection/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="cau.swp.babsi.wardround.Infection" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'infection.label', default: 'Infection')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-infection" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-infection" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${infectionInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${infectionInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${infectionInstance?.id}" /> + <g:hiddenField name="version" value="${infectionInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/infection/list.gsp b/babsi/BabsiWeb/grails-app/views/infection/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..3f05f64b48e3f7014d7feaeee5016e32ab7e41c1 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/infection/list.gsp @@ -0,0 +1,46 @@ + +<%@ page import="cau.swp.babsi.wardround.Infection" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'infection.label', default: 'Infection')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-infection" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-infection" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="name" title="${message(code: 'infection.name.label', default: 'Name')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${infectionInstanceList}" status="i" var="infectionInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${infectionInstance.id}">${fieldValue(bean: infectionInstance, field: "name")}</g:link></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${infectionInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/infection/show.gsp b/babsi/BabsiWeb/grails-app/views/infection/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..c017a3130e0bb1074fb0ab0fd0897915ec630973 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/infection/show.gsp @@ -0,0 +1,45 @@ + +<%@ page import="cau.swp.babsi.wardround.Infection" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'infection.label', default: 'Infection')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-infection" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-infection" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list infection"> + + <g:if test="${infectionInstance?.name}"> + <li class="fieldcontain"> + <span id="name-label" class="property-label"><g:message code="infection.name.label" default="Name" /></span> + + <span class="property-value" aria-labelledby="name-label"><g:fieldValue bean="${infectionInstance}" field="name"/></span> + + </li> + </g:if> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${infectionInstance?.id}" /> + <g:link class="edit" action="edit" id="${infectionInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionStatus/_form.gsp b/babsi/BabsiWeb/grails-app/views/interventionStatus/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..31207002844e2e666d4d5e437d41c054926af8e3 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionStatus/_form.gsp @@ -0,0 +1,12 @@ +<%@ page import="babsi.meditems.status.InterventionStatus" %> + + + +<div class="fieldcontain ${hasErrors(bean: interventionStatusInstance, field: 'bezeichnung', 'error')} "> + <label for="bezeichnung"> + <g:message code="interventionStatus.bezeichnung.label" default="Bezeichnung" /> + + </label> + <g:textField name="bezeichnung" value="${interventionStatusInstance?.bezeichnung}"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/interventionStatus/create.gsp b/babsi/BabsiWeb/grails-app/views/interventionStatus/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..9cd4e3581c8a8747a44751358f1a1f3aa807e50c --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionStatus/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="babsi.meditems.status.InterventionStatus" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionStatus.label', default: 'InterventionStatus')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-interventionStatus" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-interventionStatus" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${interventionStatusInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${interventionStatusInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionStatus/edit.gsp b/babsi/BabsiWeb/grails-app/views/interventionStatus/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..c2653231d4afb3e58c6d450b9111e5cf16f82bcc --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionStatus/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="babsi.meditems.status.InterventionStatus" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionStatus.label', default: 'InterventionStatus')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-interventionStatus" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-interventionStatus" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${interventionStatusInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${interventionStatusInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${interventionStatusInstance?.id}" /> + <g:hiddenField name="version" value="${interventionStatusInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionStatus/list.gsp b/babsi/BabsiWeb/grails-app/views/interventionStatus/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..bd0d0c3ac86c7849d7d9d4fbae9fc07a09aedf9f --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionStatus/list.gsp @@ -0,0 +1,46 @@ + +<%@ page import="babsi.meditems.status.InterventionStatus" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionStatus.label', default: 'InterventionStatus')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-interventionStatus" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-interventionStatus" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="bezeichnung" title="${message(code: 'interventionStatus.bezeichnung.label', default: 'Bezeichnung')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${interventionStatusInstanceList}" status="i" var="interventionStatusInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${interventionStatusInstance.id}">${fieldValue(bean: interventionStatusInstance, field: "bezeichnung")}</g:link></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${interventionStatusInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionStatus/show.gsp b/babsi/BabsiWeb/grails-app/views/interventionStatus/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..946512bca5a2cdb352b5de5ecae833027675e27c --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionStatus/show.gsp @@ -0,0 +1,45 @@ + +<%@ page import="babsi.meditems.status.InterventionStatus" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionStatus.label', default: 'InterventionStatus')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-interventionStatus" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-interventionStatus" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list interventionStatus"> + + <g:if test="${interventionStatusInstance?.bezeichnung}"> + <li class="fieldcontain"> + <span id="bezeichnung-label" class="property-label"><g:message code="interventionStatus.bezeichnung.label" default="Bezeichnung" /></span> + + <span class="property-value" aria-labelledby="bezeichnung-label"><g:fieldValue bean="${interventionStatusInstance}" field="bezeichnung"/></span> + + </li> + </g:if> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${interventionStatusInstance?.id}" /> + <g:link class="edit" action="edit" id="${interventionStatusInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionType/_form.gsp b/babsi/BabsiWeb/grails-app/views/interventionType/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..768782e84cb1a247772eee51b931dd08675b44b2 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionType/_form.gsp @@ -0,0 +1,12 @@ +<%@ page import="cau.swp.babsi.medication.InterventionType" %> + + + +<div class="fieldcontain ${hasErrors(bean: interventionTypeInstance, field: 'name', 'error')} "> + <label for="name"> + <g:message code="interventionType.name.label" default="Name" /> + + </label> + <g:textField name="name" value="${interventionTypeInstance?.name}"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/interventionType/create.gsp b/babsi/BabsiWeb/grails-app/views/interventionType/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..d554b1ef193175f9213f4eadfee8d37d03b5a175 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionType/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="cau.swp.babsi.medication.InterventionType" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionType.label', default: 'InterventionType')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-interventionType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-interventionType" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${interventionTypeInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${interventionTypeInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionType/edit.gsp b/babsi/BabsiWeb/grails-app/views/interventionType/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..b507bea38c486934c5b0b19de6335690dabcda60 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionType/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="cau.swp.babsi.medication.InterventionType" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionType.label', default: 'InterventionType')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-interventionType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-interventionType" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${interventionTypeInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${interventionTypeInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${interventionTypeInstance?.id}" /> + <g:hiddenField name="version" value="${interventionTypeInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionType/list.gsp b/babsi/BabsiWeb/grails-app/views/interventionType/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..e0299532367678ff8deb7a404b94aa7acd76e8aa --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionType/list.gsp @@ -0,0 +1,46 @@ + +<%@ page import="cau.swp.babsi.medication.InterventionType" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionType.label', default: 'InterventionType')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-interventionType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-interventionType" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="name" title="${message(code: 'interventionType.name.label', default: 'Name')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${interventionTypeInstanceList}" status="i" var="interventionTypeInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${interventionTypeInstance.id}">${fieldValue(bean: interventionTypeInstance, field: "name")}</g:link></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${interventionTypeInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/interventionType/show.gsp b/babsi/BabsiWeb/grails-app/views/interventionType/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..a4c3ebcd2fe0a21fbfe192307bc9abb22fcbc186 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/interventionType/show.gsp @@ -0,0 +1,45 @@ + +<%@ page import="cau.swp.babsi.medication.InterventionType" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'interventionType.label', default: 'InterventionType')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-interventionType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-interventionType" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list interventionType"> + + <g:if test="${interventionTypeInstance?.name}"> + <li class="fieldcontain"> + <span id="name-label" class="property-label"><g:message code="interventionType.name.label" default="Name" /></span> + + <span class="property-value" aria-labelledby="name-label"><g:fieldValue bean="${interventionTypeInstance}" field="name"/></span> + + </li> + </g:if> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${interventionTypeInstance?.id}" /> + <g:link class="edit" action="edit" id="${interventionTypeInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/layouts/login.gsp b/babsi/BabsiWeb/grails-app/views/layouts/login.gsp new file mode 100644 index 0000000000000000000000000000000000000000..5deacf01d22397b8c5eeebada49206b47bab55da --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/layouts/login.gsp @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title><g:layoutTitle /></title> + <jq:resources /> + <r:layoutResources /> + <link href="<g:resource dir="css" file="bootstrap.css" />" + rel="stylesheet" /> + <link href="<g:resource dir="css" file="babsi.css" />" rel="stylesheet" /> + + + <!-- iOS Support - Ja, wirklich... --> + <link rel="apple-touch-icon" href="<g:resource dir="images" file="apple-touch-icon.png" />" /> + <link rel="apple-touch-icon" sizes="76x76" href="<g:resource dir="images" file="apple-touch-icon-ipad.png" />" /> + <link rel="apple-touch-icon" sizes="120x120" href="<g:resource dir="images" file="apple-touch-icon-retina.png" />" /> + <link rel="apple-touch-icon" sizes="152x152" href="<g:resource dir="images" file="apple-touch-icon-retina.png" />" /> + + <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-status-bar-style" content="black" /> + + + <link rel="icon" href="<g:resource dir="images" file="favicon.ico" />" type="image/x-icon" /> + <link rel="shortcut icon" href="<g:resource dir="images" file="favicon.ico" />" type="image/x-icon" /> +</head> +<body> + <div id="login" class="container"> + + <div class="row"> + <div class="navbar-brand"> + <a href="<g:createLink uri="/" absolute="true" />">BABSI</a> + </div> + </div> + <div class="row"> + <section id="content"> + <div class="row"></div> + <div class="panel panel-default"> + <div class="panel-heading"> + <g:layoutTitle /> + </div> + <div class="panel-body"> + <g:layoutBody /> + </div> + </div> + </section> + </div> + </div> + <r:layoutResources /> + <script type="text/javascript" + src="<g:resource dir="js" file="bootstrap.js" />"></script> +</body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/layouts/main.gsp b/babsi/BabsiWeb/grails-app/views/layouts/main.gsp new file mode 100644 index 0000000000000000000000000000000000000000..a664f12a3ed526e97ded7ec21fb0cc0cb4cd2446 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/layouts/main.gsp @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="UTF-8" /> +<meta name="viewport" content="width=device-width, initial-scale=1.0" /> +<title><g:layoutTitle /></title> +<jq:resources /> +<r:layoutResources /> +<link href="<g:resource dir="css" file="errors.css" />" + rel="stylesheet" /> +<link href="<g:resource dir="css" file="mobile.css" />" + rel="stylesheet" /> +<link href="<g:resource dir="css" file="bootstrap.css" />" + rel="stylesheet" /> +<link href="<g:resource dir="css" file="babsi.css" />" rel="stylesheet" /> + + +<!-- iOS Support - Ja, wirklich... --> +<link rel="apple-touch-icon" href="<g:resource dir="images" file="apple-touch-icon.png" />" /> +<link rel="apple-touch-icon" sizes="76x76" href="<g:resource dir="images" file="apple-touch-icon-ipad.png" />" /> +<link rel="apple-touch-icon" sizes="120x120" href="<g:resource dir="images" file="apple-touch-icon-retina.png" />" /> +<link rel="apple-touch-icon" sizes="152x152" href="<g:resource dir="images" file="apple-touch-icon-retina.png" />" /> + +<meta name="apple-mobile-web-app-capable" content="yes" /> +<meta name="apple-mobile-web-app-status-bar-style" content="black" /> + + +<link rel="icon" href="<g:resource dir="images" file="favicon.ico" />" type="image/x-icon" /> +<link rel="shortcut icon" href="<g:resource dir="images" file="favicon.ico" />" type="image/x-icon" /> + + +</head> +<body> + <div class="container"> + + <div class="row"> + <div class="navbar-brand"> + <a href="<g:createLink uri="/" absolute="true" />">BABSI</a> + </div> + + <div id="headmenu"> + <a href=<g:createLink controller="user" action="edit" id="${session.getAttribute("userID")}" /> class="btn btn-default">${message(code:'nav.edituserdata')}</a> + <a href=<g:createLink controller="auth" action="signOut" /> class="btn btn-danger">${message(code:'nav.logout')}</a> + + </div> +<%-- <button type="button" class="btn navbar-btn" data-toggle="collapse"--%> +<%-- data-target="#sidebar">TOOGLE--%> + <span class="sr-only"> +<%-- Toggle navigation--%> + </span> +<%-- <span class="icon-bar"></span> <span class="icon-bar"></span> --%> +<%-- <span class="icon-bar"></span>--%> +<%-- </button>--%> + </div> + <div class="row"> + <header id="sidebar" class="col-md-2"> + + <div class="row"> +<%-- <ul class="nav navbar-inverse nav-stacked" role="navigation">--%> + + <nav:primary class="nav navbar-inverse nav-stacked" scope="app" /> + </div> + </header> + <section id="content" class="col-md-10"> + <div class="row"></div><a name="content"></a> + <div class="panel panel-default"> + <div class="panel-heading"> + <g:layoutTitle /> + </div> + <div class="panel-body"> + <g:layoutBody /> + </div> + </div> + </section> + </div> + </div> + <r:layoutResources /> + <script type="text/javascript" + src="<g:resource dir="js" file="bootstrap.js" />"></script> + <script type="text/javascript" + src="<g:resource dir="js" file="babsi.js" />"></script> +</body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/station/_form.gsp b/babsi/BabsiWeb/grails-app/views/station/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..b94b1d64a792ac698d0917066d73eb6ac64096d1 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/station/_form.gsp @@ -0,0 +1,29 @@ +<%@ page import="cau.swp.babsi.Station" %> + + + +<div class="fieldcontain ${hasErrors(bean: stationInstance, field: 'name', 'error')} required"> + <label for="name"> + <g:message code="station.name.label" default="Name" /> + <span class="required-indicator">*</span> + </label> + <g:textField name="name" pattern="${stationInstance.constraints.name.matches}" required="" value="${stationInstance?.name}"/> +</div> + +<%--<div class="fieldcontain ${hasErrors(bean: stationInstance, field: 'wardrounds', 'error')} ">--%> +<%-- <label for="wardrounds">--%> +<%-- <g:message code="station.wardrounds.label" default="Wardrounds" />--%> +<%-- --%> +<%-- </label>--%> +<%-- --%> +<%--<ul class="one-to-many">--%> +<%--<g:each in="${stationInstance?.wardrounds?}" var="w">--%> +<%-- <li><g:link controller="wardRound" action="show" id="${w.id}">${w?.encodeAsHTML()}</g:link></li>--%> +<%--</g:each>--%> +<%--<li class="add">--%> +<%--<g:link controller="wardRound" action="create" params="['station.id': stationInstance?.id]">${message(code: 'default.add.label', args: [message(code: 'wardRound.label', default: 'WardRound')])}</g:link>--%> +<%--</li>--%> +<%--</ul>--%> +<%----%> +<%--</div>--%> + diff --git a/babsi/BabsiWeb/grails-app/views/station/create.gsp b/babsi/BabsiWeb/grails-app/views/station/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..a6238ac32620fd056856a56e8b0cde825dc6e65b --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/station/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="cau.swp.babsi.Station" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'station.label', default: 'Station')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-station" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-station" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${stationInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${stationInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/station/edit.gsp b/babsi/BabsiWeb/grails-app/views/station/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..f7a74ffe06e71222f1f4572911e1fd4b3c3c5add --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/station/edit.gsp @@ -0,0 +1,43 @@ +<%@ page import="cau.swp.babsi.Station" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'station.label', default: 'Station')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-station" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-station" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${stationInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${stationInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${stationInstance?.id}" /> + <g:hiddenField name="version" value="${stationInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/station/list.gsp b/babsi/BabsiWeb/grails-app/views/station/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..8a1d0b793cfe52b97d15a1bfccc2843ced83624c --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/station/list.gsp @@ -0,0 +1,46 @@ + +<%@ page import="cau.swp.babsi.Station" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'station.label', default: 'Station')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-station" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-station" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="name" title="${message(code: 'station.name.label', default: 'Name')}" /> + + </tr> + </thead> + <tbody> + <g:each in="${stationInstanceList}" status="i" var="stationInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${stationInstance.id}">${fieldValue(bean: stationInstance, field: "name")}</g:link></td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${stationInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/station/show.gsp b/babsi/BabsiWeb/grails-app/views/station/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..2ef5491a94d29cc8e21aea8f4b33a6b404737d93 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/station/show.gsp @@ -0,0 +1,56 @@ + +<%@ page import="cau.swp.babsi.Station" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'station.label', default: 'Station')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-station" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-station" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list station"> + + <g:if test="${stationInstance?.name}"> + <li class="fieldcontain"> + <span id="name-label" class="property-label"><g:message code="station.name.label" default="Name" /></span> + + <span class="property-value" aria-labelledby="name-label"><g:fieldValue bean="${stationInstance}" field="name"/></span> + + </li> + </g:if> + + <g:if test="${stationInstance?.wardrounds}"> + <li class="fieldcontain"> + <span id="wardrounds-label" class="property-label"><g:message code="station.wardrounds.label" default="Wardrounds" /></span> + + <g:each in="${stationInstance.wardrounds}" var="w"> + <span class="property-value" aria-labelledby="wardrounds-label"><g:link controller="wardRound" action="show" id="${w.id}">${w?.encodeAsHTML()}</g:link></span> + </g:each> + + </li> + </g:if> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${stationInstance?.id}" /> + <g:link class="edit" action="edit" id="${stationInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/statistic/index.gsp b/babsi/BabsiWeb/grails-app/views/statistic/index.gsp new file mode 100644 index 0000000000000000000000000000000000000000..201364d0668a324949f1b53176e3a97f20ffc139 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/statistic/index.gsp @@ -0,0 +1,566 @@ +<%-- + Statistiken sind auch mit einer leichten Variante von "Convention over Configuration" + implementiert. + + + ////////////////////////////////////////////////////// + //////// Basis HTML-Struktur: + ////////////////////////////////////////////////////// + + <div id="{Eindeutige ID, z.B. statistik1}"> //wrapper + + <input type="hidden" class="url" value="{URL von der die JSON Daten bezogen werden (ohne Parameter)}" /> + + // Kopfbereich mit Einstellungen für die Statistik: + <div class="statisticControls"> + + // optional - Erstellt einen Button für die Auswahl eines Anzeige-Zeitraumes + <span class="statisticDateControl"> + <input type="hidden" name="startDate" value="${startDate}" /> + <input type="hidden" name="endDate" value="${endDate}" /> + <button name="date" class="dateRange">{BESCHRIFTUNG}</button> + </span> + + // optional - Erstellt ein dropdown, was die Anzeige auf eine bestimmte ID des Datensatzes beschränkt + <span class="idSelector"> + <select> + <option value="{ID}" selected="selected">{BESCHREIBUNG}</option> // einer sollte gesetzt sein + <option value="{ID}">{BESCHREIBUNG}</option> + </select> + </span> + + </div> + + // div in dem die Statistik geplottet wird + // Höhe ist nötig! Breite optional + // Weglassen der Breite erlaubt dynamisch berechnete Breite (Handysupport) + <div class="placeholder" style="width: 500px; height: 300px;"> + </div> + </div> + + + ////////////////////////////////////////////////////// + //////// Bessere Struktur für einheitliches Layout: + ////////////////////////////////////////////////////// + + <div class="panel panel-default" style="width: 550px;"> // optional + + <div class="panel-body" id="{Eindeutige ID, z.B. statistik1}"> + + <input type="hidden" class="url" value="{URL von der die JSON Daten bezogen werden (ohne Parameter)}" /> + + // Kopfbereich mit Einstellungen für die Statistik: + <div class="statisticControls clearfix"> + + // optional - Erstellt einen Button für die Auswahl eines Anzeige-Zeitraumes + <span class="statisticDateControl"> + <input type="hidden" name="startDate" value="${startDate}" /> + <input type="hidden" name="endDate" value="${endDate}" /> + <button name="date" class="dateRange btn btn-primary">Zeitintervall wählen</button> + </span> + + // optional - Erstellt ein dropdown, was die Anzeige auf eine bestimmte ID des Datensatzes beschränkt + <span class="idSelector"> + <label for="stationSelect" class="pull-left" style="padding-top: 5px;">Station:</label> + <select class="form-control controls pull-left" style="max-width: 150px; margin-right: 10px"> + <g:each var="station" in="${stations}"><option value="${station.id}">${station.name}</option></g:each> + </select> + </span> + + </div> + + // div in dem die Statistik geplottet wird + <div class="placeholder" style="width: 500px; height: 300px;"> + <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" + border="0" alt="Loading..." title="Loading..." /> + </div> + </div> + </div> + + + ////////////////////////////////////////////////////// + //////// Javascript + ////////////////////////////////////////////////////// + + <script> + var statistic = new Statistic("#{Eindeutige ID des Wrappers, z.B. statistik1}", {Flot Options-Objekt}); + + statistic.paint(); // bezieht die Daten von der URL (verstecktes Feld), hängt die bekannten Parameter an (z.B: ?id=1), + lädt die Daten via Ajax und zeichnet damit die Statistik in den entsprechenden div + </script> + +--%> +<%@ page import="cau.swp.babsi.Station" %> +<%@ page import="cau.swp.babsi.User" %> +<!DOCTYPE html> +<html> +<head> +<meta name="layout" content="main" /> + +<script src="<g:resource dir="js" file="moment.min.js" />"></script> +<script src="<g:resource dir="js" file="daterangepicker.js" />"></script> + +<title>${message(code: 'statistic.label', default: 'Statistics')}</title> +</head> +<body> + + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + </ul> + </div> + <%-- <flot:resources includeJQueryLib="false" plugins="['pie','categories']" />--%> + + <script src="<g:resource dir="js/flot" file="jquery.flot.min.js" />"></script> + <script src="<g:resource dir="js/flot" file="jquery.flot.categories.min.js" />"></script> + <script src="<g:resource dir="js/flot" file="jquery.flot.axislabels.js" />"></script> + <script src="<g:resource dir="js/flot" file="jquery.flot.crosshair.js" />"></script> + <script src="<g:resource dir="js/flot" file="jquery.flot.time.js" />"></script> + + <g:javascript> + var loadingGif = '<img src="${createLinkTo(dir:'images',file:'spinner.gif')}" border="0" alt="<g:message code="statistics.loading" />" title="<g:message code="statistics.loading" />" />'; + + + + + var statistic1 = new Statistic('#statistic1', { + series: { + bars: { + show: true, + barWidth: 0.6, + align: "center" + } + }, + yaxis: { + position: 'left', + axisLabel: '<g:message code="statistics.statistic1.ylabel" />', + axisLabelUseCanvas: true + }, + grid: { + hoverable: true + }, + crosshair: { + mode: 'x' + }, + xaxis: { + mode: "categories", + tickLength: 0, + axisLabelUseCanvas: true, + axisLabel: "<g:message code="statistics.statistic1.xlabel" />", + axisLabelPadding: 10 + } + }); + + var statistic2 = new Statistic('#statistic2', { + series: { + points: { + show: true + }, + lines: { + show: true + } + }, + grid: { + hoverable: true + }, + crosshair: { + mode: 'x' + }, + yaxis: { + axisLabelUseCanvas: true, + axisLabel: "<g:message code="statistics.statistic2.ylabel" />" + }, + grid: { + hoverable: true + }, + xaxis: { + axisLabelUseCanvas: true, + axisLabel: "<g:message code="statistics.statistic2.xlabel" />", + axisLabelPadding: 10 + } + }); + + var statistic3 = new Statistic('#statistic3', { + series: { + points: { + show: true + }, + lines: { + show: true + } + }, + crosshair: { + mode: 'x' + }, + grid: { + hoverable: true + }, + xaxis: { + axisLabelUseCanvas: true, + axisLabel: "<g:message code="statistics.statistic3.xlabel" />", + axisLabelPadding: 10, + tickFormatter: function(data, axis) { +<%-- console.log(data)--%> + var date = new Date(data*1000); // akzeptiert die direkten Controllerdaten nicht +<%-- console.log(date)--%> + return date.getDate()+"."+date.getMonth()+"."+date.getFullYear(); + } + }, + yaxis: { + axisLabelUseCanvas: true, + axisLabel: "<g:message code="statistics.statistic3.ylabel" />", + tickFormatter: function (minutes, axis) { + var hours = Math.round(minutes / 60); + var minutes = Math.round(minutes - (hours * 60)); + var time =""; + if(hours > 0){ + if (hours < 10) hours = "0"+hours; + time += hours+"h "; + } + if(minutes > 0) { + if(minutes < 10) minutes = "0"+minutes; + time += minutes+"min"; + } + return time; + } + } + }); + + $(document).ready(function(){ + statistic1.paint(); + statistic2.paint(); + statistic3.paint(); + }); + + function Statistic(div, options){ + this.options = options; + + var dateRangePicker = null; + var instance = this; + + this.getDiv = function(){ + return $(div); + } + + this.getPlaceholder = function() { + return instance.getDiv().find(".placeholder"); + } + + this.baseUrl = function(value){ + if(value !== undefined) return instance.getDiv().find(".url").val(value); + return instance.getDiv().find(" .url").val(); + } + + this.getDateRangeControls = function() { + return $(div+" .statisticDateControl"); + } + + // Date Range + this.hasDateRange = function(){ + return !!instance.getDateRangeControls().length; + } + + this.getStartDateField = function(){ + return instance.getDateRangeControls().find("input.startDate"); + } + this.getEndDateField = function(){ + return instance.getDateRangeControls().find("input.endDate"); + } + + this.startDate = function(value) { + if(value !== undefined) return instance.getEndDateField().val(value); + return instance.getStartDateField().val(); + } + + this.endDate = function(value){ + if(value !== undefined) return instance.getEndDateField().val(value); + return instance.getEndDateField().val(); + } + + // ID Selector + this.getIDSelector = function(){ + return instance.getDiv().find(".idSelector select"); //:selected + } + this.hasIDSelector = function(){ + return !!instance.getIDSelector().length; + } + this.selectedId = function(id){ + if(id !== undefined) return instance.getIDSelector().val(id); + return instance.getIDSelector().val(); + } + + + this.createDateRangePicker = function(){ + if(dateRangePicker != null) return dateRangePicker; + + dateRangePicker = instance.getDiv().find(".dateRange").daterangepicker( + { + startDate: new Date(Math.round(instance.startDate())), // javascript Date() ist verrückt... int->int=funktioniert + endDate: new Date(Math.round(instance.endDate())), + minDate: '01/01/2013', + showDropdowns: true, + showWeekNumbers: true, + timePicker: false, + timePickerIncrement: 1, + timePicker12Hour: true, + ranges: { + 'Letze 7 Tage': [moment().subtract('days', 6), moment()], + 'Letzte 30 Tage': [moment().subtract('days', 29), moment()], + 'Dieser Monat': [moment().startOf('month'), moment().endOf('month')], + 'Letzter Monat': [moment().subtract('month', 1).startOf('month'), moment().subtract('month', 1).endOf('month')] + }, + opens: 'right', + buttonClasses: ['btn btn-default'], + applyClass: 'btn-small btn-success', + cancelClass: 'btn-small', + format: 'DD.MM.YYYY', + separator: ' bis ', + locale: { + applyLabel: 'OK', + cancelLabel: 'Abbrechen', + fromLabel: 'von', + toLabel: 'bis', + customRangeLabel: 'eigene Auswahl', + daysOfWeek: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr','Sa'], + monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], + firstDay: 1 + } + }, + function(start, end) { // both moment.js objects + + instance.startDate(start.unix()*1000); + instance.endDate(end.unix()*1000); + + instance.paint(); + }); + }; + + function showTooltip(x, y, contents) { // quelle: flotcharts.org beispiel + $("<div id='tooltip'>" + contents + "</div>").css({ + position: "absolute", + display: "none", + top: y + 5, + left: x + 5, + border: "1px solid #fdd", + padding: "2px", + "background-color": "#fee", + opacity: 0.80 + }).appendTo("body").fadeIn(200); + } + + instance.getPlaceholder().bind("plothover", function (event, pos, item) { + //if ($("#enableTooltip:checked").length > 0) { + if (item) { + if (previousPoint != item.dataIndex) { + + previousPoint = item.dataIndex; + + $("#tooltip").remove(); + var x = item.datapoint[0];//.toFixed(2); + var y = item.datapoint[1];//.toFixed(2); + + showTooltip(item.pageX, item.pageY, + item.series.yaxis.options.axisLabel + ": " + + item.series.yaxis.tickFormatter(y, item.series)); + } + } else { + $("#tooltip").remove(); + previousPoint = null; + } + //} + }); + + instance.getIDSelector().change(function() + { + instance.paint(); + }); + + var waitForFinalEvent = (function () { // credit: brahn http://stackoverflow.com/questions/2854407 + var timers = {}; + return function (callback, ms, uniqueId) { + if (!uniqueId) { + uniqueId = "Don't call this twice without a uniqueId"; + } + if (timers[uniqueId]) { + clearTimeout (timers[uniqueId]); + } + timers[uniqueId] = setTimeout(callback, ms); + }; + })(); + + + // responsiveness + + + var margin = 100; + + $(window).resize(function () { + + var maxHeight = instance.getDiv().height(); + var maxWidth = instance.getDiv().width(); + waitForFinalEvent(function(){ +<%-- console.log("Resize detected!");--%> + var winWidth = $(window).width(); + +<%-- console.log("window width: "+winWidth+" compare:"+instance.getPlaceholder().width()+margin);--%> + if(winWidth < (instance.getPlaceholder().width()+margin) || instance.getPlaceholder().width() < maxWidth){ +<%-- console.log("Resize needed!");--%> + var newWidth = maxWidth; + var newHeight = maxHeight; + + + if(winWidth != maxWidth+margin){ + newWidth = winWidth-margin; + if(newWidth > maxWidth) newWidth = maxWidth; + //original height / original width x new width = new height + newHeight = maxHeight/maxWidth*newWidth; + + instance.getPlaceholder().css("width", newWidth); + instance.getPlaceholder().css("height", newHeight); + instance.paint(); + return; + } +<%-- console.log("no need to resize");--%> + //instance.getPlaceholder().css("width", newWidth) + } + }, 500, "id:"+instance.div); + }); + + this.buildUrl = function(){ + var params = {}; + + if(instance.hasDateRange()){ + params['startDate'] = instance.startDate(); + params['endDate'] = instance.endDate(); + } + if(instance.hasIDSelector()){ + params['id'] = instance.selectedId(); + } +<%-- console.log(params);--%> +<%-- console.log("parsed: "); console.log($.param(params));--%> + return instance.baseUrl()+"?"+$.param(params); + } + + + this.paint = function(){ + instance.getPlaceholder().html(loadingGif); +<%-- console.log("Loading JSON Data from ");--%> +<%-- console.log(instance.buildUrl());--%> + $.getJSON(instance.buildUrl(), function(controllerData){ + + instance.createDateRangePicker(); + if(controllerData.length < 1){ + + instance.getPlaceholder().html('<div class="alert alert-danger" style="margin-top: 10px;"><g:message code="statistics.nodata" /></div>'); + return; + } + + instance.getPlaceholder().html(""); + if(typeof options !== 'undefined') { + instance.getPlaceholder().plot([controllerData], options); + } else { + instance.getPlaceholder().plot([controllerData]); + } + }); + + } + } + </g:javascript> + + <div class="panel panel-default" style="min-width: 300px; margin-top: 10px;"> + <div class="panel-body" id="statistic1"> + <input type="hidden" class="url" value="<g:createLink absolute="true" action="stationInterventions" />" /> + <div class="statisticControls clearfix"> + <span class="statisticDateControl"> + <input type="hidden" class="startDate" value="${startDate}" /> + <input type="hidden" class="endDate" value="${endDate}" /> + <button name="date" class="dateRange btn btn-primary"><g:message code="statistics.selectTime" /></button> + + </span> + <span class="idSelector"> + <label for="stationSelect" class="pull-left" style="padding-top: 5px;">Station:</label> + <select name="stationSelect" class="form-control controls pull-left" style="max-width: 150px; margin-right: 10px"> + <g:each var="station" in="${stations}"><option value="${station.id}">${station.name}</option></g:each> + </select> + </span> + + </div> + <div class="placeholder" style="height: 300px;"> + <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" + border="0" alt="<g:message code="statistics.loading" />" title="<g:message code="statistics.loading" />" /> + </div> + </div> + </div> + + + <div class="panel panel-default" style="min-width: 300px;"> + <div class="panel-body" id="statistic2"> + <input type="hidden" class="url" value="<g:createLink absolute="true" action="cycleInterventions" />" /> + <div class="statisticControls clearfix"> + <span class="statisticDateControl"> + <input type="hidden" class="startDate" value="${startDate}" /> + <input type="hidden" class="endDate" value="${endDate}" /> + + <button name="date" class="dateRange btn btn-primary"><g:message code="statistics.selectTime" /></button> + </span> + </div> + <div class="placeholder" style="height: 300px;"> + <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" + border="0" alt="<g:message code="statistics.loading" />" title="<g:message code="statistics.loading" />" /> + </div> + + </div> + </div> + + + + <div class="panel panel-default" style="min-width: 300px;"> + <div class="panel-body" id="statistic3"> + <input type="hidden" class="url" value="<g:createLink absolute="true" action="userDurations" id="" />" /> + <div class="statisticControls clearfix"> + + <span class="idSelector"> + <select name="userSelect" class="form-control controls pull-left" style="max-width: 150px; margin-right: 10px"> + <g:each var="user" in="${users}"><option value="${user.id}" <g:if test="${statistic3Id == user.id}">selected="selected"</g:if>>${user.username}</option></g:each> + </select> + </span> + </div> + <div class="placeholder" style="height: 300px;"> + <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" + border="0" alt="<g:message code="statistics.loading" />" title="<g:message code="statistics.loading" />" /> + </div> + </div> + </div> + + + <style type="text/css"> + .yaxisLabel { + top: 50%; + left: 15px; + margin-left: -20px; + transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -webkit-transform: rotate(-90deg); + transform-origin: 0 0; + -o-transform-origin: 0 0; + -ms-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -webkit-transform-origin: 0 0; + } + + #placeholder { + margin-left: 10px; + } + + canvas.flot-base { + position: relative !important; + } + </style> + + + <g:javascript src="moment.min.js" /> + <g:javascript src="daterangepicker.js" /> +</body> +</html> \ No newline at end of file diff --git a/babsi/BabsiWeb/grails-app/views/user/_form.gsp b/babsi/BabsiWeb/grails-app/views/user/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..6c76b6562034fa4ba0d7531b8bd7a9d52d13df8f --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/user/_form.gsp @@ -0,0 +1,38 @@ +<%@ page import="cau.swp.babsi.User" %> + + + +<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'username', 'error')} required"> + <label for="username"> + <g:message code="user.username.label" default="Username" /> + <span class="required-indicator">*</span> + </label> + <g:textField name="username" required="" value="${userInstance?.username}"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'passwordHash', 'error')} "> + <label for="passwordHash"> + <g:message code="user.password.label" default="Password" /> + + </label> + <g:passwordField name="pw1" placeholder="${message (code:"user.newpassword.label", default:"new password")}"/> + + <g:passwordField name="pw2" placeholder="${message (code:"user.newpassword.repeat", default:"re-enter password")}"/> +</div> + +<%--<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'permissions', 'error')} "> + <label for="permissions"> + <g:message code="user.permissions.label" default="Permissions" /> + + </label> + +</div>--%> + +<%--<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'roles', 'error')} "> + <label for="roles"> + <g:message code="user.roles.label" default="Roles" /> + + </label> + <g:select name="roles" from="${babsi.Role.list()}" multiple="multiple" optionKey="id" size="5" value="${userInstance?.roles*.id}" class="many-to-many"/> +</div>--%> + diff --git a/babsi/BabsiWeb/grails-app/views/user/create.gsp b/babsi/BabsiWeb/grails-app/views/user/create.gsp new file mode 100644 index 0000000000000000000000000000000000000000..eb4c70bdbf7aba311c24c99586d2a3314be5501e --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/user/create.gsp @@ -0,0 +1,39 @@ +<%@ page import="cau.swp.babsi.User" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" /> + <title><g:message code="default.create.label" args="[entityName]" /></title> + </head> + <body> + <a href="#create-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="create-user" class="content scaffold-create" role="main"> + <h1><g:message code="default.create.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${userInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${userInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form action="save" > + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + <g:submitButton action="create" name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/user/edit.gsp b/babsi/BabsiWeb/grails-app/views/user/edit.gsp new file mode 100644 index 0000000000000000000000000000000000000000..3a22252b51824627df82cba762a84ff08a396f56 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/user/edit.gsp @@ -0,0 +1,45 @@ +<%@ page import="cau.swp.babsi.User" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" /> + <title><g:message code="default.edit.label" args="[entityName]" /></title> + </head> + <body> + <a href="#edit-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="edit-user" class="content scaffold-edit" role="main"> + <h1><g:message code="default.edit.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <g:hasErrors bean="${userInstance}"> + <ul class="errors" role="alert"> + <g:eachError bean="${userInstance}" var="error"> + <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> + </g:eachError> + </ul> + </g:hasErrors> + <g:form method="post" > + <g:hiddenField name="id" value="${userInstance?.id}" /> + <g:hiddenField name="version" value="${userInstance?.version}" /> + <fieldset class="form"> + <g:render template="form"/> + </fieldset> + <fieldset class="buttons"> + + <g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /> + + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" formnovalidate="" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/user/list.gsp b/babsi/BabsiWeb/grails-app/views/user/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..39d1154a95e71677fcca05fc707cf1e3b3edbc39 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/user/list.gsp @@ -0,0 +1,50 @@ + +<%@ page import="cau.swp.babsi.User" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="list-user" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + <g:sortableColumn property="username" title="${message(code: 'user.username.label', default: 'Username')}" /> + +<%-- <g:sortableColumn property="passwordHash" title="${message(code: 'user.passwordHash.label', default: 'Password Hash')}" />--%> + + </tr> + </thead> + <tbody> + <g:each in="${userInstanceList}" status="i" var="userInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${userInstance.id}">${fieldValue(bean: userInstance, field: "username")}</g:link></td> + +<%-- <td>${fieldValue(bean: userInstance, field: "passwordHash")}</td>--%> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${userInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/user/show.gsp b/babsi/BabsiWeb/grails-app/views/user/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..92f7ffaba1dbd09ab0e25df8a103fe47259fe4ad --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/user/show.gsp @@ -0,0 +1,74 @@ + +<%@ page import="cau.swp.babsi.User" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> + <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li> + </ul> + </div> + <div id="show-user" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list user"> + + <g:if test="${userInstance?.username}"> + <li class="fieldcontain"> + <span id="username-label" class="property-label"><g:message code="user.username.label" default="Username" /></span> + + <span class="property-value" aria-labelledby="username-label"><g:fieldValue bean="${userInstance}" field="username"/></span> + + </li> + </g:if> + +<%-- <g:if test="${userInstance?.passwordHash}">--%> +<%-- <li class="fieldcontain">--%> +<%-- <span id="passwordHash-label" class="property-label"><g:message code="user.passwordHash.label" default="Password Hash" /></span>--%> +<%-- --%> +<%-- <span class="property-value" aria-labelledby="passwordHash-label"><g:fieldValue bean="${userInstance}" field="passwordHash"/></span>--%> +<%-- --%> +<%-- </li>--%> +<%-- </g:if>--%> + +<%-- <g:if test="${userInstance?.permissions}">--%> +<%-- <li class="fieldcontain">--%> +<%-- <span id="permissions-label" class="property-label"><g:message code="user.permissions.label" default="Permissions" /></span>--%> +<%-- --%> +<%-- <span class="property-value" aria-labelledby="permissions-label"><g:fieldValue bean="${userInstance}" field="permissions"/></span>--%> +<%-- --%> +<%-- </li>--%> +<%-- </g:if>--%> +<%-- --%> +<%-- <g:if test="${userInstance?.roles}">--%> +<%-- <li class="fieldcontain">--%> +<%-- <span id="roles-label" class="property-label"><g:message code="user.roles.label" default="Roles" /></span>--%> +<%-- --%> +<%-- <g:each in="${userInstance.roles}" var="r">--%> +<%-- <span class="property-value" aria-labelledby="roles-label"><g:link controller="role" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link></span>--%> +<%-- </g:each>--%> +<%-- --%> +<%-- </li>--%> +<%-- </g:if>--%> + + </ol> + <g:form> + <fieldset class="buttons"> + <g:hiddenField name="id" value="${userInstance?.id}" /> + <g:link class="edit" action="edit" id="${userInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> + <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /> + </fieldset> + </g:form> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/wardRound/_form.gsp b/babsi/BabsiWeb/grails-app/views/wardRound/_form.gsp new file mode 100644 index 0000000000000000000000000000000000000000..18dc1e163aa095b3fa74d6c27abba10dd0b0765f --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/wardRound/_form.gsp @@ -0,0 +1,53 @@ +<%@ page import="cau.swp.babsi.wardround.WardRound" %> + + + +<div class="fieldcontain ${hasErrors(bean: wardRoundInstance, field: 'createdBy', 'error')} "> + <label for="createdBy"> + <g:message code="wardRound.createdBy.label" default="Created By" /> + + </label> + <g:select id="createdBy" name="createdBy.id" from="${cau.swp.babsi.User.list()}" optionKey="id" value="${wardRoundInstance?.createdBy?.id}" class="many-to-one" noSelection="['null': '']"/> +</div> + +<div class="fieldcontain ${hasErrors(bean: wardRoundInstance, field: 'checklists', 'error')} "> + <label for="checklists"> + <g:message code="wardRound.checklists.label" default="Checklists" /> + + </label> + +<ul class="one-to-many"> +<g:each in="${wardRoundInstance?.checklists?}" var="c"> + <li><g:link controller="checklist" action="show" id="${c.id}">${c?.encodeAsHTML()}</g:link></li> +</g:each> +<li class="add"> +<g:link controller="checklist" action="create" params="['wardRound.id': wardRoundInstance?.id]">${message(code: 'default.add.label', args: [message(code: 'checklist.label', default: 'Checklist')])}</g:link> +</li> +</ul> + +</div> + +<div class="fieldcontain ${hasErrors(bean: wardRoundInstance, field: 'date', 'error')} required"> + <label for="date"> + <g:message code="wardRound.date.label" default="Date" /> + <span class="required-indicator">*</span> + </label> + <g:datePicker name="date" precision="day" value="${wardRoundInstance?.date}" /> +</div> + +<div class="fieldcontain ${hasErrors(bean: wardRoundInstance, field: 'durationInSeconds', 'error')} required"> + <label for="durationInSeconds"> + <g:message code="wardRound.durationInSeconds.label" default="Duration In Seconds" /> + <span class="required-indicator">*</span> + </label> + <g:field name="durationInSeconds" type="number" value="${wardRoundInstance.durationInSeconds}" required=""/> +</div> + +<div class="fieldcontain ${hasErrors(bean: wardRoundInstance, field: 'station', 'error')} required"> + <label for="station"> + <g:message code="wardRound.station.label" default="Station" /> + <span class="required-indicator">*</span> + </label> + <g:select id="station" name="station.id" from="${cau.swp.babsi.Station.list()}" optionKey="id" required="" value="${wardRoundInstance?.station?.id}" class="many-to-one"/> +</div> + diff --git a/babsi/BabsiWeb/grails-app/views/wardRound/list.gsp b/babsi/BabsiWeb/grails-app/views/wardRound/list.gsp new file mode 100644 index 0000000000000000000000000000000000000000..becbe95d83a88750dd6a86d8a3dc0a0e74d99acd --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/wardRound/list.gsp @@ -0,0 +1,60 @@ + +<%@ page import="cau.swp.babsi.wardround.WardRound" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'wardRound.label', default: 'WardRound')}" /> + <title><g:message code="default.list.label" args="[entityName]" /></title> + </head> + <body> + <a href="#list-wardRound" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> +<%-- <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>--%> + </ul> + </div> + <div id="list-wardRound" class="content scaffold-list" role="main"> + <h1><g:message code="default.list.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <table> + <thead> + <tr> + + + + <g:sortableColumn property="date" title="${message(code: 'wardRound.date.label', default: 'Date')}" /> + + <th><g:message code="wardRound.createdBy.label" default="Created By" /></th> + + <g:sortableColumn property="durationInSeconds" title="${message(code: 'wardRound.durationInSeconds.label', default: 'Duration In Minutes')}" /> + + <th><g:message code="wardRound.station.label" default="Station" /></th> + + </tr> + </thead> + <tbody> + <g:each in="${wardRoundInstanceList}" status="i" var="wardRoundInstance"> + <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> + + <td><g:link action="show" id="${wardRoundInstance.id}"><g:formatDate format="dd.MM.yyyy" date="${wardRoundInstance.date}" /></g:link></td> + + <td>${fieldValue(bean: wardRoundInstance, field: "createdBy")}</td> + + <td>${(int)(wardRoundInstance.durationInSeconds / 60)}</td> + + <td>${fieldValue(bean: wardRoundInstance, field: "station")}</td> + + </tr> + </g:each> + </tbody> + </table> + <div class="pagination"> + <g:paginate total="${wardRoundInstanceTotal}" /> + </div> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/grails-app/views/wardRound/show.gsp b/babsi/BabsiWeb/grails-app/views/wardRound/show.gsp new file mode 100644 index 0000000000000000000000000000000000000000..78085b69f3904662ae4bbbb5e9c89083ca8350d9 --- /dev/null +++ b/babsi/BabsiWeb/grails-app/views/wardRound/show.gsp @@ -0,0 +1,83 @@ + +<%@ page import="cau.swp.babsi.wardround.WardRound" %> +<!DOCTYPE html> +<html> + <head> + <meta name="layout" content="main"> + <g:set var="entityName" value="${message(code: 'wardRound.label', default: 'WardRound')}" /> + <title><g:message code="default.show.label" args="[entityName]" /></title> + </head> + <body> + <a href="#show-wardRound" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a> + <div class="nav" role="navigation"> + <ul> + <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li> + <li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li> +<%-- <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>--%> + </ul> + </div> + <div id="show-wardRound" class="content scaffold-show" role="main"> + <h1><g:message code="default.show.label" args="[entityName]" /></h1> + <g:if test="${flash.message}"> + <div class="message" role="status">${flash.message}</div> + </g:if> + <ol class="property-list wardRound"> + + <g:if test="${wardRoundInstance?.createdBy}"> + <li class="fieldcontain"> + <span id="createdBy-label" class="property-label"><g:message code="wardRound.createdBy.label" default="Created By" /></span> + + <span class="property-value" aria-labelledby="createdBy-label"><g:link controller="user" action="show" id="${wardRoundInstance?.createdBy?.id}">${wardRoundInstance?.createdBy?.encodeAsHTML()}</g:link></span> + + </li> + </g:if> + + <g:if test="${wardRoundInstance?.checklists}"> + <li class="fieldcontain"> + <span id="checklists-label" class="property-label"><g:message code="wardRound.checklists.label" default="Checklists" /></span> + + <g:each in="${wardRoundInstance.checklists}" var="c"> + <span class="property-value" aria-labelledby="checklists-label"><g:link controller="checklist" action="show" id="${c.id}">${c?.encodeAsHTML()}</g:link></span> + </g:each> + + </li> + </g:if> + + <g:if test="${wardRoundInstance?.date}"> + <li class="fieldcontain"> + <span id="date-label" class="property-label"><g:message code="wardRound.date.label" default="Date" /></span> + + <span class="property-value" aria-labelledby="date-label"><g:formatDate format="dd.MM.yyyy" date="${wardRoundInstance?.date}" /></span> + + </li> + </g:if> + + <g:if test="${wardRoundInstance?.durationInSeconds}"> + <li class="fieldcontain"> + <span id="durationInSeconds-label" class="property-label"><g:message code="wardRound.durationInSeconds.label" default="Duration In Seconds" /></span> + + <span class="property-value" aria-labelledby="durationInSeconds-label"><g:fieldValue bean="${wardRoundInstance}" field="durationInSeconds"/></span> + + </li> + </g:if> + + <g:if test="${wardRoundInstance?.station}"> + <li class="fieldcontain"> + <span id="station-label" class="property-label"><g:message code="wardRound.station.label" default="Station" /></span> + + <span class="property-value" aria-labelledby="station-label"><g:link controller="station" action="show" id="${wardRoundInstance?.station?.id}">${wardRoundInstance?.station?.encodeAsHTML()}</g:link></span> + + </li> + </g:if> + + </ol> +<%-- <g:form>--%> +<%-- <fieldset class="buttons">--%> +<%-- <g:hiddenField name="id" value="${wardRoundInstance?.id}" />--%> +<%-- <g:link class="edit" action="edit" id="${wardRoundInstance?.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link>--%> +<%-- <g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" />--%> +<%-- </fieldset>--%> +<%-- </g:form>--%> + </div> + </body> +</html> diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIAddElementTest.java b/babsi/BabsiWeb/test/gui/babsi/GUIAddElementTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3f467d6dfe0bb653f03b7c4404eb1b5ae009d980 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIAddElementTest.java @@ -0,0 +1,213 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.hamcrest.core.IsEqual; +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +import com.sun.jna.StringArray; +/** + * Testet Das Anlegen, Löschen und die Navigation im Menü von Stationen, Interventionen, Infektionen und Antibiotika + * @author cDor + * + */ +public class GUIAddElementTest { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + private String[] objectStrings; + + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + + objectStrings = new String[4]; + objectStrings[0] = "Antibiotika"; + objectStrings[1] = "Stationen"; + objectStrings[2] = "Infektionen"; + objectStrings[3] = "Interventionen"; + + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + } + + + @Test + public void testGUIAddElementTest() throws Exception { + driver.get(baseUrl + "babsi"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + for(int i=0;i<objectStrings.length;i++){ + + //Teste Navigation + driver.findElement(By.linkText(objectStrings[i])).click(); + + assertEquals(objectStrings[i]+" Übersicht", driver.getTitle()); + + driver.findElement(By.linkText("Dashboard")).click(); + try { + assertEquals("Dashboard", driver.findElement(By.cssSelector("div.panel-heading")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText(objectStrings[i])).click(); + + driver.findElement(By.linkText(objectStrings[i]+" anlegen")).click(); + assertEquals(objectStrings[i]+" anlegen", driver.getTitle()); + driver.findElement(By.linkText(objectStrings[i]+" Übersicht")).click(); + + try { + + assertEquals(objectStrings[i]+" Übersicht", driver.findElement(By.cssSelector("h1")).getText()); + + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + //Teste anlegen + driver.findElement(By.linkText(objectStrings[i]+" anlegen")).click(); + driver.findElement(By.id("name")).clear(); + driver.findElement(By.id("name")).sendKeys("AnlegeTest10"); + driver.findElement(By.id("create")).click(); + try { + assertEquals(objectStrings[i]+" anzeigen", driver.findElement(By.cssSelector("h1")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + try { + assertEquals("AnlegeTest10", driver.findElement(By.cssSelector("span.property-value")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + //Teste bearbeiten + driver.findElement(By.linkText("Bearbeiten")).click(); + driver.findElement(By.id("name")).clear(); + driver.findElement(By.id("name")).sendKeys("AnlegeTest11"); + try { + assertEquals(objectStrings[i]+" bearbeiten", driver.findElement(By.cssSelector("h1")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.name("_action_update")).click(); + try { + assertEquals(objectStrings[i]+" anzeigen", driver.findElement(By.cssSelector("h1")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + try { + assertEquals("AnlegeTest11", driver.findElement(By.cssSelector("span.property-value")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + //Teste löschen + driver.findElement(By.name("_action_delete")).click(); + assertTrue(closeAlertAndGetItsText().matches("^Sind Sie sicher[\\s\\S]$")); + try { + + assertEquals(objectStrings[i]+" Übersicht", driver.getTitle()); + + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + //Teste anlegen und finden in der Übersicht + driver.findElement(By.linkText(objectStrings[i]+" anlegen")).click(); + driver.findElement(By.id("name")).clear(); + driver.findElement(By.id("name")).sendKeys("AnlegeTest30"); + driver.findElement(By.id("create")).click(); + driver.findElement(By.linkText(objectStrings[i]+" anlegen")).click(); + try { + assertEquals(objectStrings[i]+" anlegen", driver.findElement(By.cssSelector("h1")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + driver.findElement(By.linkText(objectStrings[i]+" Übersicht")).click(); + //Ist es nicht auf der ersten Seite, dann auf der nächsten + while(driver.findElements(By.linkText("AnlegeTest30")).isEmpty()) { + driver.findElement(By.linkText("Nächste")).click(); + } + + //Lösche das Element wieder + driver.findElement(By.linkText("AnlegeTest30")).click(); + driver.findElement(By.name("_action_delete")).click(); + assertTrue(closeAlertAndGetItsText().matches("^Sind Sie sicher[\\s\\S]$")); + + try { + + assertEquals(objectStrings[i]+" Übersicht", driver.findElement(By.cssSelector("h1")).getText()); + + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Dashboard")).click(); + try { + assertEquals("Dashboard", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + } + + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIBenutzerVerwaltung.java b/babsi/BabsiWeb/test/gui/babsi/GUIBenutzerVerwaltung.java new file mode 100644 index 0000000000000000000000000000000000000000..0df6231b53ae1dd0aa038f3084a0449f22a49ef4 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIBenutzerVerwaltung.java @@ -0,0 +1,162 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIBenutzerVerwaltung { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIBenutzerAnlegen() throws Exception { + driver.get(baseUrl + "babsi/user/list"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + try { + assertEquals("Benutzer Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Benutzer anlegen")).click(); + driver.findElement(By.id("username")).sendKeys("Maria"); + driver.findElement(By.id("pw1")).clear(); + driver.findElement(By.id("pw1")).sendKeys("bananashake"); + driver.findElement(By.id("pw2")).clear(); + driver.findElement(By.id("pw2")).sendKeys("bananashake"); + driver.findElement(By.id("create")).click(); + try { + assertEquals("Benutzer anzeigen", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + //Benutzer unique, dies ist die Überprüfung + driver.get(baseUrl + "babsi/user/list"); + try { + assertEquals("Benutzer Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Benutzer anlegen")).click(); + driver.findElement(By.id("username")).sendKeys("Maria"); + driver.findElement(By.id("pw1")).clear(); + driver.findElement(By.id("pw1")).sendKeys("bananenshake"); + driver.findElement(By.id("pw2")).clear(); + driver.findElement(By.id("pw2")).sendKeys("bananenshake"); + driver.findElement(By.id("create")).click(); + try { + assertEquals("Die Eigenschaft [Benutzername] des Typs [Benutzer] mit dem Wert [Maria] darf nur einmal vorkommen", driver.findElement(By.cssSelector("ul.errors > li")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + //Benutzer ändern + driver.get(baseUrl + "babsi/user/list"); + try { + assertEquals("Benutzer Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Maria")).click(); + try { + assertEquals("Benutzer anzeigen", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Bearbeiten")).click(); + driver.findElement(By.id("username")).clear(); + driver.findElement(By.id("username")).sendKeys("Anna"); + driver.findElement(By.id("pw1")).clear(); + driver.findElement(By.id("pw1")).sendKeys("bananashake"); + driver.findElement(By.id("pw2")).clear(); + driver.findElement(By.id("pw2")).sendKeys("bananashake"); + driver.findElement(By.name("_action_update")).click(); + try { + assertTrue(isElementPresent(By.cssSelector("div.message"))); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + + //Benutzer löschen + driver.get(baseUrl + "babsi/user/list"); + try { + assertEquals("Benutzer Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Anna")).click(); + try { + assertEquals("Benutzer anzeigen", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.name("_action_delete")).click(); + assertTrue(closeAlertAndGetItsText().matches("^Sind Sie sicher[\\s\\S]$")); + } + + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git "a/babsi/BabsiWeb/test/gui/babsi/GUIBenutzer\303\234bersicht.java" "b/babsi/BabsiWeb/test/gui/babsi/GUIBenutzer\303\234bersicht.java" new file mode 100644 index 0000000000000000000000000000000000000000..2ac4fe06aa9f6df8a95c2ae7282b95134c131637 --- /dev/null +++ "b/babsi/BabsiWeb/test/gui/babsi/GUIBenutzer\303\234bersicht.java" @@ -0,0 +1,87 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIBenutzerÜbersicht { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIBenutzerÜbersicht() throws Exception { + driver.get(baseUrl + "babsi/"); + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + driver.findElement(By.linkText("Benutzer")).click(); + try { + assertEquals("Benutzer Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIChecklistenanzeigen.java b/babsi/BabsiWeb/test/gui/babsi/GUIChecklistenanzeigen.java new file mode 100644 index 0000000000000000000000000000000000000000..13856f7b40d307c882648afd6c1f38a6365db10d --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIChecklistenanzeigen.java @@ -0,0 +1,89 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIChecklistenanzeigen { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIChecklistenanzeigen() throws Exception { + driver.get(baseUrl + "babsi/"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + + driver.findElement(By.linkText("Checklisten")).click(); + try { + assertEquals("Checklisten Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIExport.java b/babsi/BabsiWeb/test/gui/babsi/GUIExport.java new file mode 100644 index 0000000000000000000000000000000000000000..41a373f0c7fa2f5e5415df5e03f288f889e4de52 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIExport.java @@ -0,0 +1,89 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIExport { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIExport() throws Exception { + driver.get(baseUrl + "babsi/"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + driver.findElement(By.linkText("Export")).click(); + try { + assertEquals("Export", driver.findElement(By.cssSelector("div.panel-heading")).getText()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + driver.findElement(By.linkText("Checklisten Exportieren")).click(); + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIStatistikAufrufen.java b/babsi/BabsiWeb/test/gui/babsi/GUIStatistikAufrufen.java new file mode 100644 index 0000000000000000000000000000000000000000..ea5f7f68867b6ed11028c43ffeb8b3534d89fb61 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIStatistikAufrufen.java @@ -0,0 +1,88 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIStatistikAufrufen { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIStatistikAufrufen() throws Exception { + driver.get(baseUrl + "babsi/"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + driver.findElement(By.linkText("Statistiken")).click(); + try { + assertEquals("Statistiken", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUITestData.java b/babsi/BabsiWeb/test/gui/babsi/GUITestData.java new file mode 100644 index 0000000000000000000000000000000000000000..4c1dc95b555cc5393cacfa2b307f75d35d104e66 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUITestData.java @@ -0,0 +1,6 @@ +package babsi; + +public class GUITestData { + public static String baseUrl = "http://localhost:8080/"; + +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIVisitenlisteAnzeigen.java b/babsi/BabsiWeb/test/gui/babsi/GUIVisitenlisteAnzeigen.java new file mode 100644 index 0000000000000000000000000000000000000000..17b73f42b43251d053d7622586a9b920da05acc8 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIVisitenlisteAnzeigen.java @@ -0,0 +1,89 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIVisitenlisteAnzeigen { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testVisitenlisteAnzeigen() throws Exception { + driver.get(baseUrl + "babsi/"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + + driver.findElement(By.linkText("Visiten")).click(); + try { + assertEquals("Visiten Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/gui/babsi/GUIVisitienturnusAnzeigen.java b/babsi/BabsiWeb/test/gui/babsi/GUIVisitienturnusAnzeigen.java new file mode 100644 index 0000000000000000000000000000000000000000..723c0adcf66be8c27275d738324c75ed1f520b11 --- /dev/null +++ b/babsi/BabsiWeb/test/gui/babsi/GUIVisitienturnusAnzeigen.java @@ -0,0 +1,89 @@ +package babsi; + +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; + +import org.junit.*; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import org.openqa.selenium.*; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; + +public class GUIVisitienturnusAnzeigen { + private WebDriver driver; + private String baseUrl; + private boolean acceptNextAlert = true; + private StringBuffer verificationErrors = new StringBuffer(); + + @Before + public void setUp() throws Exception { + driver = new FirefoxDriver(); + baseUrl = GUITestData.baseUrl; + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + } + + @Test + public void testGUIVisitienturnusAnzeigen() throws Exception { + driver.get(baseUrl + "babsi/"); + + //Login + driver.findElement(By.name("username")).clear(); + driver.findElement(By.name("username")).sendKeys("user123"); + driver.findElement(By.name("password")).clear(); + driver.findElement(By.name("password")).sendKeys("password"); + driver.findElement(By.cssSelector("input[type=\"submit\"]")).click(); + + + driver.findElement(By.linkText("Visitenturnus")).click(); + try { + assertEquals("Visitenturnus Übersicht", driver.getTitle()); + } catch (Error e) { + verificationErrors.append(e.toString()); + } + } + + @After + public void tearDown() throws Exception { + driver.quit(); + String verificationErrorString = verificationErrors.toString(); + if (!"".equals(verificationErrorString)) { + fail(verificationErrorString); + } + } + + private boolean isElementPresent(By by) { + try { + driver.findElement(by); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + private boolean isAlertPresent() { + try { + driver.switchTo().alert(); + return true; + } catch (NoAlertPresentException e) { + return false; + } + } + + private String closeAlertAndGetItsText() { + try { + Alert alert = driver.switchTo().alert(); + String alertText = alert.getText(); + if (acceptNextAlert) { + alert.accept(); + } else { + alert.dismiss(); + } + return alertText; + } finally { + acceptNextAlert = true; + } + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/AuthControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/AuthControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..846e4c0a67c794c7736544f35a180f2a70cbbc54 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/AuthControllerTests.groovy @@ -0,0 +1,34 @@ +package cau.swp.babsi + +import grails.test.mixin.* +import grails.test.mixin.support.* + +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +@Mock(AuthController) +class AuthControllerTests { + + def populateValidParams(params) { + assert params != null + params["username"] = "user123" + params["rememberMe"] = true + params["targetUri"] = "/checklist/list" + } + + void testIndex() { + controller.index() + assert "/auth/login" == response.redirectedUrl + } + + void testLogin() { + populateValidParams(params) + def model = controller.login() + + assert params["rememberMe"] == model.rememberMe + assert params["targetUri"] == model.targetUri + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/DataControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/DataControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..f22ffd01b16b16e198c4e577bba3cd16f05468bf --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/DataControllerTests.groovy @@ -0,0 +1,41 @@ +package cau.swp.babsi + + + +import cau.swp.babsi.medication.Antibiotic +import cau.swp.babsi.medication.ApplicationRate +import cau.swp.babsi.medication.DrugApplicationType +import cau.swp.babsi.medication.DrugData +import cau.swp.babsi.medication.InterventionStatus +import cau.swp.babsi.medication.InterventionType +import cau.swp.babsi.medication.PrescriptionReason +import cau.swp.babsi.medication.Strength +import cau.swp.babsi.wardround.Checklist +import cau.swp.babsi.wardround.Infection +import cau.swp.babsi.wardround.MiBiStatus +import cau.swp.babsi.wardround.WardRound +import grails.test.mixin.* +import groovy.mock.interceptor.MockFor +import org.apache.shiro.crypto.hash.Sha256Hash +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions + */ +@TestFor(DataController) +@Mock(Checklist) +class DataControllerTests { + + void testExport() { + + + def testChecklist = controller.Header; + + controller.export(); + assert testChecklist == response.contentAsString + assert response.contentType == "application/octet-stream" + assert response.getHeader("Content-disposition") == "attachment; filename=\"checklist.csv\"" + + } +} + diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/RoleTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/RoleTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..169397e17a6fa1c518ec3e60da01469a4120a130 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/RoleTests.groovy @@ -0,0 +1,27 @@ +package cau.swp.babsi + +import grails.test.mixin.TestMixin +import grails.test.mixin.support.GrailsUnitTestMixin + + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +class RoleTests { + + void testAttributes() { + def testRole1 = new Role(name: "testUser") + + mockForConstraintsTests(Role, [testRole1]) + + def testRole2 = new Role(name: "testUser") + assertFalse testRole2.validate() + assertEquals 1, testRole2.errors.errorCount + assertEquals "unique", testRole2.errors["name"] + + + assert "testUser" == testRole1.name + + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..1d8ad210adfe0b9fdb8ee48dde8a8822c1a1d3cb --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationControllerTests.groovy @@ -0,0 +1,159 @@ +package cau.swp.babsi + +import static org.junit.Assert.* + +import grails.test.mixin.* +import grails.test.mixin.support.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +@Mock(Station) +class StationControllerTests { + + def populateValidParams(params) { + assert params != null + params["name"] = "Community" + } + + void testIndex() { + controller.index() + assert "/station/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.stationInstanceList.size() == 0 + assert model.stationInstanceTotal == 0 + } + + void testCreate() { + def model = controller.create() + + assert model.stationInstance != null + } + + void testSave() { + controller.save() + + assert model.stationInstance != null + assert view == '/station/create' + + response.reset() + + populateValidParams(params) + controller.save() + + assert response.redirectedUrl == '/station/show/1' + assert controller.flash.message != null + assert Station.count() == 1 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/station/list' + + populateValidParams(params) + def station = new Station(params) + + assert station.save() != null + + params.id = station.id + + def model = controller.show() + + assert model.stationInstance == station + } + + void testEdit() { + controller.edit() + + assert flash.message != null + assert response.redirectedUrl == '/station/list' + + populateValidParams(params) + def station = new Station(params) + + assert station.save() != null + + params.id = station.id + + def model = controller.edit() + + assert model.stationInstance == station + } + + void testUpdate() { + controller.update() + + assert flash.message != null + assert response.redirectedUrl == '/station/list' + + response.reset() + + populateValidParams(params) + def station = new Station(params) + + assert station.save() != null + + // test invalid parameters in update + params.id = station.id + params.name = null + + controller.update() + + assert view == "/station/edit" + assert model.stationInstance != null + + station.clearErrors() + + populateValidParams(params) + controller.update() + + assert response.redirectedUrl == "/station/show/$station.id" + assert flash.message != null + + //test outdated version number + response.reset() + station.clearErrors() + + populateValidParams(params) + params.id = station.id + params.version = -1 + controller.update() + + assert view == "/station/edit" + assert model.stationInstance != null + assert model.stationInstance.errors.getFieldError('version') + assert flash.message != null + } + + void testDelete() { + controller.delete() + assert flash.message != null + assert response.redirectedUrl == '/station/list' + + response.reset() + + populateValidParams(params) + def station = new Station(params) + + assert station.save() != null + assert station.count() == 1 + + params.id = station.id + + controller.delete() + + assert station.count() == 0 + assert station.get(station.id) == null + assert response.redirectedUrl == '/station/list' + } +} + diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..4eb9c5a63a8254633e0818a653c916c37593d4bc --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StationTests.groovy @@ -0,0 +1,56 @@ +package cau.swp.babsi + +import cau.swp.babsi.medication.InterventionType +import cau.swp.babsi.wardround.WardRound +import grails.test.mixin.TestMixin +import grails.test.mixin.support.GrailsUnitTestMixin +import org.apache.shiro.crypto.hash.Sha256Hash + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +@Mock(Station) +class StationTests { + + void testUnique() { + def testSta1 = new Station(name:"Eskalation") + + mockDomain(Station, [testSta1]) + def testSta2 = new Station(name:"Eskalation") + + assertFalse testSta2.validate() + } + + void testLength() { + mockForConstraintsTests(Station) + def testSt = new Station(name: "asdfghjklöäqwertzuiopümnbvcxyasdfghjklöäpoiuztrewqümnbvcxyamwqprjntkasdfghjklöäqwertzuiopüäölkjhgfdsayxlsdihonogberoghworvhoekfnwrogjofijvnodjfnweoghoerhowf bwirugheuirhnbiugwrithrhgorngerognoerngognwoengiurvnijw giwuhiqenfoiwehgoirnogwnrognwognweokcf nqlwnfowenvidbgvcvbjscdgfosfisuhfosihfoshfosdihfosdhfoshoweuihoweiufbonm") + assertFalse testSt.validate() + assertEquals 1, testSt.errors.errorCount + assertEquals "size", testSt.errors["name"] + } + + void testHasMany() { + def testStation1 = new Station(name: "Community") + def testStation2 = new Station(name: "Intensivstation") + def testDate = new Date() + def testWard1 = new WardRound(date: testDate, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()), station: testStation2) + def wardTest2 = new WardRound(date: new Date(), durationInSeconds: 1550, + createdBy: new User(username: "thirdUser", + passwordHash: new Sha256Hash("thirdPassword").toHex()), station: testStation1) + + mockDomain(Station, [testStation1, testStation2]) + mockDomain(WardRound, [testWard1, wardTest2]) + + testStation1.wardrounds.add(wardTest2) + testStation2.wardrounds.add(testWard1) + + assert testStation2.wardrounds.first() == testWard1 + assert testStation1.wardrounds.first() == wardTest2 + assert testStation2.name == "Intensivstation" + assert wardTest2.station == testStation1 + + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/StatisticControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StatisticControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..157cea9a5bbe259a9a9b7635b5d5cbfcf1d06314 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/StatisticControllerTests.groovy @@ -0,0 +1,34 @@ +package cau.swp.babsi + + + +import grails.test.mixin.* + +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions + */ +@TestFor(StatisticController) +@Mock([StatisticController,Station,User]) +class StatisticControllerTests { + + def populateValidParams(params) { + assert params != null + + } + + void testIndex() { + def testUser = new User(username: "Tester", passwordHash: "215846131535461316432164654674") + mockDomain(User,[testUser]) + + session.setAttribute("userID", testUser.id) + def model = controller.index() + + assert model.statistic1Id == 0 + assert model.statistic3Id == testUser.id + //da keine Users, Stationen initiiert sind, sollten sie null sein + assertFalse model.stations == null + assertFalse model.users == null + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..9b09daefe6979703cc5be335bdce7f9dc60bf685 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserControllerTests.groovy @@ -0,0 +1,85 @@ +package cau.swp.babsi + +import static org.junit.Assert.* + +import grails.test.mixin.* +import grails.test.mixin.support.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +@Mock(User) +class UserControllerTests { + + def populateValidParams(params) { + assert params != null + params["username"] = "Daniela JSon" + params["passwordHash"] = "215846131535461316432164654674" + params["pw1"] = "215846131535461316432164654674" + params["pw2"] = "215846131535461316432164654674" + params["id"] = 000645 + } + + void testIndex() { + controller.index() + assert "/user/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.userInstanceList.size() == 0 + assert model.userInstanceTotal == 0 + } + + void testCreate() { + def model = controller.create() + + assert model.userInstance != null + } + + void testShow() { + populateValidParams(params) + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/user/list' + } + + void testEdit() { + populateValidParams(params) + controller.edit() + + assert flash.message != null + assert response.redirectedUrl == '/user/list' + + } + + void testUpdate() { + populateValidParams(params) + controller.update() + + assert flash.message != null + assert response.redirectedUrl == '/user/list' + + response.reset() + + populateValidParams(params) + def user = new User(params) + + mockDomain(User, [user]) + // test invalid parameters in update + params.id = user.id + params.username = null + + controller.update() + + user.clearErrors() + + assert response.redirectedUrl == "/user/list" + assert flash.message != null + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..6f9de2827ebcf2cc5421d3e7ae3edd429c134889 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/UserTests.groovy @@ -0,0 +1,44 @@ +package cau.swp.babsi + +import grails.test.mixin.* +import grails.test.mixin.support.GrailsUnitTestMixin + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +class UserTests { + + void testBlank() { + mockForConstraintsTests(User) + def testUser1 = new User(username: null, passwordHash: "215846131535461316432164654674") + def testUser2 = new User(username: "Peter", passwordHash: " ") + + assertFalse testUser1.validate() + assertFalse testUser2.validate() + assertEquals 1, testUser1.errors.errorCount + assertEquals 1, testUser2.errors.errorCount + assertEquals "nullable", testUser1.errors["username"] + assertEquals "blank", testUser2.errors["passwordHash"] + + } + + void testUnique() { + def testUser1 = new User(username: "Daniela", passwordHash: "133468465465446516") + def testUser2 = new User(username: "Daniel", passwordHash: "35146354354354") + + mockForConstraintsTests(User, [testUser1, testUser2]) + + def testUser3 = new User(username: "Daniel", passwordHash: "133468465465446516") + assertFalse testUser3.validate() + assertEquals "unique", testUser3.errors["username"] + } + + void testToString() { + def testUser1 = new User(username: "Daniela", passwordHash: "133468465465446516") + + mockDomain(User, [testUser1]) + + assert "Daniela" == testUser1.toString() + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..f9fa50e9ec11e789d0ce092095019644ee7595d7 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticControllerTests.groovy @@ -0,0 +1,153 @@ +package cau.swp.babsi.medication + +import grails.test.mixin.* + +import org.junit.* + +@TestFor(AntibioticController) +@Mock(Antibiotic) +class AntibioticControllerTests { + + def populateValidParams(params) { + assert params != null + params["name"] = "Penicillin" + } + + void testIndex() { + controller.index() + assert "/antibiotic/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.antibioticInstanceList.size() == 0 + assert model.antibioticInstanceTotal == 0 + } + + void testCreate() { + def model = controller.create() + + assert model.antibioticInstance != null + } + + void testSave() { + controller.save() + + assert model.antibioticInstance != null + assert view == '/antibiotic/create' + + response.reset() + + populateValidParams(params) + controller.save() + + assert response.redirectedUrl == '/antibiotic/show/1' + assert controller.flash.message != null + assert Antibiotic.count() == 1 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/antibiotic/list' + + populateValidParams(params) + def antibiotic = new Antibiotic(params) + + assert antibiotic.save() != null + + params.id = antibiotic.id + + def model = controller.show() + + assert model.antibioticInstance == antibiotic + } + + void testEdit() { + controller.edit() + + assert flash.message != null + assert response.redirectedUrl == '/antibiotic/list' + + populateValidParams(params) + def antibiotic = new Antibiotic(params) + + assert antibiotic.save() != null + + params.id = antibiotic.id + + def model = controller.edit() + + assert model.antibioticInstance == antibiotic + } + + void testUpdate() { + controller.update() + + assert flash.message != null + assert response.redirectedUrl == '/antibiotic/list' + + response.reset() + + populateValidParams(params) + def antibiotic = new Antibiotic(params) + + assert antibiotic.save() != null + + // test invalid parameters in update + params.id = antibiotic.id + params["name"] = null + + controller.update() + + assert view == "/antibiotic/edit" + assert model.antibioticInstance != null + + antibiotic.clearErrors() + + populateValidParams(params) + controller.update() + + assert response.redirectedUrl == "/antibiotic/show/$antibiotic.id" + assert flash.message != null + + //test outdated version number + response.reset() + antibiotic.clearErrors() + + populateValidParams(params) + params.id = antibiotic.id + params.version = -1 + controller.update() + + assert view == "/antibiotic/edit" + assert model.antibioticInstance != null + assert model.antibioticInstance.errors.getFieldError('version') + assert flash.message != null + } + + void testDelete() { + controller.delete() + assert flash.message != null + assert response.redirectedUrl == '/antibiotic/list' + + response.reset() + + populateValidParams(params) + def antibiotic = new Antibiotic(params) + + assert antibiotic.save() != null + assert Antibiotic.count() == 1 + + params.id = antibiotic.id + + controller.delete() + + assert Antibiotic.count() == 0 + assert Antibiotic.get(antibiotic.id) == null + assert response.redirectedUrl == '/antibiotic/list' + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..853b847654a00379fb85e9bec7cdc468d64b3766 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/AntibioticTests.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(Antibiotic) +class AntibioticTests { + + void testMockAntibiotic() { + def antib1 = new Antibiotic(name: "Penicillin") + def antib2 = new Antibiotic(name: "Amocillin") + mockDomain(Antibiotic, [antib1, antib2]) + def list = Antibiotic.findAllByName("Penicillin") + assertEquals 1, list.size() + assert "Amocillin" == antib2.name + + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/ApplicationRateTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/ApplicationRateTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..9a5688ee388967beff77dcbb478c13f7ac8cafd4 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/ApplicationRateTests.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(ApplicationRate) +class ApplicationRateTests { + + void testMockApplicationRate() { + def appRa1 = new ApplicationRate(rate: "4x täglich") + def appRa2 = new ApplicationRate(rate: "3x pro Woche") + mockDomain(ApplicationRate, [appRa1, appRa2]) + def list = ApplicationRate.findAllByRate("3x pro Woche") + assertEquals 1, list.size() + assert "4x täglich" == appRa1.rate + + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugApplicationTypeTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugApplicationTypeTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..dcdb280d0d3669df32c11c80803ce46e6f3e31b5 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugApplicationTypeTests.groovy @@ -0,0 +1,23 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(DrugApplicationType) +class DrugApplicationTypeTests { + + void testMockApplicationRate() { + def drAppTy1 = new DrugApplicationType(name: "inhalativ") + def drAppTy2 = new DrugApplicationType(name: "oral") + mockDomain(DrugApplicationType, [drAppTy1, drAppTy2]) + def list = DrugApplicationType.findAllByName("inhalativ") + assertEquals 1, list.size() + assert "oral" == drAppTy2.name + + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugDataTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugDataTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..cac7008da1e77111dd36b439011987ba3c6df6dd --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/DrugDataTests.groovy @@ -0,0 +1,29 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* + +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(DrugData) +class DrugDataTests { + + void testMockDrugData() { + def drDa1 = new DrugData(comment: "Hello World", antibiotic: new Antibiotic(name:"Penicillin"), + prescriptionReason: new PrescriptionReason(name: "Therapie"), drugApplicationType: new DrugApplicationType(name: "inhalativ"), + strength: "körpergewichtsadaptiert", applicationRate: new ApplicationRate(rate: "3x täglich"), durationInDays: 4, intervention: new InterventionType(name: "Fokussuche empfohlen"), + interventionStatus: new InterventionStatus(description: "zugestimmt")) + def drDa2 = new DrugData(comment: "Sehr junger Patient", antibiotic: new Antibiotic(name:"Amocillin"), + prescriptionReason: new PrescriptionReason(name: "Therapie"), drugApplicationType: new DrugApplicationType(name: "oral"), + strength: "100mg", applicationRate: new ApplicationRate(rate: "1x täglich"), durationInDays: 4, intervention: new InterventionType(name: "Dosisoptimierung"), + interventionStatus: new InterventionStatus(description: "abgelehnt")) + mockDomain(DrugData, [drDa1, drDa2]) + assert "zugestimmt" == drDa1.interventionStatus.toString() + assert "oral" == drDa2.drugApplicationType.toString() + + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionStatusTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionStatusTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..3a7fa6de37dc0850541e94ff113ff9c65cda9352 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionStatusTests.groovy @@ -0,0 +1,18 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(InterventionStatus) +class InterventionStatusTests { + + void testSomething() { + def testInterventionStatus = new InterventionStatus(description: "unbekannt") + assert "unbekannt" == testInterventionStatus.description + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..8e0b0ce1687fee0deefb4873a9a04c8b29ae3759 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeControllerTests.groovy @@ -0,0 +1,154 @@ +package cau.swp.babsi.medication + + + +import org.junit.* +import grails.test.mixin.* + +@TestFor(InterventionTypeController) +@Mock(InterventionType) +class InterventionTypeControllerTests { + + def populateValidParams(params) { + assert params != null + params["name"] = "Eskalation" + } + + void testIndex() { + controller.index() + assert "/interventionType/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.interventionTypeInstanceList.size() == 0 + assert model.interventionTypeInstanceTotal == 0 + } + + void testCreate() { + def model = controller.create() + + assert model.interventionTypeInstance != null + } + + void testSave() { + controller.save() + + assert model.interventionTypeInstance != null + assert view == '/interventionType/create' + + response.reset() + + populateValidParams(params) + controller.save() + + assert response.redirectedUrl == '/interventionType/show/1' + assert controller.flash.message != null + assert InterventionType.count() == 1 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/interventionType/list' + + populateValidParams(params) + def interventionType = new InterventionType(params) + + assert interventionType.save() != null + + params.id = interventionType.id + + def model = controller.show() + + assert model.interventionTypeInstance == interventionType + } + + void testEdit() { + controller.edit() + + assert flash.message != null + assert response.redirectedUrl == '/interventionType/list' + + populateValidParams(params) + def interventionType = new InterventionType(params) + + assert interventionType.save() != null + + params.id = interventionType.id + + def model = controller.edit() + + assert model.interventionTypeInstance == interventionType + } + + void testUpdate() { + controller.update() + + assert flash.message != null + assert response.redirectedUrl == '/interventionType/list' + + response.reset() + + populateValidParams(params) + def interventionType = new InterventionType(params) + + assert interventionType.save() != null + + // test invalid parameters in update + params.id = interventionType.id + params.name = null + + controller.update() + + assert view == "/interventionType/edit" + assert model.interventionTypeInstance != null + + interventionType.clearErrors() + + populateValidParams(params) + controller.update() + + assert response.redirectedUrl == "/interventionType/show/$interventionType.id" + assert flash.message != null + + //test outdated version number + response.reset() + interventionType.clearErrors() + + populateValidParams(params) + params.id = interventionType.id + params.version = -1 + controller.update() + + assert view == "/interventionType/edit" + assert model.interventionTypeInstance != null + assert model.interventionTypeInstance.errors.getFieldError('version') + assert flash.message != null + } + + void testDelete() { + controller.delete() + assert flash.message != null + assert response.redirectedUrl == '/interventionType/list' + + response.reset() + + populateValidParams(params) + def interventionType = new InterventionType(params) + + assert interventionType.save() != null + assert InterventionType.count() == 1 + + params.id = interventionType.id + + controller.delete() + + assert InterventionType.count() == 0 + assert InterventionType.get(interventionType.id) == null + assert response.redirectedUrl == '/interventionType/list' + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..4f48a97f0a3c2bbe9558537cd7bc4bc7a7898144 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/InterventionTypeTests.groovy @@ -0,0 +1,22 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(InterventionType) +class InterventionTypeTests { + + void testSomething() { + def intTyTest1 = new InterventionType(name: "Eskalation") + def intTyTest2 = new InterventionType(name: "Deeskalation") + + assert "Deeskalation" == intTyTest2.name + assert "Eskalation" == intTyTest1.name + + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/PrescriptionReasonTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/PrescriptionReasonTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..0bd67ba959997ef8e124fc1e09d5b0f496dedc15 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/PrescriptionReasonTests.groovy @@ -0,0 +1,17 @@ +package cau.swp.babsi.medication + +import grails.test.mixin.TestFor + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(PrescriptionReason) +class PrescriptionReasonTests { + + void "test something"() { + def preReaTest1 = new PrescriptionReason(name: "Therapie") + def preReaTest2 = new PrescriptionReason(name: "Prophylaxe") + assert "Therapie" == preReaTest1.name + assert "Prophylaxe" == preReaTest2.name + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/StrengthTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/StrengthTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..7113f2ecb1a1fefcaa30c497d5751dbdb635c3a7 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/medication/StrengthTests.groovy @@ -0,0 +1,21 @@ +package cau.swp.babsi.medication + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(Strength) +class StrengthTests { + + void testSomething() { + def testStr1 = new Strength(strength: "100mg") + def testStr2 = new Strength(strength: "20mg") + + assert "20mg" == testStr2.strength + assert "100mg" == testStr1.strength + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..afd3960dce2564097264f6227101915eadee0b02 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistControllerTests.groovy @@ -0,0 +1,47 @@ +package cau.swp.babsi.wardround + + + +import org.apache.shiro.crypto.hash.Sha256Hash +import org.junit.* +import cau.swp.babsi.Station +import cau.swp.babsi.User +import grails.test.mixin.* + +@TestFor(ChecklistController) +@Mock(Checklist) +class ChecklistControllerTests { + + def populateValidParams(params) { + assert params != null + def testDate = new Date() + params["patientDescription"] = "Daniela Jay" + params["patientDateOfBirth"] = testDate + params["patientSex"] = "female" + params["mibiStatus"] = new MiBiStatus(name: "nicht vorhanden") + params["comment"] = "wehe dir!" + params["wardRound"] = new WardRound(date: testDate, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()), station: new Station(name: "Community")) + } + + void testIndex() { + controller.index() + assert "/checklist/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.checklistInstanceList.size() == 0 + assert model.checklistInstanceTotal == 0 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/checklist/list' + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..b1032c68260f9722b07ba36214d9b49a8634be00 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/ChecklistTests.groovy @@ -0,0 +1,37 @@ +package cau.swp.babsi.wardround + +import cau.swp.babsi.Station +import cau.swp.babsi.User +import grails.test.mixin.TestMixin +import grails.test.mixin.support.GrailsUnitTestMixin +import org.apache.shiro.crypto.hash.Sha256Hash + +/** + * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions + */ +@TestMixin(GrailsUnitTestMixin) +class ChecklistTests { + + void testAttributes() { + def testDate = new Date() + + def testStation = new Station(name: "Community") + + def testCheck1 = new Checklist(patientDescription: "Daniela Jay", patientDateOfBirth: testDate, patientSex:"female", + mibiStatus: new MiBiStatus(name: "nicht vorhanden"), comment: "wehe dir!", wardRound: new WardRound(date: testDate, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()), station: testStation)) + + def testCheck2 = new Checklist(patientDescription: "Daniel Jay", patientDateOfBirth: testDate, patientSex:"male", + mibiStatus: new MiBiStatus(name: "angefordert"), comment: "im Ernst?", wardRound: new WardRound(date: testDate, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()), station: testStation, checklists: testCheck1)) + + assert "wehe dir!" == testCheck1.comment + assert "male" == testCheck2.patientSex + assert null == testCheck1.drugData + assert null == testCheck2.infections + assert testCheck1.wardRound.date == testDate + assert testCheck1 == testCheck2.wardRound.checklists.first() + } +} \ No newline at end of file diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..2926919a64ca073d825b439ed8fba35b97988069 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleControllerTests.groovy @@ -0,0 +1,37 @@ +package cau.swp.babsi.wardround + + + +import org.junit.* +import grails.test.mixin.* + +@TestFor(CycleController) +@Mock(Cycle) +class CycleControllerTests { + + def populateValidParams(params) { + assert params != null + // TODO: Populate valid properties like... + //params["name"] = 'someValidName' + } + + void testIndex() { + controller.index() + assert "/cycle/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.cycleInstanceList.size() == 0 + assert model.cycleInstanceTotal == 0 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/cycle/list' + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..039edace2ea5346bb13ce01b51e1014567d8773c --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/CycleTests.groovy @@ -0,0 +1,25 @@ +package cau.swp.babsi.wardround + + + +import cau.swp.babsi.User +import grails.test.mixin.* +import org.apache.shiro.crypto.hash.Sha256Hash +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(Cycle) +class CycleTests { + + void testAttributes() { + def date = new Date().time + def testCycle1 = new Cycle(beginDate: date-10000000, endDate: date, wardrounds: [new WardRound(date: date, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()))]) + def testCycle2 = new Cycle(beginDate: date-100000000000, endDate: null) + + assertFalse testCycle2.validate() + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..d179da208ff9f162566d9599ddaead3f23488699 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionControllerTests.groovy @@ -0,0 +1,154 @@ +package cau.swp.babsi.wardround + + + +import org.junit.* +import grails.test.mixin.* + +@TestFor(InfectionController) +@Mock(Infection) +class InfectionControllerTests { + + def populateValidParams(params) { + assert params != null + params["name"] = "CAP" + } + + void testIndex() { + controller.index() + assert "/infection/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.infectionInstanceList.size() == 0 + assert model.infectionInstanceTotal == 0 + } + + void testCreate() { + def model = controller.create() + + assert model.infectionInstance != null + } + + void testSave() { + controller.save() + + assert model.infectionInstance != null + assert view == '/infection/create' + + response.reset() + + populateValidParams(params) + controller.save() + + assert response.redirectedUrl == '/infection/show/1' + assert controller.flash.message != null + assert Infection.count() == 1 + } + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/infection/list' + + populateValidParams(params) + def infection = new Infection(params) + + assert infection.save() != null + + params.id = infection.id + + def model = controller.show() + + assert model.infectionInstance == infection + } + + void testEdit() { + controller.edit() + + assert flash.message != null + assert response.redirectedUrl == '/infection/list' + + populateValidParams(params) + def infection = new Infection(params) + + assert infection.save() != null + + params.id = infection.id + + def model = controller.edit() + + assert model.infectionInstance == infection + } + + void testUpdate() { + controller.update() + + assert flash.message != null + assert response.redirectedUrl == '/infection/list' + + response.reset() + + populateValidParams(params) + def infection = new Infection(params) + + assert infection.save() != null + + // test invalid parameters in update + params.id = infection.id + params.name = null + + controller.update() + + assert view == "/infection/edit" + assert model.infectionInstance != null + + infection.clearErrors() + + populateValidParams(params) + controller.update() + + assert response.redirectedUrl == "/infection/show/$infection.id" + assert flash.message != null + + //test outdated version number + response.reset() + infection.clearErrors() + + populateValidParams(params) + params.id = infection.id + params.version = -1 + controller.update() + + assert view == "/infection/edit" + assert model.infectionInstance != null + assert model.infectionInstance.errors.getFieldError('version') + assert flash.message != null + } + + void testDelete() { + controller.delete() + assert flash.message != null + assert response.redirectedUrl == '/infection/list' + + response.reset() + + populateValidParams(params) + def infection = new Infection(params) + + assert infection.save() != null + assert Infection.count() == 1 + + params.id = infection.id + + controller.delete() + + assert Infection.count() == 0 + assert Infection.get(infection.id) == null + assert response.redirectedUrl == '/infection/list' + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..d954365be97eef4a4d7c16f2c59045828a248122 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/InfectionTests.groovy @@ -0,0 +1,29 @@ +package cau.swp.babsi.wardround + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(Infection) +class InfectionTests { + + void testName() { + def testInf1 = new Infection(name: "CAP") + def testInf2 = new Infection(name: "Peritonitis") + + assert "Peritonitis" == testInf2.name + assert "CAP" == testInf1.name + } + + void testToString() { + def testInf1 = new Infection(name: "CAP") + def testInf2 = new Infection(name: "Peritonitis") + + assert "Peritonitis" == testInf2.toString() + assert "CAP" == testInf1.toString() + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/MiBiStatusTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/MiBiStatusTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..15946096d67b75cf8ab6c4b4aa677db570270cf7 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/MiBiStatusTests.groovy @@ -0,0 +1,21 @@ +package cau.swp.babsi.wardround + + + +import grails.test.mixin.* +import org.junit.* + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(MiBiStatus) +class MiBiStatusTests { + + void testAttributes() { + def mibiTest1 = new MiBiStatus(name: "nicht vorhanden") + def mibiTest2 = new MiBiStatus(name: "angefordert") + + assert "nicht vorhanden" == mibiTest1.name + assert "angefordert" == mibiTest2.toString() + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundControllerTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundControllerTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..b19e50b5ec3d32fb8149f9a81894854ece2db971 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundControllerTests.groovy @@ -0,0 +1,56 @@ +package cau.swp.babsi.wardround + + + +import org.apache.shiro.crypto.hash.Sha256Hash +import org.junit.* +import cau.swp.babsi.Station +import cau.swp.babsi.User +import grails.test.mixin.* + +@TestFor(WardRoundController) +@Mock(WardRound) +class WardRoundControllerTests { + + def populateValidParams(params) { + assert params != null + def testDate = new Date() + params["date"] = testDate + params["durationInSeconds"] = 1250 + params["createdBy"] = new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()) + params["station"] = new Station(name: "Community") + } + + void testIndex() { + controller.index() + assert "/wardRound/list" == response.redirectedUrl + } + + void testList() { + + def model = controller.list() + + assert model.wardRoundInstanceList.size() == 0 + assert model.wardRoundInstanceTotal == 0 + } + + + void testShow() { + controller.show() + + assert flash.message != null + assert response.redirectedUrl == '/wardRound/list' + + populateValidParams(params) + def wardRound = new WardRound(params) + + assert wardRound.save() != null + + params.id = wardRound.id + + def model = controller.show() + + assert model.wardRoundInstance == wardRound + } +} diff --git a/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundTests.groovy b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundTests.groovy new file mode 100644 index 0000000000000000000000000000000000000000..06971f6ab4f66eb65cfabdad8522fab0bd14bb07 --- /dev/null +++ b/babsi/BabsiWeb/test/unit/cau/swp/babsi/wardround/WardRoundTests.groovy @@ -0,0 +1,54 @@ +package cau.swp.babsi.wardround + + + +import java.util.Date; + +import grails.test.mixin.* + +import org.apache.shiro.crypto.hash.Sha256Hash +import org.junit.* + +import cau.swp.babsi.Station +import cau.swp.babsi.User; +import cau.swp.babsi.medication.Antibiotic +import cau.swp.babsi.medication.ApplicationRate +import cau.swp.babsi.medication.DrugApplicationType +import cau.swp.babsi.medication.DrugData +import cau.swp.babsi.medication.InterventionStatus +import cau.swp.babsi.medication.InterventionType +import cau.swp.babsi.medication.PrescriptionReason +import cau.swp.babsi.medication.Strength + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(WardRound) +class WardRoundTests { + + void testAttributes() { + def testStation = new Station(name: "Community") + def testChecklist = new Checklist(patientDescription: "Jeff Winger", patientDateOfBirth: new Date(), patientSex:"male", + mibiStatus: new MiBiStatus(name: "nicht vorhanden"), comment: "im Ernst?", drugData: new DrugData(comment: "Am Arsch hängt der Hammer.", + antibiotic: new Antibiotic(name: "Gentamicin"), drugApplicationType: new DrugApplicationType(name: "iv"), + strength: new Strength(strength: "80mg"), applicationRate: new ApplicationRate(rate: "4x täglich"), + durationInDays: 5, intervention: new InterventionType(name: "Fokussuche empfohlen"), + interventionStatus: new InterventionStatus(description: "zugestimmt"), prescriptionReason: new PrescriptionReason(name: "unbekannt"))) + + def testDate = new Date() + def wardTest1 = new WardRound(date: testDate, durationInSeconds: 1250, + createdBy: new User(username: "user123", + passwordHash: new Sha256Hash("password").toHex()), station: testStation) + def wardTest2 = new WardRound(date: new Date(), durationInSeconds: 1550, + createdBy: new User(username: "thirdUser", + passwordHash: new Sha256Hash("thirdPassword").toHex()), checklists: testChecklist) + + + assert "user123" == wardTest1.createdBy.username + assert testDate == wardTest1.date + assert 1550 == wardTest2.durationInSeconds + assert "Community" == wardTest1.station.toString() + assert testChecklist == wardTest2.checklists.first() + + } +} diff --git a/babsi/BabsiWeb/web-app/WEB-INF/applicationContext.xml b/babsi/BabsiWeb/web-app/WEB-INF/applicationContext.xml new file mode 100644 index 0000000000000000000000000000000000000000..69fbef3f73524bc8388d02e1b1e9bcd3df7a4a61 --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/applicationContext.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" +http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + + <bean id="grailsApplication" class="org.codehaus.groovy.grails.commons.GrailsApplicationFactoryBean"> + <description>Grails application factory bean</description> + <property name="grailsDescriptor" value="/WEB-INF/grails.xml" /> + <property name="grailsResourceLoader" ref="grailsResourceLoader" /> + </bean> + + <bean id="pluginManager" class="org.codehaus.groovy.grails.plugins.GrailsPluginManagerFactoryBean"> + <description>A bean that manages Grails plugins</description> + <property name="grailsDescriptor" value="/WEB-INF/grails.xml" /> + <property name="application" ref="grailsApplication" /> + </bean> + + <bean id="grailsConfigurator" class="org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator"> + <constructor-arg> + <ref bean="grailsApplication" /> + </constructor-arg> + <property name="pluginManager" ref="pluginManager" /> + </bean> + + <bean id="grailsResourceLoader" class="org.codehaus.groovy.grails.commons.GrailsResourceLoaderFactoryBean" /> + + <bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter"> + <property name="encoding"> + <value>utf-8</value> + </property> + </bean> +</beans> \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/WEB-INF/sitemesh.xml b/babsi/BabsiWeb/web-app/WEB-INF/sitemesh.xml new file mode 100644 index 0000000000000000000000000000000000000000..72399ceca6a4441be771cdee9f82056f5d86366a --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/sitemesh.xml @@ -0,0 +1,14 @@ +<sitemesh> + <page-parsers> + <parser content-type="text/html" + class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" /> + <parser content-type="text/html;charset=ISO-8859-1" + class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" /> + <parser content-type="text/html;charset=UTF-8" + class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" /> + </page-parsers> + + <decorator-mappers> + <mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" /> + </decorator-mappers> +</sitemesh> \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/WEB-INF/tld/c.tld b/babsi/BabsiWeb/web-app/WEB-INF/tld/c.tld new file mode 100644 index 0000000000000000000000000000000000000000..5e18236fefd8f106dba161507c69772a522db6ed --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/tld/c.tld @@ -0,0 +1,572 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<taglib xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" + version="2.1"> + + <description>JSTL 1.2 core library</description> + <display-name>JSTL core</display-name> + <tlib-version>1.2</tlib-version> + <short-name>c</short-name> + <uri>http://java.sun.com/jsp/jstl/core</uri> + + <validator> + <description> + Provides core validation features for JSTL tags. + </description> + <validator-class> + org.apache.taglibs.standard.tlv.JstlCoreTLV + </validator-class> + </validator> + + <tag> + <description> + Catches any Throwable that occurs in its body and optionally + exposes it. + </description> + <name>catch</name> + <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Name of the exported scoped variable for the +exception thrown from a nested action. The type of the +scoped variable is the type of the exception thrown. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Simple conditional tag that establishes a context for + mutually exclusive conditional operations, marked by + <when> and <otherwise> + </description> + <name>choose</name> + <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class> + <body-content>JSP</body-content> + </tag> + + <tag> + <description> + Simple conditional tag, which evalutes its body if the + supplied condition is true and optionally exposes a Boolean + scripting variable representing the evaluation of this condition + </description> + <name>if</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +The test condition that determines whether or +not the body content should be processed. + </description> + <name>test</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + <type>boolean</type> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +resulting value of the test condition. The type +of the scoped variable is Boolean. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope for var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Retrieves an absolute or relative URL and exposes its contents + to either the page, a String in 'var', or a Reader in 'varReader'. + </description> + <name>import</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class> + <tei-class>org.apache.taglibs.standard.tei.ImportTEI</tei-class> + <body-content>JSP</body-content> + <attribute> + <description> +The URL of the resource to import. + </description> + <name>url</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +resource's content. The type of the scoped +variable is String. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope for var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +resource's content. The type of the scoped +variable is Reader. + </description> + <name>varReader</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the context when accessing a relative +URL resource that belongs to a foreign +context. + </description> + <name>context</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Character encoding of the content at the input +resource. + </description> + <name>charEncoding</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + The basic iteration tag, accepting many different + collection types and supporting subsetting and other + functionality + </description> + <name>forEach</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class> + <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class> + <body-content>JSP</body-content> + <attribute> + <description> +Collection of items to iterate over. + </description> + <name>items</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>java.lang.Object</type> + <deferred-value> + <type>java.lang.Object</type> + </deferred-value> + </attribute> + <attribute> + <description> +If items specified: +Iteration begins at the item located at the +specified index. First item of the collection has +index 0. +If items not specified: +Iteration begins with index set at the value +specified. + </description> + <name>begin</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +If items specified: +Iteration ends at the item located at the +specified index (inclusive). +If items not specified: +Iteration ends when index reaches the value +specified. + </description> + <name>end</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +Iteration will only process every step items of +the collection, starting with the first one. + </description> + <name>step</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +current item of the iteration. This scoped +variable has nested visibility. Its type depends +on the object of the underlying collection. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +status of the iteration. Object exported is of type +javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested +visibility. + </description> + <name>varStatus</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Iterates over tokens, separated by the supplied delimeters + </description> + <name>forTokens</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +String of tokens to iterate over. + </description> + <name>items</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + <type>java.lang.String</type> + <deferred-value> + <type>java.lang.String</type> + </deferred-value> + </attribute> + <attribute> + <description> +The set of delimiters (the characters that +separate the tokens in the string). + </description> + <name>delims</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + <type>java.lang.String</type> + </attribute> + <attribute> + <description> +Iteration begins at the token located at the +specified index. First token has index 0. + </description> + <name>begin</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +Iteration ends at the token located at the +specified index (inclusive). + </description> + <name>end</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +Iteration will only process every step tokens +of the string, starting with the first one. + </description> + <name>step</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>int</type> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +current item of the iteration. This scoped +variable has nested visibility. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable for the +status of the iteration. Object exported is of +type +javax.servlet.jsp.jstl.core.LoopTag +Status. This scoped variable has nested +visibility. + </description> + <name>varStatus</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Like <%= ... >, but for expressions. + </description> + <name>out</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Expression to be evaluated. + </description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Default value if the resulting value is null. + </description> + <name>default</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Determines whether characters <,>,&,'," in the +resulting string should be converted to their +corresponding character entity codes. Default value is +true. + </description> + <name>escapeXml</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + + <tag> + <description> + Subtag of <choose> that follows <when> tags + and runs only if all of the prior conditions evaluated to + 'false' + </description> + <name>otherwise</name> + <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class> + <body-content>JSP</body-content> + </tag> + + <tag> + <description> + Adds a parameter to a containing 'import' tag's URL. + </description> + <name>param</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.ParamTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Name of the query string parameter. + </description> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Value of the parameter. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Redirects to a new URL. + </description> + <name>redirect</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.RedirectTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +The URL of the resource to redirect to. + </description> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the context when redirecting to a relative URL +resource that belongs to a foreign context. + </description> + <name>context</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Removes a scoped variable (from a particular scope, if specified). + </description> + <name>remove</name> + <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +Name of the scoped variable to be removed. + </description> + <name>var</name> + <required>true</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope for var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Sets the result of an expression evaluation in a 'scope' + </description> + <name>set</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Name of the exported scoped variable to hold the value +specified in the action. The type of the scoped variable is +whatever type the value expression evaluates to. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Expression to be evaluated. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <deferred-value> + <type>java.lang.Object</type> + </deferred-value> + </attribute> + <attribute> + <description> +Target object whose property will be set. Must evaluate to +a JavaBeans object with setter property property, or to a +java.util.Map object. + </description> + <name>target</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the property to be set in the target object. + </description> + <name>property</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Scope for var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Creates a URL with optional query parameters. + </description> + <name>url</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.UrlTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Name of the exported scoped variable for the +processed url. The type of the scoped variable is +String. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope for var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +URL to be processed. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the context when specifying a relative URL +resource that belongs to a foreign context. + </description> + <name>context</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Subtag of <choose> that includes its body if its + condition evalutes to 'true' + </description> + <name>when</name> + <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +The test condition that determines whether or not the +body content should be processed. + </description> + <name>test</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + <type>boolean</type> + </attribute> + </tag> + +</taglib> diff --git a/babsi/BabsiWeb/web-app/WEB-INF/tld/fmt.tld b/babsi/BabsiWeb/web-app/WEB-INF/tld/fmt.tld new file mode 100644 index 0000000000000000000000000000000000000000..2ae47762dac24521091f29ee6d356c3219ec8b5c --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/tld/fmt.tld @@ -0,0 +1,671 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<taglib xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" + version="2.1"> + + <description>JSTL 1.2 i18n-capable formatting library</description> + <display-name>JSTL fmt</display-name> + <tlib-version>1.2</tlib-version> + <short-name>fmt</short-name> + <uri>http://java.sun.com/jsp/jstl/fmt</uri> + + <validator> + <description> + Provides core validation features for JSTL tags. + </description> + <validator-class> + org.apache.taglibs.standard.tlv.JstlFmtTLV + </validator-class> + </validator> + + <tag> + <description> + Sets the request character encoding + </description> + <name>requestEncoding</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.RequestEncodingTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +Name of character encoding to be applied when +decoding request parameters. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Stores the given locale in the locale configuration variable + </description> + <name>setLocale</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetLocaleTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +A String value is interpreted as the +printable representation of a locale, which +must contain a two-letter (lower-case) +language code (as defined by ISO-639), +and may contain a two-letter (upper-case) +country code (as defined by ISO-3166). +Language and country codes must be +separated by hyphen (-) or underscore +(_). + </description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Vendor- or browser-specific variant. +See the java.util.Locale javadocs for +more information on variants. + </description> + <name>variant</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of the locale configuration variable. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Specifies the time zone for any time formatting or parsing actions + nested in its body + </description> + <name>timeZone</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.TimeZoneTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +The time zone. A String value is interpreted as +a time zone ID. This may be one of the time zone +IDs supported by the Java platform (such as +"America/Los_Angeles") or a custom time zone +ID (such as "GMT-8"). See +java.util.TimeZone for more information on +supported time zone formats. + </description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Stores the given time zone in the time zone configuration variable + </description> + <name>setTimeZone</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetTimeZoneTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +The time zone. A String value is interpreted as +a time zone ID. This may be one of the time zone +IDs supported by the Java platform (such as +"America/Los_Angeles") or a custom time zone +ID (such as "GMT-8"). See java.util.TimeZone for +more information on supported time zone +formats. + </description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable which +stores the time zone of type +java.util.TimeZone. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var or the time zone configuration +variable. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Loads a resource bundle to be used by its tag body + </description> + <name>bundle</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.BundleTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Resource bundle base name. This is the bundle's +fully-qualified resource name, which has the same +form as a fully-qualified class name, that is, it uses +"." as the package component separator and does not +have any file type (such as ".class" or ".properties") +suffix. + </description> + <name>basename</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Prefix to be prepended to the value of the message +key of any nested <fmt:message> action. + </description> + <name>prefix</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Loads a resource bundle and stores it in the named scoped variable or + the bundle configuration variable + </description> + <name>setBundle</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetBundleTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +Resource bundle base name. This is the bundle's +fully-qualified resource name, which has the same +form as a fully-qualified class name, that is, it uses +"." as the package component separator and does not +have any file type (such as ".class" or ".properties") +suffix. + </description> + <name>basename</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable which stores +the i18n localization context of type +javax.servlet.jsp.jstl.fmt.LocalizationC +ontext. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var or the localization context +configuration variable. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Maps key to localized message and performs parametric replacement + </description> + <name>message</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Message key to be looked up. + </description> + <name>key</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Localization context in whose resource +bundle the message key is looked up. + </description> + <name>bundle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable +which stores the localized message. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Supplies an argument for parametric replacement to a containing + <message> tag + </description> + <name>param</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParamTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Argument used for parametric replacement. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Formats a numeric value as a number, currency, or percentage + </description> + <name>formatNumber</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatNumberTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Numeric value to be formatted. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether the value is to be +formatted as number, currency, or +percentage. + </description> + <name>type</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Custom formatting pattern. + </description> + <name>pattern</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +ISO 4217 currency code. Applied only +when formatting currencies (i.e. if type is +equal to "currency"); ignored otherwise. + </description> + <name>currencyCode</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Currency symbol. Applied only when +formatting currencies (i.e. if type is equal +to "currency"); ignored otherwise. + </description> + <name>currencySymbol</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether the formatted output +will contain any grouping separators. + </description> + <name>groupingUsed</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Maximum number of digits in the integer +portion of the formatted output. + </description> + <name>maxIntegerDigits</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Minimum number of digits in the integer +portion of the formatted output. + </description> + <name>minIntegerDigits</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Maximum number of digits in the +fractional portion of the formatted output. + </description> + <name>maxFractionDigits</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Minimum number of digits in the +fractional portion of the formatted output. + </description> + <name>minFractionDigits</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable +which stores the formatted result as a +String. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Parses the string representation of a number, currency, or percentage + </description> + <name>parseNumber</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseNumberTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +String to be parsed. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether the string in the value +attribute should be parsed as a number, +currency, or percentage. + </description> + <name>type</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Custom formatting pattern that determines +how the string in the value attribute is to be +parsed. + </description> + <name>pattern</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Locale whose default formatting pattern (for +numbers, currencies, or percentages, +respectively) is to be used during the parse +operation, or to which the pattern specified +via the pattern attribute (if present) is +applied. + </description> + <name>parseLocale</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether just the integer portion of +the given value should be parsed. + </description> + <name>integerOnly</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable which +stores the parsed result (of type +java.lang.Number). + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Formats a date and/or time using the supplied styles and pattern + </description> + <name>formatDate</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatDateTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description> +Date and/or time to be formatted. + </description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether the time, the date, or both +the time and date components of the given +date are to be formatted. + </description> + <name>type</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Predefined formatting style for dates. Follows +the semantics defined in class +java.text.DateFormat. Applied only +when formatting a date or both a date and +time (i.e. if type is missing or is equal to +"date" or "both"); ignored otherwise. + </description> + <name>dateStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Predefined formatting style for times. Follows +the semantics defined in class +java.text.DateFormat. Applied only +when formatting a time or both a date and +time (i.e. if type is equal to "time" or "both"); +ignored otherwise. + </description> + <name>timeStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Custom formatting style for dates and times. + </description> + <name>pattern</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Time zone in which to represent the formatted +time. + </description> + <name>timeZone</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable which +stores the formatted result as a String. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + + <tag> + <description> + Parses the string representation of a date and/or time + </description> + <name>parseDate</name> + <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseDateTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description> +Date string to be parsed. + </description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Specifies whether the date string in the +value attribute is supposed to contain a +time, a date, or both. + </description> + <name>type</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Predefined formatting style for days +which determines how the date +component of the date string is to be +parsed. Applied only when formatting a +date or both a date and time (i.e. if type +is missing or is equal to "date" or "both"); +ignored otherwise. + </description> + <name>dateStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Predefined formatting styles for times +which determines how the time +component in the date string is to be +parsed. Applied only when formatting a +time or both a date and time (i.e. if type +is equal to "time" or "both"); ignored +otherwise. + </description> + <name>timeStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Custom formatting pattern which +determines how the date string is to be +parsed. + </description> + <name>pattern</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Time zone in which to interpret any time +information in the date string. + </description> + <name>timeZone</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Locale whose predefined formatting styles +for dates and times are to be used during +the parse operation, or to which the +pattern specified via the pattern +attribute (if present) is applied. + </description> + <name>parseLocale</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description> +Name of the exported scoped variable in +which the parsing result (of type +java.util.Date) is stored. + </description> + <name>var</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + <attribute> + <description> +Scope of var. + </description> + <name>scope</name> + <required>false</required> + <rtexprvalue>false</rtexprvalue> + </attribute> + </tag> + +</taglib> diff --git a/babsi/BabsiWeb/web-app/WEB-INF/tld/grails.tld b/babsi/BabsiWeb/web-app/WEB-INF/tld/grails.tld new file mode 100644 index 0000000000000000000000000000000000000000..9bd036b8ce9fb46289eaa4df2f5c9d3a3497ba34 --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/tld/grails.tld @@ -0,0 +1,550 @@ +<?xml version="1.0" encoding="UTF-8"?> +<taglib xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee + http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" + version="2.0"> + <description>The Grails custom tag library</description> + <tlib-version>0.2</tlib-version> + <short-name>grails</short-name> + <uri>http://grails.codehaus.org/tags</uri> + + <tag> + <name>link</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspLinkTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>controller</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>params</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>form</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspFormTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>controller</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>method</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>select</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspSelectTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>optionKey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>optionValue</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>datePicker</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspDatePickerTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>precision</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>false</dynamic-attributes> + </tag> + <tag> + <name>currencySelect</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspCurrencySelectTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>localeSelect</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspLocaleSelectTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>timeZoneSelect</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspTimeZoneSelectTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>checkBox</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspCheckboxTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>hasErrors</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspHasErrorsTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>model</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>bean</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>field</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>false</dynamic-attributes> + </tag> + <tag> + <name>eachError</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>model</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>bean</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>field</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>false</dynamic-attributes> + </tag> + <tag> + <name>renderErrors</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>model</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>bean</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>field</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>as</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>false</dynamic-attributes> + </tag> + <tag> + <name>message</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspMessageTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>code</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>error</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>default</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>false</dynamic-attributes> + </tag> + <tag> + <name>remoteFunction</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteFunctionTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>before</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>after</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>controller</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>params</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>asynchronous</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>method</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>update</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onSuccess</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onFailure</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onComplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoading</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoaded</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onInteractive</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>remoteLink</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteLinkTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>before</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>after</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>controller</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>params</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>asynchronous</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>method</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>update</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onSuccess</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onFailure</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onComplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoading</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoaded</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onInteractive</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>formRemote</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspFormRemoteTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <name>before</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>after</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>controller</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>url</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>params</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>asynchronous</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>method</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>update</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onSuccess</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onFailure</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onComplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoading</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onLoaded</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <name>onInteractive</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <tag> + <name>invokeTag</name> + <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspInvokeGrailsTagLibTag</tag-class> + <body-content>JSP</body-content> + <variable> + <name-given>it</name-given> + <variable-class>java.lang.Object</variable-class> + <declare>true</declare> + <scope>NESTED</scope> + </variable> + <attribute> + <name>tagName</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> +</taglib> + diff --git a/babsi/BabsiWeb/web-app/WEB-INF/tld/spring.tld b/babsi/BabsiWeb/web-app/WEB-INF/tld/spring.tld new file mode 100644 index 0000000000000000000000000000000000000000..1bc7091f03c98e4c6182a154aafddef0c4ff78e6 --- /dev/null +++ b/babsi/BabsiWeb/web-app/WEB-INF/tld/spring.tld @@ -0,0 +1,311 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> + +<taglib> + + <tlib-version>1.1.1</tlib-version> + + <jsp-version>1.2</jsp-version> + + <short-name>Spring</short-name> + + <uri>http://www.springframework.org/tags</uri> + + <description>Spring Framework JSP Tag Library. Authors: Rod Johnson, Juergen Hoeller</description> + + + <tag> + + <name>htmlEscape</name> + <tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class> + <body-content>JSP</body-content> + + <description> + Sets default HTML escape value for the current page. + Overrides a "defaultHtmlEscape" context-param in web.xml, if any. + </description> + + <attribute> + <name>defaultHtmlEscape</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>escapeBody</name> + <tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class> + <body-content>JSP</body-content> + + <description> + Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>javaScriptEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>message</name> + <tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class> + <body-content>JSP</body-content> + + <description> + Retrieves the message with the given code, or text if code isn't resolvable. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <attribute> + <name>code</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>arguments</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>text</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>var</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>javaScriptEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>theme</name> + <tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class> + <body-content>JSP</body-content> + + <description> + Retrieves the theme message with the given code, or text if code isn't resolvable. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <attribute> + <name>code</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>arguments</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>text</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>var</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>javaScriptEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>hasBindErrors</name> + <tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class> + <body-content>JSP</body-content> + + <description> + Provides Errors instance in case of bind errors. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <variable> + <name-given>errors</name-given> + <variable-class>org.springframework.validation.Errors</variable-class> + </variable> + + <attribute> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>nestedPath</name> + <tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class> + <body-content>JSP</body-content> + + <description> + Sets a nested path to be used by the bind tag's path. + </description> + + <variable> + <name-given>nestedPath</name-given> + <variable-class>java.lang.String</variable-class> + </variable> + + <attribute> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>bind</name> + <tag-class>org.springframework.web.servlet.tags.BindTag</tag-class> + <body-content>JSP</body-content> + + <description> + Provides BindStatus object for the given bind path. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <variable> + <name-given>status</name-given> + <variable-class>org.springframework.web.servlet.support.BindStatus</variable-class> + </variable> + + <attribute> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>ignoreNestedPath</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + + + <tag> + + <name>transform</name> + <tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class> + <body-content>JSP</body-content> + + <description> + Provides transformation of variables to Strings, using an appropriate + custom PropertyEditor from BindTag (can only be used inside BindTag). + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + </description> + + <attribute> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>var</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + <attribute> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + + </tag> + +</taglib> diff --git a/babsi/BabsiWeb/web-app/css/babsi.css b/babsi/BabsiWeb/web-app/css/babsi.css new file mode 100644 index 0000000000000000000000000000000000000000..ba0c875a5f4811306cac811c1a71dbf359dd2020 --- /dev/null +++ b/babsi/BabsiWeb/web-app/css/babsi.css @@ -0,0 +1,810 @@ +body { + background-color: #333; +} + +#login.container { + max-width: 300px !important; +} + +#login .navbar-brand { + margin-left: 0!important; + width: 100%; + text-align: center; + -webkit-font-smoothing: antialiased; +} +#sidebar { + padding: 0px; + background-color: #333; + padding-top: 20px; +} + +#sidebar ul.nav { + border-radius: 5px 0 5px 5px; +} + +.navbar-brand,.navbar-brand a,.navbar-brand a:visited { + color: #666; + font-size: 40px; + margin-left: 12px; + text-shadow: 0 -1px 1px #666, 0 1px 1px #000; + font-family: verdana; +} + +.navbar-brand:hover,.navbar-brand a:hover,.navbar-brand a:active,.navbar-brand a:focus + { + color: #444; + text-decoration: none; +} + +#sidebar .row { + margin: 0; +} + +#content { + padding-left: 0px; +} + +#sidebar .nav a { + margin-left: 15px; + color: #DDD; +} + +#sidebar .nav a:active,#sidebar .nav a:hover { + margin-left: 15px; + color: #000; +} + +.panel { + -moz-box-shadow: 0 0 15px #999; + -webkit-box-shadow: 0 0 15px #999; + box-shadow: 0 0 15px #999; +} + +#sidebar .nav .active { + /* background-color: #AAA; */ + -webkit-box-shadow: inset 0px 3px 15px #666; /* webkit browser*/ + -moz-box-shadow: inset 0px 3px 15px #666; /* firefox */ + box-shadow: inset 0px 3px 15px #666; +} + +.box-shadow { + -webkit-box-shadow: 0px 0px 15px #ffffff; /* webkit browser*/ + -moz-box-shadow: 0px 0px 15px #ffffff; /* firefox */ + box-shadow: 0px 0px 15px #ffffff; +} + +#headmenu { + float: right; + margin-right: 15px; + margin-top: 7px; +} + + +/* BUTTONS */ +.btn-default:hover,.btn-default:active,.btn-default:focus { + -moz-box-shadow: 0 0 15px #999; + -webkit-box-shadow: 0 0 15px #999; + box-shadow: 0 0 15px #999; +} + +.btn-danger:hover,.btn-danger:active,.btn-danger:focus { + -moz-box-shadow: 0 0 15px #F44; + -webkit-box-shadow: 0 0 15px #F44; + box-shadow: 0 0 15px #F44; +} + +.btn-success:hover,.btn-success:active,.btn-success:focus { + -moz-box-shadow: 0 0 15px #47a447; + -webkit-box-shadow: 0 0 15px #47a447; + box-shadow: 0 0 15px #47a447; +} + + +.skip { + display: none; +} + + +/* Statistiken */ +.statisticControls { + margin-bottom: 10px; +} + +/* GRAILS PANEL NAVIGATION MENU */ +#content .nav { + background-color: #efefef; + padding: 0.5em 0.75em 0 0.75em; + -moz-box-shadow: 0 0 3px 1px #aaaaaa; + -webkit-box-shadow: 0 0 3px 1px #aaaaaa; + box-shadow: 0 0 3px 1px #aaaaaa; + zoom: 1; +} + +#content .nav ul { + overflow: hidden; + padding-left: 0; + zoom: 1; +} + +#content .nav li { + display: block; + float: left; + list-style-type: none; + margin-right: 0.5em; + padding: 0; +} + +#content .nav a { + color: #666666; + display: block; + padding: 0.25em 0.7em; + text-decoration: none; + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +#content .nav a:active,#content .nav a:visited { + color: #666666; +} + +#content .nav a:focus,#content .nav a:hover { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); +} + +#content .no-borderradius .nav a:focus,#content .no-borderradius .nav a:hover + { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +#content .nav a.home,#content .nav a.list,#content .nav a.create { + background-position: 0.7em center; + background-repeat: no-repeat; + text-indent: 25px; +} + +#content .nav a.home { + background-image: url(../images/skin/house.png); +} + +#content .nav a.list { + background-image: url(../images/skin/database_table.png); +} + +#content .nav a.create { + background-image: url(../images/skin/database_add.png); +} + +/* CREATE/EDIT FORMS AND SHOW PAGES */ +fieldset,.property-list { + margin:0; /* 0.6em 1.25em 0 1.25em*/ + padding: 0; /* 0.3em 1.8em 1.25em; */ + position: relative; + zoom: 1; + border: none; +} + +.property-list .fieldcontain { + list-style: none; + overflow: hidden; + zoom: 1; +} + +.fieldcontain { + margin-top: 1em; +} + +.fieldcontain label,.fieldcontain .property-label { + color: #666666; + text-align: right; + width: 25%; +} + +.fieldcontain .property-label { +float: left; +min-width: 100px; +padding-right: 5px; +} + +.fieldcontain .property-value { + display: block; + margin-left: 27%; +} + +label { + cursor: pointer; + display: inline-block; + margin: 0 0.25em 0 0; +} + +input,select,textarea { + background-color: #fcfcfc; + border: 1px solid #cccccc; + font-size: 1em; + padding: 0.2em 0.4em; +} + +select { + padding: 0.2em 0.2em 0.2em 0; +} + +select[multiple] { + vertical-align: top; +} + +textarea { + width: 250px; + height: 150px; + overflow: auto; /* IE always renders vertical scrollbar without this */ + vertical-align: top; +} + +input[type=checkbox],input[type=radio] { + background-color: transparent; + border: 0; + padding: 0; +} + +input:focus,select:focus,textarea:focus { + background-color: #ffffff; + border: 1px solid #eeeeee; + outline: 0; + -moz-box-shadow: 0 0 0.5em #ffffff; + -webkit-box-shadow: 0 0 0.5em #ffffff; + box-shadow: 0 0 0.5em #ffffff; +} + +.required-indicator { + color: #48802C; + display: inline-block; + font-weight: bold; + margin-left: 0.3em; + position: relative; + top: 0.1em; +} + +ul.one-to-many { + display: inline-block; + list-style-position: inside; + vertical-align: top; +} + +.ie6 ul.one-to-many,.ie7 ul.one-to-many { + display: inline; + zoom: 1; +} + +ul.one-to-many li.add { + list-style-type: none; +} + +/* EMBEDDED PROPERTIES */ +fieldset.embedded { + background-color: transparent; + border: 1px solid #CCCCCC; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +fieldset.embedded legend { + margin: 0 1em; +} + +/* MESSAGES AND ERRORS */ +.errors,.message { + font-size: 0.8em; + line-height: 2; + margin: 1em 2em; + padding: 0.25em; +} + +.message { + background: #f3f3ff; + border: 1px solid #b2d1ff; + color: #006dba; + -moz-box-shadow: 0 0 0.25em #b2d1ff; + -webkit-box-shadow: 0 0 0.25em #b2d1ff; + box-shadow: 0 0 0.25em #b2d1ff; +} + +.errors { + background: #fff3f3; + border: 1px solid #ffaaaa; + color: #cc0000; + -moz-box-shadow: 0 0 0.25em #ff8888; + -webkit-box-shadow: 0 0 0.25em #ff8888; + box-shadow: 0 0 0.25em #ff8888; +} + +.errors ul,.message { + padding: 0; +} + +.errors li { + list-style: none; + background: transparent url(../images/skin/exclamation.png) 0.5em 50% + no-repeat; + text-indent: 2.2em; +} + +.message { + background: transparent url(../images/skin/information.png) 0.5em 50% + no-repeat; + text-indent: 2.2em; +} + +/* form fields with errors */ +.error input,.error select,.error textarea { + background: #fff3f3; + border-color: #ffaaaa; + color: #cc0000; +} + +.error input:focus,.error select:focus,.error textarea:focus { + -moz-box-shadow: 0 0 0.5em #ffaaaa; + -webkit-box-shadow: 0 0 0.5em #ffaaaa; + box-shadow: 0 0 0.5em #ffaaaa; +} + +/* same effects for browsers that support HTML5 client-side validation (these have to be specified separately or IE will ignore the entire rule) */ +input:invalid,select:invalid,textarea:invalid { + background: #fff3f3; + border-color: #ffaaaa; + color: #cc0000; +} + +input:invalid:focus,select:invalid:focus,textarea:invalid:focus { + -moz-box-shadow: 0 0 0.5em #ffaaaa; + -webkit-box-shadow: 0 0 0.5em #ffaaaa; + box-shadow: 0 0 0.5em #ffaaaa; +} + +/* TABLES */ +table { + border-top: 1px solid #DFDFDF; + border-collapse: collapse; + width: 100%; + margin-bottom: 1em; +} + +tr { + border: 0; +} + +tr>td:first-child,tr>th:first-child { + padding-left: 1.25em; +} + +tr>td:last-child,tr>th:last-child { + padding-right: 1.25em; +} + +td,th { + line-height: 1.5em; + padding: 0.5em 0.6em; + text-align: left; + vertical-align: top; +} + +th { + background-color: #efefef; + background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), + color-stop(1, #eaeaea)); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr= '#ffffff', + EndColorStr= '#eaeaea'); + -ms-filter: + "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eaeaea')"; + color: #666666; + font-weight: bold; + line-height: 1.7em; + padding: 0.2em 0.6em; +} + +thead th { + white-space: nowrap; +} + +th a { + display: block; + text-decoration: none; +} + +th a:link,th a:visited { + color: #666666; +} + +th a:hover,th a:focus { + color: #333333; +} + +th.sortable a { + background-position: right; + background-repeat: no-repeat; + padding-right: 1.1em; +} + +th.asc a { + background-image: url(../images/skin/sorted_asc.gif); +} + +th.desc a { + background-image: url(../images/skin/sorted_desc.gif); +} + +.odd { + background: #f7f7f7; +} + +.even { + background: #ffffff; +} + +th:hover,tr:hover { + background: #CCC; +} + +/* PAGINATION */ +.pagination { + border-top: 0; + margin: 0; + padding: 0.3em 0.2em; + text-align: center; + -moz-box-shadow: 0 0 3px 1px #AAAAAA; + -webkit-box-shadow: 0 0 3px 1px #AAAAAA; + box-shadow: 0 0 3px 1px #AAAAAA; + background-color: #EFEFEF; +} + +.pagination a,.pagination .currentStep { + color: #666666; + display: inline-block; + margin: 0 0.1em; + padding: 0.25em 0.7em; + text-decoration: none; + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +.pagination a:hover,.pagination a:focus,.pagination .currentStep { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); +} + +.no-borderradius .pagination a:hover,.no-borderradius .pagination a:focus,.no-borderradius .pagination .currentStep + { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +/* ACTION BUTTONS */ +.buttons { + background-color: #efefef; + overflow: hidden; + padding: 0.3em; + -moz-box-shadow: 0 0 3px 1px #aaaaaa; + -webkit-box-shadow: 0 0 3px 1px #aaaaaa; + box-shadow: 0 0 3px 1px #aaaaaa; + margin: 0.1em 0 0 0; + border: none; +} + +.buttons input,.buttons a { + background-color: transparent; + border: 0; + color: #666666; + cursor: pointer; + display: inline-block; + margin: 0 0.25em 0; + overflow: visible; + padding: 0.25em 0.7em; + text-decoration: none; + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +.buttons input:hover,.buttons input:focus,.buttons a:hover,.buttons a:focus + { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.no-borderradius .buttons input:hover,.no-borderradius .buttons input:focus,.no-borderradius .buttons a:hover,.no-borderradius .buttons a:focus + { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +.buttons .delete,.buttons .edit,.buttons .save { + background-position: 0.7em center; + background-repeat: no-repeat; + text-indent: 25px; +} + +.ie6 .buttons input.delete,.ie6 .buttons input.edit,.ie6 .buttons input.save,.ie7 .buttons input.delete,.ie7 .buttons input.edit,.ie7 .buttons input.save + { + padding-left: 36px; +} + +.buttons .delete { + background-image: url(../images/skin/database_delete.png); +} + +.buttons .edit { + background-image: url(../images/skin/database_edit.png); +} + +.buttons .save { + background-image: url(../images/skin/database_save.png); +} + +a.skip { + position: absolute; + left: -9999px; +} + +/*! + * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x + * + * Copyright 2013 Dan Grossman ( http://www.dangrossman.info ) + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Built for http://www.improvely.com + */ + + .daterangepicker.dropdown-menu { + max-width: none; +} + +.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { + float: left; + margin: 4px; +} + +.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar { + float: right; + margin: 4px; +} + +.daterangepicker .ranges { + width: 160px; + text-align: left; +} + +.daterangepicker .ranges .range_inputs>div { + float: left; +} + +.daterangepicker .ranges .range_inputs>div:nth-child(2) { + padding-left: 11px; +} + +.daterangepicker .calendar { + display: none; + max-width: 270px; +} + +.daterangepicker .calendar th, .daterangepicker .calendar td { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + white-space: nowrap; + text-align: center; + min-width: 32px; +} + +.daterangepicker .ranges label { + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; +/* width: 74px; */ +} + +.daterangepicker .ranges input { + font-size: 11px; +} + +.daterangepicker .ranges .input-mini { + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0; + padding: 0; +} + +.daterangepicker .ranges li { + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; +} + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background: #08c; + border: 1px solid #08c; + color: #fff; +} + +.daterangepicker .calendar-date { + border: 1px solid #ddd; + padding: 4px; + border-radius: 4px; + background: #fff; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 8px auto 0 auto; + line-height: 30px; +} + +.daterangepicker { + position: absolute; + background: #fff; + top: 100px; + left: 20px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker.opensleft:before { + position: absolute; + top: -7px; + right: 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: ''; +} + +.daterangepicker.opensleft:after { + position: absolute; + top: -6px; + right: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.opensright: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: ''; +} + +.daterangepicker.opensright: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: ''; +} + +.daterangepicker table { + width: 100%; + margin: 0; +} + +.daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; +} + +.daterangepicker td.off { + color: #999; +} + +.daterangepicker td.disabled { + color: #999; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background: #eee; +} + +.daterangepicker td.in-range { + background: #ebf4f8; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: #3071a9; + color: #fff; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; +} \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/css/bootstrap.css b/babsi/BabsiWeb/web-app/css/bootstrap.css new file mode 100644 index 0000000000000000000000000000000000000000..5c8582148e03dc33a0368281504f3153423b93ed --- /dev/null +++ b/babsi/BabsiWeb/web-app/css/bootstrap.css @@ -0,0 +1,5909 @@ +/*! + * Bootstrap v3.0.0 + * + * 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 @twitter by @mdo and @fat. + */ + +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden] { + display: none; +} +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +mark { + background: #ff0; + color: #000; +} +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} +pre { + white-space: pre-wrap; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button, +input { + line-height: normal; +} +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; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +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; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +*, +*: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.428571429; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +button, +input, +select[multiple], +textarea { + background-image: none; +} +a { + color: #428bca; + text-decoration: none; +} +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.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 #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0 0 0 0); + border: 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) ")"; + } + .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: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .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; + } +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16.099999999999998px; + font-weight: 200; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small { + font-size: 85%; +} +cite { + font-style: normal; +} +.text-muted { + color: #999999; +} +.text-primary { + color: #428bca; +} +.text-warning { + color: #c09853; +} +.text-danger { + color: #b94a48; +} +.text-success { + color: #468847; +} +.text-info { + color: #3a87ad; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; +} +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: #999999; +} +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} +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; +} +h1 small, +.h1 small { + font-size: 24px; +} +h2 small, +.h2 small { + font-size: 18px; +} +h3 small, +.h3 small, +h4 small, +.h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +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; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.428571429; +} +dt { + font-weight: bold; +} +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; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + + } + .dl-horizontal dd:after { + clear: both; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} +blockquote p:last-child { + margin-bottom: 0; +} +blockquote small { + display: block; + line-height: 1.428571429; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-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: 1.428571429; +} +code, +pre { + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + white-space: nowrap; + border-radius: 4px; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container:before, +.container:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.container:after { + clear: both; +} +.container:before, +.container:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.container:after { + clear: both; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.row:before, +.row:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.row:after { + clear: both; +} +.row:before, +.row:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.row:after { + clear: both; +} +.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, +.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, +.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, +.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 { + 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 { + float: left; +} +.col-xs-1 { + width: 8.333333333333332%; +} +.col-xs-2 { + width: 16.666666666666664%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-4 { + width: 33.33333333333333%; +} +.col-xs-5 { + width: 41.66666666666667%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-7 { + width: 58.333333333333336%; +} +.col-xs-8 { + width: 66.66666666666666%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-10 { + width: 83.33333333333334%; +} +.col-xs-11 { + width: 91.66666666666666%; +} +.col-xs-12 { + width: 100%; +} +@media (min-width: 768px) { + .container { + max-width: 750px; + } + .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 { + float: left; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-12 { + width: 100%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } +} +@media (min-width: 992px) { + .container { + max-width: 970px; + } + .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 { + float: left; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-3 { + width: 25%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-6 { + width: 50%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-9 { + width: 75%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-12 { + width: 100%; + } + .col-md-push-0 { + left: auto; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-offset-0 { + margin-left: 0; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1170px; + } + .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 { + float: left; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-12 { + width: 100%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-offset-0 { + margin-left: 0; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } +} +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.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.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 #dddddd; +} +.table .table { + background-color: #ffffff; +} +.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 #dddddd; +} +.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 #dddddd; +} +.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-"] { + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + 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 > 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; + border-color: #d6e9c6; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td { + background-color: #d0e9c6; + border-color: #c9e2b3; +} +.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; + border-color: #eed3d7; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td { + background-color: #ebcccc; + border-color: #e6c1c7; +} +.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; + border-color: #fbeed5; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td { + background-color: #faf2cc; + border-color: #f8e5be; +} +@media (max-width: 768px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + overflow-x: scroll; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + background-color: #fff; + } + .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 > thead > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > thead > tr:last-child > td, + .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; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + 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; +} +select[multiple], +select[size] { + height: auto; +} +select optgroup { + font-size: inherit; + font-style: inherit; + font-family: inherit; +} +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; +} +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} +.form-control:-moz-placeholder { + color: #999999; +} +.form-control::-moz-placeholder { + color: #999999; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; + background-color: #ffffff; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-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-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, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; +} +textarea.form-control { + height: auto; +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + display: block; + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 20px; + vertical-align: middle; +} +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + 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; + vertical-align: middle; + font-weight: normal; + 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 { + height: auto; +} +.input-lg { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-lg { + height: 45px; + line-height: 45px; +} +textarea.input-lg { + height: auto; +} +.has-warning .help-block, +.has-warning .control-label { + color: #c09853; +} +.has-warning .form-control { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #a47e3c; + -webkit-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; +} +.has-warning .input-group-addon { + color: #c09853; + border-color: #c09853; + background-color: #fcf8e3; +} +.has-error .help-block, +.has-error .control-label { + color: #b94a48; +} +.has-error .form-control { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #953b39; + -webkit-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; +} +.has-error .input-group-addon { + color: #b94a48; + border-color: #b94a48; + background-color: #f2dede; +} +.has-success .help-block, +.has-success .control-label { + color: #468847; +} +.has-success .form-control { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #356635; + -webkit-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; +} +.has-success .input-group-addon { + color: #468847; + border-color: #468847; + background-color: #dff0d8; +} +.form-control-static { + margin-bottom: 0; + padding-top: 7px; +} +.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; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 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 .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + 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: #ffffff; + border-color: #cccccc; +} +.btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + 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-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + 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-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + 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-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + 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-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + 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-link { + color: #428bca; + font-weight: normal; + 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: #999999; + text-decoration: none; +} +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +.btn-sm, +.btn-xs { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs { + padding: 1px 5px; +} +.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%; +} +@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; +} +.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-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-print:before { + content: "\e045"; +} +.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-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.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-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-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.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"; +} +.glyphicon-briefcase:before { + content: "\1f4bc"; +} +.glyphicon-calendar:before { + content: "\1f4c5"; +} +.glyphicon-pushpin:before { + content: "\1f4cc"; +} +.glyphicon-paperclip:before { + content: "\1f4ce"; +} +.glyphicon-camera:before { + content: "\1f4f7"; +} +.glyphicon-lock:before { + content: "\1f512"; +} +.glyphicon-bell:before { + content: "\1f514"; +} +.glyphicon-bookmark:before { + content: "\1f516"; +} +.glyphicon-fire:before { + content: "\1f525"; +} +.glyphicon-wrench:before { + content: "\1f527"; +} +.btn-default .caret { + border-top-color: #333333; +} +.btn-primary .caret, +.btn-success .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret { + border-top-color: #fff; +} +.dropup .btn-default .caret { + border-bottom-color: #333333; +} +.dropup .btn-primary .caret, +.dropup .btn-success .caret, +.dropup .btn-warning .caret, +.dropup .btn-danger .caret, +.dropup .btn-info .caret { + border-bottom-color: #fff; +} +.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:before, +.btn-toolbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, +.btn-toolbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn-group { + float: left; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-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-xs > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; + padding: 1px 5px; +} +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +.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, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.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 { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.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 > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-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 { + float: none; + display: table-cell; + width: 1%; +} +[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.col { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 45px; + 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: 45px; + line-height: 45px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.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 { + 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; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + 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 > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + 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 > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -4px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, +.nav:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.nav:after { + clear: both; +} +.nav:before, +.nav:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.nav:after { + clear: both; +} +.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: #eeeeee; +} +.nav > li.disabled > a { + color: #999999; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + 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 #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #dddddd; + 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; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } +} +.nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + margin-right: 0; +} +.nav-tabs.nav-justified > .active > a { + border-bottom-color: #ffffff; +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 5px; +} +.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: #ffffff; + 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; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + margin-right: 0; +} +.nav-tabs-justified > .active > a { + border-bottom-color: #ffffff; +} +.tabbable:before, +.tabbable:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.tabbable:after { + clear: both; +} +.tabbable:before, +.tabbable:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.tabbable:after { + clear: both; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.nav .caret { + border-top-color: #428bca; + border-bottom-color: #428bca; +} +.nav a:hover .caret { + border-top-color: #2a6496; + border-bottom-color: #2a6496; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + z-index: 1000; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +.navbar:before, +.navbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar:after { + clear: both; +} +.navbar:before, +.navbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar:after { + clear: both; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +.navbar-header:before, +.navbar-header:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-header:after { + clear: both; +} +.navbar-header:before, +.navbar-header:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-header:after { + clear: both; +} +@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, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-collapse:after { + clear: both; +} +.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-collapse .navbar-nav.navbar-left:first-child { + margin-left: -15px; + } + .navbar-collapse .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } + .navbar-collapse .navbar-text:last-child { + margin-right: 0; + } +} +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + 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; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + z-index: 1030; + top: 0; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; +} +.navbar-brand { + float: left; + 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 { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; +} +.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; + } +} +@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, 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); + 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; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 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-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-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-text { + float: left; + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + margin-left: 15px; + margin-right: 15px; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777777; +} +.navbar-default .navbar-nav > li > a { + color: #777777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #dddddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e6e6e6; +} +.navbar-default .navbar-nav > .dropdown > a:hover .caret, +.navbar-default .navbar-nav > .dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555555; +} +.navbar-default .navbar-nav > .open > a .caret, +.navbar-default .navbar-nav > .open > a:hover .caret, +.navbar-default .navbar-nav > .open > a:focus .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.navbar-default .navbar-nav > .dropdown > a .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + 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: #555555; + 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: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777777; +} +.navbar-default .navbar-link:hover { + color: #333333; +} +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #999999; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #999999; +} +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.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: #ffffff; +} +.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .navbar-nav > .dropdown > a .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} +.navbar-inverse .navbar-nav > .open > a .caret, +.navbar-inverse .navbar-nav > .open > a:hover .caret, +.navbar-inverse .navbar-nav > .open > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + 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: #ffffff; + 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: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.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: #cccccc; +} +.breadcrumb > .active { + color: #999999; +} +.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.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + 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 { + background-color: #eeeeee; +} +.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: #ffffff; + background-color: #428bca; + border-color: #428bca; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: #dddddd; + 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:before, +.pager:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.pager:after { + clear: both; +} +.pager:before, +.pager:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.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; + background-color: #ffffff; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.label-default { + background-color: #999999; +} +.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; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #999999; + border-radius: 10px; +} +.badge:empty { + display: none; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.btn .badge { + position: relative; + top: -1px; +} +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #428bca; + background-color: #ffffff; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1 { + line-height: 1; + color: inherit; +} +.jumbotron p { + line-height: 1.4; +} +.container .jumbotron { + border-radius: 6px; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1 { + font-size: 63px; + } +} +.thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; + display: block; +} +.thumbnail > img { + display: block; + max-width: 100%; + height: auto; +} +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #428bca; +} +.thumbnail > img { + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.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 { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #356635; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #2d6987; +} +.alert-warning { + background-color: #fcf8e3; + border-color: #fbeed5; + color: #c09853; +} +.alert-warning hr { + border-top-color: #f8e5be; +} +.alert-warning .alert-link { + color: #a47e3c; +} +.alert-danger { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-danger hr { + border-top-color: #e6c1c7; +} +.alert-danger .alert-link { + color: #953b39; +} +@-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; + } +} +@-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 { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-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; + background-color: #428bca; + -webkit-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-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar { + 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: 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-size: 40px 40px; +} +.progress.active .progress-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-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + 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: 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-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + 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: 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-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + 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: 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-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + 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: 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); +} +.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: #ffffff; + border: 1px solid #dddddd; +} +.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: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #e1edf7; +} +.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: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-body:before, +.panel-body:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.panel-body:after { + clear: both; +} +.panel-body:before, +.panel-body:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.panel-body:after { + clear: both; +} +.panel > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item { + border-width: 1px 0; +} +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.panel > .table { + margin-bottom: 0; +} +.panel > .panel-body + .table { + border-top: 1px solid #dddddd; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; +} +.panel-title > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.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 #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #428bca; +} +.panel-primary > .panel-heading { + color: #ffffff; + 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: #468847; + 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-warning { + border-color: #fbeed5; +} +.panel-warning > .panel-heading { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5; +} +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #fbeed5; +} +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #fbeed5; +} +.panel-danger { + border-color: #eed3d7; +} +.panel-danger > .panel-heading { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #eed3d7; +} +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #eed3d7; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #3a87ad; + 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; +} +.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, 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-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: #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.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + border-bottom: 0 dotted; + content: ""; +} +.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: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 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: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #ffffff; + background-color: #428bca; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #428bca; +} +.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; + 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-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} +.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 dotted; + border-bottom: 4px solid #000000; + 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 { + right: 0; + left: auto; + } +} +.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: 0.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: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + 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: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 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: 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 { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.modal-open { + overflow: hidden; +} +body.modal-open, +.modal-open .navbar-fixed-top, +.modal-open .navbar-fixed-bottom { + margin-right: 15px; +} +.modal { + display: none; + overflow: auto; + overflow-y: scroll; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-dialog { + margin-left: auto; + margin-right: auto; + width: auto; + padding: 10px; + z-index: 1050; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: none; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.428571429px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.428571429; +} +.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:before, +.modal-footer:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.modal-footer:after { + clear: both; +} +.modal-footer:before, +.modal-footer:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.modal-footer:after { + clear: both; +} +.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 screen and (min-width: 768px) { + .modal-dialog { + left: 50%; + right: auto; + width: 600px; + padding-top: 30px; + padding-bottom: 30px; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-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; + max-width: 100%; + height: auto; + 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: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 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-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 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 { + color: #ffffff; + text-decoration: none; + opacity: 0.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%; + left: 50%; + z-index: 5; + display: inline-block; +} +.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 #ffffff; + border-radius: 10px; + cursor: pointer; +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .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 { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.clearfix:after { + clear: both; +} +.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; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +@media screen and (max-width: 400px) { + @-ms-viewport { + width: 320px; + } +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.visible-xs { + display: none !important; +} +tr.visible-xs { + display: none !important; +} +th.visible-xs, +td.visible-xs { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + 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-xs.visible-sm { + display: block !important; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} +.visible-sm { + display: none !important; +} +tr.visible-sm { + display: none !important; +} +th.visible-sm, +td.visible-sm { + display: none !important; +} +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + 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-sm.visible-md { + display: block !important; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} +.visible-md { + display: none !important; +} +tr.visible-md { + display: none !important; +} +th.visible-md, +td.visible-md { + display: none !important; +} +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} +.visible-lg { + display: none !important; +} +tr.visible-lg { + display: none !important; +} +th.visible-lg, +td.visible-lg { + display: none !important; +} +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +.hidden-xs { + display: block !important; +} +tr.hidden-xs { + display: table-row !important; +} +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + tr.hidden-xs { + display: none !important; + } + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm { + display: none !important; + } + tr.hidden-xs.hidden-sm { + display: none !important; + } + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md { + display: none !important; + } + tr.hidden-xs.hidden-md { + display: none !important; + } + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-xs.hidden-lg { + display: none !important; + } + tr.hidden-xs.hidden-lg { + display: none !important; + } + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} +.hidden-sm { + display: block !important; +} +tr.hidden-sm { + display: table-row !important; +} +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-sm.hidden-xs { + display: none !important; + } + tr.hidden-sm.hidden-xs { + display: none !important; + } + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } + tr.hidden-sm { + display: none !important; + } + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md { + display: none !important; + } + tr.hidden-sm.hidden-md { + display: none !important; + } + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-sm.hidden-lg { + display: none !important; + } + tr.hidden-sm.hidden-lg { + display: none !important; + } + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} +.hidden-md { + display: block !important; +} +tr.hidden-md { + display: table-row !important; +} +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-md.hidden-xs { + display: none !important; + } + tr.hidden-md.hidden-xs { + display: none !important; + } + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm { + display: none !important; + } + tr.hidden-md.hidden-sm { + display: none !important; + } + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } + tr.hidden-md { + display: none !important; + } + th.hidden-md, + td.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-md.hidden-lg { + display: none !important; + } + tr.hidden-md.hidden-lg { + display: none !important; + } + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} +.hidden-lg { + display: block !important; +} +tr.hidden-lg { + display: table-row !important; +} +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-lg.hidden-xs { + display: none !important; + } + tr.hidden-lg.hidden-xs { + display: none !important; + } + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm { + display: none !important; + } + tr.hidden-lg.hidden-sm { + display: none !important; + } + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md { + display: none !important; + } + tr.hidden-lg.hidden-md { + display: none !important; + } + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } + tr.hidden-lg { + display: none !important; + } + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +tr.visible-print { + display: none !important; +} +th.visible-print, +td.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print { + display: none !important; + } + tr.hidden-print { + display: none !important; + } + th.hidden-print, + td.hidden-print { + display: none !important; + } +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} diff --git a/babsi/BabsiWeb/web-app/css/errors.css b/babsi/BabsiWeb/web-app/css/errors.css new file mode 100644 index 0000000000000000000000000000000000000000..bdb58bcca873196cb73e89ea78a51b88757d50db --- /dev/null +++ b/babsi/BabsiWeb/web-app/css/errors.css @@ -0,0 +1,109 @@ +h1, h2 { + margin: 10px 25px 5px; +} + +h2 { + font-size: 1.1em; +} + +.filename { + font-style: italic; +} + +.exceptionMessage { + margin: 10px; + border: 1px solid #000; + padding: 5px; + background-color: #E9E9E9; +} + +.stack, +.snippet { + margin: 0 25px 10px; +} + +.stack, +.snippet { + border: 1px solid #ccc; + -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); + -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); + box-shadow: 0 0 2px rgba(0,0,0,0.2); +} + +/* error details */ +.error-details { + border-top: 1px solid #FFAAAA; + -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); + -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); + box-shadow: 0 0 2px rgba(0,0,0,0.2); + border-bottom: 1px solid #FFAAAA; + -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); + -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); + box-shadow: 0 0 2px rgba(0,0,0,0.2); + background-color:#FFF3F3; + line-height: 1.5; + overflow: hidden; + padding: 5px; + padding-left:25px; +} + +.error-details dt { + clear: left; + float: left; + font-weight: bold; + margin-right: 5px; +} + +.error-details dt:after { + content: ":"; +} + +.error-details dd { + display: block; +} + +/* stack trace */ +.stack { + padding: 5px; + overflow: auto; + height: 150px; +} + +/* code snippet */ +.snippet { + background-color: #fff; + font-family: monospace; +} + +.snippet .line { + display: block; +} + +.snippet .lineNumber { + background-color: #ddd; + color: #999; + display: inline-block; + margin-right: 5px; + padding: 0 3px; + text-align: right; + width: 3em; +} + +.snippet .error { + background-color: #fff3f3; + font-weight: bold; +} + +.snippet .error .lineNumber { + background-color: #faa; + color: #333; + font-weight: bold; +} + +.snippet .line:first-child .lineNumber { + padding-top: 5px; +} + +.snippet .line:last-child .lineNumber { + padding-bottom: 5px; +} \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/css/main.css b/babsi/BabsiWeb/web-app/css/main.css new file mode 100644 index 0000000000000000000000000000000000000000..a55945d1597e10ef321855d4734f89017553effb --- /dev/null +++ b/babsi/BabsiWeb/web-app/css/main.css @@ -0,0 +1,596 @@ +/* FONT STACK */ +body, +input, select, textarea { + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + line-height: 1.1; +} + +/* BASE LAYOUT */ + +html { + background-color: #ddd; + background-image: -moz-linear-gradient(center top, #aaa, #ddd); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #aaa), color-stop(1, #ddd)); + background-image: linear-gradient(top, #aaa, #ddd); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#aaaaaa', EndColorStr = '#dddddd'); + background-repeat: no-repeat; + height: 100%; + /* change the box model to exclude the padding from the calculation of 100% height (IE8+) */ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html.no-cssgradients { + background-color: #aaa; +} + +.ie6 html { + height: 100%; +} + +html * { + margin: 0; +} + +body { + background: #ffffff; + color: #333333; + margin: 0 auto; + max-width: 960px; + overflow-x: hidden; /* prevents box-shadow causing a horizontal scrollbar in firefox when viewport < 960px wide */ + -moz-box-shadow: 0 0 0.3em #255b17; + -webkit-box-shadow: 0 0 0.3em #255b17; + box-shadow: 0 0 0.3em #255b17; +} + +#grailsLogo { + background-color: #abbf78; +} + +/* replace with .no-boxshadow body if you have modernizr available */ +.ie6 body, +.ie7 body, +.ie8 body { + border-color: #255b17; + border-style: solid; + border-width: 0 1px; +} + +.ie6 body { + height: 100%; +} + +a:link, a:visited, a:hover { + color: #48802c; +} + +a:hover, a:active { + outline: none; /* prevents outline in webkit on active links but retains it for tab focus */ +} + +h1 { + color: #48802c; + font-weight: normal; + font-size: 1.25em; + margin: 0.8em 0 0.3em 0; +} + +ul { + padding: 0; +} + +img { + border: 0; +} + +/* GENERAL */ + +#grailsLogo a { + display: inline-block; + margin: 1em; +} + +.content { +} + +.content h1 { + border-bottom: 1px solid #CCCCCC; + margin: 0.8em 1em 0.3em; + padding: 0 0.25em; +} + +.scaffold-list h1 { + border: none; +} + +.footer { + background: #abbf78; + color: #000; + clear: both; + font-size: 0.8em; + margin-top: 1.5em; + padding: 1em; + min-height: 1em; +} + +.footer a { + color: #255b17; +} + +.spinner { + background: url(../images/spinner.gif) 50% 50% no-repeat transparent; + height: 16px; + width: 16px; + padding: 0.5em; + position: absolute; + right: 0; + top: 0; + text-indent: -9999px; +} + +/* NAVIGATION MENU */ + +.nav { + background-color: #efefef; + padding: 0.5em 0.75em; + -moz-box-shadow: 0 0 3px 1px #aaaaaa; + -webkit-box-shadow: 0 0 3px 1px #aaaaaa; + box-shadow: 0 0 3px 1px #aaaaaa; + zoom: 1; +} + +.nav ul { + overflow: hidden; + padding-left: 0; + zoom: 1; +} + +.nav li { + display: block; + float: left; + list-style-type: none; + margin-right: 0.5em; + padding: 0; +} + +.nav a { + color: #666666; + display: block; + padding: 0.25em 0.7em; + text-decoration: none; + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +.nav a:active, .nav a:visited { + color: #666666; +} + +.nav a:focus, .nav a:hover { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); +} + +.no-borderradius .nav a:focus, .no-borderradius .nav a:hover { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +.nav a.home, .nav a.list, .nav a.create { + background-position: 0.7em center; + background-repeat: no-repeat; + text-indent: 25px; +} + +.nav a.home { + background-image: url(../images/skin/house.png); +} + +.nav a.list { + background-image: url(../images/skin/database_table.png); +} + +.nav a.create { + background-image: url(../images/skin/database_add.png); +} + +/* CREATE/EDIT FORMS AND SHOW PAGES */ + +fieldset, +.property-list { + margin: 0.6em 1.25em 0 1.25em; + padding: 0.3em 1.8em 1.25em; + position: relative; + zoom: 1; + border: none; +} + +.property-list .fieldcontain { + list-style: none; + overflow: hidden; + zoom: 1; +} + +.fieldcontain { + margin-top: 1em; +} + +.fieldcontain label, +.fieldcontain .property-label { + color: #666666; + text-align: right; + width: 25%; +} + +.fieldcontain .property-label { + float: left; +} + +.fieldcontain .property-value { + display: block; + margin-left: 27%; +} + +label { + cursor: pointer; + display: inline-block; + margin: 0 0.25em 0 0; +} + +input, select, textarea { + background-color: #fcfcfc; + border: 1px solid #cccccc; + font-size: 1em; + padding: 0.2em 0.4em; +} + +select { + padding: 0.2em 0.2em 0.2em 0; +} + +select[multiple] { + vertical-align: top; +} + +textarea { + width: 250px; + height: 150px; + overflow: auto; /* IE always renders vertical scrollbar without this */ + vertical-align: top; +} + +input[type=checkbox], input[type=radio] { + background-color: transparent; + border: 0; + padding: 0; +} + +input:focus, select:focus, textarea:focus { + background-color: #ffffff; + border: 1px solid #eeeeee; + outline: 0; + -moz-box-shadow: 0 0 0.5em #ffffff; + -webkit-box-shadow: 0 0 0.5em #ffffff; + box-shadow: 0 0 0.5em #ffffff; +} + +.required-indicator { + color: #48802C; + display: inline-block; + font-weight: bold; + margin-left: 0.3em; + position: relative; + top: 0.1em; +} + +ul.one-to-many { + display: inline-block; + list-style-position: inside; + vertical-align: top; +} + +.ie6 ul.one-to-many, .ie7 ul.one-to-many { + display: inline; + zoom: 1; +} + +ul.one-to-many li.add { + list-style-type: none; +} + +/* EMBEDDED PROPERTIES */ + +fieldset.embedded { + background-color: transparent; + border: 1px solid #CCCCCC; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +fieldset.embedded legend { + margin: 0 1em; +} + +/* MESSAGES AND ERRORS */ + +.errors, +.message { + font-size: 0.8em; + line-height: 2; + margin: 1em 2em; + padding: 0.25em; +} + +.message { + background: #f3f3ff; + border: 1px solid #b2d1ff; + color: #006dba; + -moz-box-shadow: 0 0 0.25em #b2d1ff; + -webkit-box-shadow: 0 0 0.25em #b2d1ff; + box-shadow: 0 0 0.25em #b2d1ff; +} + +.errors { + background: #fff3f3; + border: 1px solid #ffaaaa; + color: #cc0000; + -moz-box-shadow: 0 0 0.25em #ff8888; + -webkit-box-shadow: 0 0 0.25em #ff8888; + box-shadow: 0 0 0.25em #ff8888; +} + +.errors ul, +.message { + padding: 0; +} + +.errors li { + list-style: none; + background: transparent url(../images/skin/exclamation.png) 0.5em 50% no-repeat; + text-indent: 2.2em; +} + +.message { + background: transparent url(../images/skin/information.png) 0.5em 50% no-repeat; + text-indent: 2.2em; +} + +/* form fields with errors */ + +.error input, .error select, .error textarea { + background: #fff3f3; + border-color: #ffaaaa; + color: #cc0000; +} + +.error input:focus, .error select:focus, .error textarea:focus { + -moz-box-shadow: 0 0 0.5em #ffaaaa; + -webkit-box-shadow: 0 0 0.5em #ffaaaa; + box-shadow: 0 0 0.5em #ffaaaa; +} + +/* same effects for browsers that support HTML5 client-side validation (these have to be specified separately or IE will ignore the entire rule) */ + +input:invalid, select:invalid, textarea:invalid { + background: #fff3f3; + border-color: #ffaaaa; + color: #cc0000; +} + +input:invalid:focus, select:invalid:focus, textarea:invalid:focus { + -moz-box-shadow: 0 0 0.5em #ffaaaa; + -webkit-box-shadow: 0 0 0.5em #ffaaaa; + box-shadow: 0 0 0.5em #ffaaaa; +} + +/* TABLES */ + +table { + border-top: 1px solid #DFDFDF; + border-collapse: collapse; + width: 100%; + margin-bottom: 1em; +} + +tr { + border: 0; +} + +tr>td:first-child, tr>th:first-child { + padding-left: 1.25em; +} + +tr>td:last-child, tr>th:last-child { + padding-right: 1.25em; +} + +td, th { + line-height: 1.5em; + padding: 0.5em 0.6em; + text-align: left; + vertical-align: top; +} + +th { + background-color: #efefef; + background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(1, #eaeaea)); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#ffffff', EndColorStr = '#eaeaea'); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eaeaea')"; + color: #666666; + font-weight: bold; + line-height: 1.7em; + padding: 0.2em 0.6em; +} + +thead th { + white-space: nowrap; +} + +th a { + display: block; + text-decoration: none; +} + +th a:link, th a:visited { + color: #666666; +} + +th a:hover, th a:focus { + color: #333333; +} + +th.sortable a { + background-position: right; + background-repeat: no-repeat; + padding-right: 1.1em; +} + +th.asc a { + background-image: url(../images/skin/sorted_asc.gif); +} + +th.desc a { + background-image: url(../images/skin/sorted_desc.gif); +} + +.odd { + background: #f7f7f7; +} + +.even { + background: #ffffff; +} + +th:hover, tr:hover { + background: #E1F2B6; +} + +/* PAGINATION */ + +.pagination { + border-top: 0; + margin: 0; + padding: 0.3em 0.2em; + text-align: center; + -moz-box-shadow: 0 0 3px 1px #AAAAAA; + -webkit-box-shadow: 0 0 3px 1px #AAAAAA; + box-shadow: 0 0 3px 1px #AAAAAA; + background-color: #EFEFEF; +} + +.pagination a, +.pagination .currentStep { + color: #666666; + display: inline-block; + margin: 0 0.1em; + padding: 0.25em 0.7em; + text-decoration: none; + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +.pagination a:hover, .pagination a:focus, +.pagination .currentStep { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); +} + +.no-borderradius .pagination a:hover, .no-borderradius .pagination a:focus, +.no-borderradius .pagination .currentStep { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +/* ACTION BUTTONS */ + +.buttons { + background-color: #efefef; + overflow: hidden; + padding: 0.3em; + -moz-box-shadow: 0 0 3px 1px #aaaaaa; + -webkit-box-shadow: 0 0 3px 1px #aaaaaa; + box-shadow: 0 0 3px 1px #aaaaaa; + margin: 0.1em 0 0 0; + border: none; +} + +.buttons input, +.buttons a { + background-color: transparent; + border: 0; + color: #666666; + cursor: pointer; + display: inline-block; + margin: 0 0.25em 0; + overflow: visible; + padding: 0.25em 0.7em; + text-decoration: none; + + -moz-border-radius: 0.3em; + -webkit-border-radius: 0.3em; + border-radius: 0.3em; +} + +.buttons input:hover, .buttons input:focus, +.buttons a:hover, .buttons a:focus { + background-color: #999999; + color: #ffffff; + outline: none; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.no-borderradius .buttons input:hover, .no-borderradius .buttons input:focus, +.no-borderradius .buttons a:hover, .no-borderradius .buttons a:focus { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +.buttons .delete, .buttons .edit, .buttons .save { + background-position: 0.7em center; + background-repeat: no-repeat; + text-indent: 25px; +} + +.ie6 .buttons input.delete, .ie6 .buttons input.edit, .ie6 .buttons input.save, +.ie7 .buttons input.delete, .ie7 .buttons input.edit, .ie7 .buttons input.save { + padding-left: 36px; +} + +.buttons .delete { + background-image: url(../images/skin/database_delete.png); +} + +.buttons .edit { + background-image: url(../images/skin/database_edit.png); +} + +.buttons .save { + background-image: url(../images/skin/database_save.png); +} + +a.skip { + position: absolute; + left: -9999px; +} diff --git a/babsi/BabsiWeb/web-app/css/mobile.css b/babsi/BabsiWeb/web-app/css/mobile.css new file mode 100644 index 0000000000000000000000000000000000000000..167f50221e540b35c97c2d0644038c84b4ff0db3 --- /dev/null +++ b/babsi/BabsiWeb/web-app/css/mobile.css @@ -0,0 +1,82 @@ +/* Styles for mobile devices */ + +@media screen and (max-width: 480px) { + .nav { + padding: 0.5em; + } + + .nav li { + margin: 0 0.5em 0 0; + padding: 0.25em; + } + + /* Hide individual steps in pagination, just have next & previous */ + .pagination .step, .pagination .currentStep { + display: none; + } + + .pagination .prevLink { + float: left; + } + + .pagination .nextLink { + float: right; + } + + /* pagination needs to wrap around floated buttons */ + .pagination { + overflow: hidden; + } + + /* slightly smaller margin around content body */ + fieldset, + .property-list { + padding: 0.3em 1em 1em; + } + + input, textarea { + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + + select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] { + width: auto; + } + + /* hide all but the first column of list tables */ + .scaffold-list td:not(:first-child), + .scaffold-list th:not(:first-child) { + display: none; + } + + .scaffold-list thead th { + text-align: center; + } + + /* stack form elements */ + .fieldcontain { + margin-top: 0.6em; + } + + .fieldcontain label, + .fieldcontain .property-label, + .fieldcontain .property-value { + display: block; + float: none; + margin: 0 0 0.25em 0; + text-align: left; + width: auto; + } + + .errors ul, + .message p { + margin: 0.5em; + } + + .error ul { + margin-left: 0; + } +} diff --git a/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.eot b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..87eaa434234e2a984c261e0450a2f4ad837aa7b4 Binary files /dev/null and b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.eot differ diff --git a/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.svg b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000000000000000000000000000000000000..5fee0685496c143a002985cdfb832dfd3001e6fc --- /dev/null +++ b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,228 @@ +<?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="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" /> +<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" /> +<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="M800 500h-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-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 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 -100h406z" /> +<glyph unicode="−" d="M1100 700h-900v-300h900v300z" /> +<glyph unicode="☁" d="M178 300h750q120 0 205 86t85 208q0 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.5q0 -80 56.5 -137t135.5 -57z" /> +<glyph unicode="✉" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" /> +<glyph unicode="✏" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" /> +<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" /> +<glyph unicode="" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 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 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" /> +<glyph unicode="" d="M913 432l300 -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 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 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="M649 949q48 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.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" /> +<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" /> +<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" /> +<glyph unicode="" d="M1200 143v-143h-1200v143l400 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-100z" /> +<glyph unicode="" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" /> +<glyph unicode="" d="M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z" /> +<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" /> +<glyph unicode="" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" /> +<glyph unicode="" d="M913 432l300 -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 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" /> +<glyph unicode="" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" /> +<glyph unicode="" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" /> +<glyph unicode="" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" /> +<glyph unicode="" d="M488 183l38 -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 38l-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 5 q-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 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" /> +<glyph unicode="" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> +<glyph unicode="" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" /> +<glyph unicode="" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" /> +<glyph unicode="" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" /> +<glyph unicode="" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" /> +<glyph unicode="" d="M600 1199q122 0 233 -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 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" /> +<glyph unicode="" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" /> +<glyph unicode="" d="M1177 600h-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 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" /> +<glyph unicode="" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-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 122l-145 -145v400h400z" /> +<glyph unicode="" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" /> +<glyph unicode="" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" /> +<glyph unicode="" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -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 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" /> +<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" /> +<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> +<glyph unicode="" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" /> +<glyph unicode="" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" /> +<glyph unicode="" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " /> +<glyph unicode="" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" /> +<glyph unicode="" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" /> +<glyph unicode="" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" /> +<glyph unicode="" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" /> +<glyph unicode="" d="M1200 0v66q-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-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" /> +<glyph unicode="" d="M100 1199h471q120 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 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" /> +<glyph unicode="" d="M877 1200l2 -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-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" /> +<glyph unicode="" d="M1150 1200h150v-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-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" /> +<glyph unicode="" d="M950 1201h150v-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-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" /> +<glyph unicode="" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> +<glyph unicode="" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> +<glyph unicode="" d="M500 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-600q-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 35zM0 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-1100 q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M0 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-1100q-21 0 -35.5 15t-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 15 t-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 15t-14.5 35zM0 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-1100 q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M0 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 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 -15h-800q-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 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-800 q-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 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 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 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 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 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> +<glyph unicode="" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> +<glyph unicode="" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" /> +<glyph unicode="" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" /> +<glyph unicode="" d="M600 1213q123 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 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" /> +<glyph unicode="" d="M600 1199q122 0 233 -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 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " /> +<glyph unicode="" d="M554 1295q21 -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 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" /> +<glyph unicode="" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 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.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" /> +<glyph unicode="" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 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.5z M813 431l360 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.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" /> +<glyph unicode="" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 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.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" /> +<glyph unicode="" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" /> +<glyph unicode="" d="M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" /> +<glyph unicode="" d="M1200 0l-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.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" /> +<glyph unicode="" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" /> +<glyph unicode="" d="M1100 550l-900 550v-1100z" /> +<glyph unicode="" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" /> +<glyph unicode="" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" /> +<glyph unicode="" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" /> +<glyph unicode="" d="M1050 1100h100q21 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 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="" d="M850 1100h100q21 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 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="" d="M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" /> +<glyph unicode="" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 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 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" /> +<glyph unicode="" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" /> +<glyph unicode="" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" /> +<glyph unicode="" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" /> +<glyph unicode="" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" /> +<glyph unicode="" d="M1098 600h-298v-600h-300v600h-296l450 600z" /> +<glyph unicode="" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" /> +<glyph unicode="" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" /> +<glyph unicode="" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" /> +<glyph unicode="" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" /> +<glyph unicode="" d="M600 1177q118 0 224.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.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" /> +<glyph unicode="" d="M1200 900h-111v6t-1 15t-3 18l-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-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" /> +<glyph unicode="" d="M0 121l216 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 -55l-201 -202 v143zM692 611q70 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.5t86.5 76.5q55 66 367 234z" /> +<glyph unicode="" d="M1261 600l-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.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.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 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" /> +<glyph unicode="" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 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 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" /> +<glyph unicode="" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" /> +<glyph unicode="" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" /> +<glyph unicode="" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" /> +<glyph unicode="" d="M100 1100h1000q41 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.5v600q0 41 29.5 70.5t70.5 29.5z" /> +<glyph unicode="" d="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-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.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" /> +<glyph unicode="" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" /> +<glyph unicode="" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" /> +<glyph unicode="" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" /> +<glyph unicode="" d="M1050 1200h94q20 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 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z" /> +<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> +<glyph unicode="" d="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" /> +<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> +<glyph unicode="" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" /> +<glyph unicode="" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" /> +<glyph unicode="" d="M1100 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 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" /> +<glyph unicode="" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" /> +<glyph unicode="" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -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.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" /> +<glyph unicode="" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 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.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" /> +<glyph unicode="" d="M364 873l362 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-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -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 83zM208 200h-200v600h200v-600z" /> +<glyph unicode="" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -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-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" /> +<glyph unicode="" d="M1100 473v342q0 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 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" /> +<glyph unicode="" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-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 -146l-83 86l237 339h503z" /> +<glyph unicode="" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" /> +<glyph unicode="" d="M597 1195q122 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" /> +<glyph unicode="" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" /> +<glyph unicode="" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" /> +<glyph unicode="" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-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.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 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.5t-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 7 q2 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.5q-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.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z" /> +<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> +<glyph unicode="" d="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> +<glyph unicode="" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" /> +<glyph unicode="" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 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.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" /> +<glyph unicode="" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 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-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" /> +<glyph unicode="" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 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 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" /> +<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.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" /> +<glyph unicode="" d="M700 1029v-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.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-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.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" /> +<glyph unicode="" d="M866 300l50 -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.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 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 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" /> +<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" /> +<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" /> +<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" /> +<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" /> +<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" /> +<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> +<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> +<glyph unicode="" d="M400 1100h300q162 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.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" /> +<glyph unicode="" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" /> +<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.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" /> +<glyph unicode="" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" /> +<glyph unicode="" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" /> +<glyph unicode="" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" /> +<glyph unicode="" d="M800 200h-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-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" /> +<glyph unicode="" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-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.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> +<glyph unicode="" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> +<glyph unicode="" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> +<glyph unicode="" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> +<glyph unicode="" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> +<glyph unicode="" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> +<glyph unicode="" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" /> +<glyph unicode="" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" /> +<glyph unicode="" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" /> +<glyph unicode="" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" /> +<glyph unicode="" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" /> +<glyph unicode="" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" /> +<glyph unicode="" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" /> +<glyph unicode="" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" /> +<glyph unicode="" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" /> +<glyph unicode="" d="M1100 106v888q0 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.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" /> +<glyph unicode="" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" /> +<glyph unicode="" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" /> +<glyph unicode="" d="M1200 712v200q-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 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" /> +<glyph unicode="" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" /> +<glyph unicode="" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" /> +<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z" /> +<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" /> +<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> +<glyph unicode="" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" /> +<glyph unicode="" d="M800 300h128q120 0 205 86t85 208q0 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.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" /> +<glyph unicode="" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.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.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" /> +<glyph unicode="" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" /> +<glyph unicode="" d="M700 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.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" /> +<glyph unicode="💼" d="M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-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-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> +<glyph unicode="📅" d="M1100 900v150q0 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-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" /> +<glyph unicode="📌" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" /> +<glyph unicode="📎" d="M518 119l69 -60l517 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 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 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 348 q52 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 -256z" /> +<glyph unicode="📷" d="M1200 200v600q0 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-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" /> +<glyph unicode="🔒" d="M900 800h100q41 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.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 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="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" /> +<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="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.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 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 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.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -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.5z" /> +<glyph unicode="🔧" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.ttf b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..be784dc1d5bcb92ab155f578f3723524a3dd9688 Binary files /dev/null and b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.ttf differ diff --git a/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.woff b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..2cc3e4852a5a42e6aadd6284e067b66e14a57bc7 Binary files /dev/null and b/babsi/BabsiWeb/web-app/fonts/glyphicons-halflings-regular.woff differ diff --git a/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad-retina.png b/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..438503d85256dbc126292df237ae9cb50e80b9e5 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad-retina.png differ diff --git a/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad.png b/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..a1758f9cc83f8409dc8d9a554ace48575490053f Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/apple-touch-icon-ipad.png differ diff --git a/babsi/BabsiWeb/web-app/images/apple-touch-icon-retina.png b/babsi/BabsiWeb/web-app/images/apple-touch-icon-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..7852da64dc4c8413f04f2f7d51df32a6fdfad24b Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/apple-touch-icon-retina.png differ diff --git a/babsi/BabsiWeb/web-app/images/apple-touch-icon.png b/babsi/BabsiWeb/web-app/images/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5bdc0ddc7948ce45eb0ecbe1f0ec1fd9739429f6 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/apple-touch-icon.png differ diff --git a/babsi/BabsiWeb/web-app/images/favicon.ico b/babsi/BabsiWeb/web-app/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d09ca3f804acdac5ee45facb59254cdea9592ec1 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/favicon.ico differ diff --git a/babsi/BabsiWeb/web-app/images/grails_logo.jpg b/babsi/BabsiWeb/web-app/images/grails_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8be657c07618753fe240b10f235e6bc86c4a60d0 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/grails_logo.jpg differ diff --git a/babsi/BabsiWeb/web-app/images/grails_logo.png b/babsi/BabsiWeb/web-app/images/grails_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9836b93d2cbdee17ee3c18329bef39ec724dcf97 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/grails_logo.png differ diff --git a/babsi/BabsiWeb/web-app/images/leftnav_btm.png b/babsi/BabsiWeb/web-app/images/leftnav_btm.png new file mode 100644 index 0000000000000000000000000000000000000000..582e1eb924641f669a9a4f82d6d73c2957dc46ae Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/leftnav_btm.png differ diff --git a/babsi/BabsiWeb/web-app/images/leftnav_midstretch.png b/babsi/BabsiWeb/web-app/images/leftnav_midstretch.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb8a51559b4bd4ed79fba033b4274b33e5cdd2c Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/leftnav_midstretch.png differ diff --git a/babsi/BabsiWeb/web-app/images/leftnav_top.png b/babsi/BabsiWeb/web-app/images/leftnav_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6afec7d32f3163446829de0ed38099021fc7b0d6 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/leftnav_top.png differ diff --git a/babsi/BabsiWeb/web-app/images/logo.png b/babsi/BabsiWeb/web-app/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fb358989bb4ad00f7761f2ac4c7e6c993da4d1 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/logo.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/database_add.png b/babsi/BabsiWeb/web-app/images/skin/database_add.png new file mode 100644 index 0000000000000000000000000000000000000000..802bd6cde02d442288490c5f278b225e192927b5 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/database_add.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/database_delete.png b/babsi/BabsiWeb/web-app/images/skin/database_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cce652e845cde732ac3ce9a4132b597301ad660e Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/database_delete.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/database_edit.png b/babsi/BabsiWeb/web-app/images/skin/database_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..e501b668c70c8e8a6b1142b0dc03bf6f26b59418 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/database_edit.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/database_save.png b/babsi/BabsiWeb/web-app/images/skin/database_save.png new file mode 100644 index 0000000000000000000000000000000000000000..44c06dddf19fbda14efe428b9b1793c13f46b2cf Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/database_save.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/database_table.png b/babsi/BabsiWeb/web-app/images/skin/database_table.png new file mode 100644 index 0000000000000000000000000000000000000000..693709cbc1b156839a754e53cbaf409edec69567 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/database_table.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/exclamation.png b/babsi/BabsiWeb/web-app/images/skin/exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/exclamation.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/house.png b/babsi/BabsiWeb/web-app/images/skin/house.png new file mode 100644 index 0000000000000000000000000000000000000000..fed62219f57cdfb854782dbadf5123c44d056bd4 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/house.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/information.png b/babsi/BabsiWeb/web-app/images/skin/information.png new file mode 100644 index 0000000000000000000000000000000000000000..12cd1aef900803abba99b26920337ec01ad5c267 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/information.png differ diff --git a/babsi/BabsiWeb/web-app/images/skin/shadow.jpg b/babsi/BabsiWeb/web-app/images/skin/shadow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7ed44fadc9c05e4dbf55614cecd66340c45d108 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/shadow.jpg differ diff --git a/babsi/BabsiWeb/web-app/images/skin/sorted_asc.gif b/babsi/BabsiWeb/web-app/images/skin/sorted_asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b179c11cf72c786630d98bf4b21fbb0d83ffd0c Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/sorted_asc.gif differ diff --git a/babsi/BabsiWeb/web-app/images/skin/sorted_desc.gif b/babsi/BabsiWeb/web-app/images/skin/sorted_desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..38b3a01d078418d3afcdb2765251a9f21b7995be Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/skin/sorted_desc.gif differ diff --git a/babsi/BabsiWeb/web-app/images/spinner.gif b/babsi/BabsiWeb/web-app/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d1e6edc338b4fa21c4b6d156c59898fce763c17 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/spinner.gif differ diff --git a/babsi/BabsiWeb/web-app/images/springsource.png b/babsi/BabsiWeb/web-app/images/springsource.png new file mode 100644 index 0000000000000000000000000000000000000000..e806d001151dd0c5dfbb2d24e9255e7b1f3c1cc3 Binary files /dev/null and b/babsi/BabsiWeb/web-app/images/springsource.png differ diff --git a/babsi/BabsiWeb/web-app/js/application.js b/babsi/BabsiWeb/web-app/js/application.js new file mode 100644 index 0000000000000000000000000000000000000000..b2adb962e2013c0b9bb2f9635dc88f12f64a43bf --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/application.js @@ -0,0 +1,9 @@ +if (typeof jQuery !== 'undefined') { + (function($) { + $('#spinner').ajaxStart(function() { + $(this).fadeIn(); + }).ajaxStop(function() { + $(this).fadeOut(); + }); + })(jQuery); +} diff --git a/babsi/BabsiWeb/web-app/js/babsi.js b/babsi/BabsiWeb/web-app/js/babsi.js new file mode 100644 index 0000000000000000000000000000000000000000..5cc01676b1e3c4a907887785467486ab02a88448 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/babsi.js @@ -0,0 +1,14 @@ +/** + * Seitenübergreifende Javascripts + **/ + +function scrollToContent(){ + var targetOffset = $("a[name=content]").offset().top; + $('html,body').delay(100).animate({scrollTop: targetOffset}, 1000); +} + + +$(document).ready(function () { + if($(window).width() < 768) + scrollToContent(); +}); \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/js/bootstrap.js b/babsi/BabsiWeb/web-app/js/bootstrap.js new file mode 100644 index 0000000000000000000000000000000000000000..a6bf193f08816e141e31940d84dba81f3b2bae93 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/bootstrap.js @@ -0,0 +1,1992 @@ +/* ======================================================================== + * Bootstrap: alert.js v3.0.0 + * http://twbs.github.com/bootstrap/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"; + + // 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) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.0.0 + * http://twbs.github.com/bootstrap/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"; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + } + + 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(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"]') + + if ($parent.length) { + var $input = this.$element.find('input') + .prop('checked', !this.$element.hasClass('active')) + .trigger('change') + if ($input.prop('type') === 'radio') $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) + 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() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#carousel + * ======================================================================== + * Copyright 2012 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"; + + // 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', 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.end) { + 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]() + } + + this.sliding = true + + isCycling && this.pause() + + var e = $.Event('slide.bs.carousel', { 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) + $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') }, 0) + }) + .emulateTransitionEnd(600) + } 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) + 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()) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#dropdowns + * ======================================================================== + * Copyright 2012 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"; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + var $el = $(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 we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) + } + + $parent.trigger(e = $.Event('show.bs.dropdown')) + + if (e.isDefaultPrevented()) return + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown') + + $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 $items = $('[role=menu] li:not(.divider):visible a', $parent) + + 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() { + $(backdrop).remove() + $(toggle).each(function (e) { + var $parent = getParent($(this)) + if (!$parent.hasClass('open')) return + $parent.trigger(e = $.Event('hide.bs.dropdown')) + if (e.isDefaultPrevented()) return + $parent.removeClass('open').trigger('hidden.bs.dropdown') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.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('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.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]' , Dropdown.prototype.keydown) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#modals + * ======================================================================== + * Copyright 2012 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"; + + // 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.load(this.options.remote) + } + + 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.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() + + 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.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 that = this + 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.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('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + 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') }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2012 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"; + + // 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' : 'focus' + var 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() + } + + 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 $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.$element.trigger('shown.bs.' + this.type) + } + } + + 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 + + $tip + .offset(offset) + .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() + } + + 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.$element.trigger('hidden.bs.' + this.type) + + 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 () { + 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) $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 + } + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#popovers + * ======================================================================== + * Copyright 2012 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"; + + // 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')[this.options.html ? 'html' : '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) $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 + } + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#tabs + * ======================================================================== + * Copyright 2012 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"; + + // 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.attr('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') + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#affix + * ======================================================================== + * Copyright 2012 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"; + + // 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 = null + + this.checkPosition() + } + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0 + } + + 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 (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + 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', '') + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : '')) + + if (affix == 'bottom') { + this.$element.offset({ top: document.body.offsetHeight - 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) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#collapse + * ======================================================================== + * Copyright 2012 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"; + + // 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('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) $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) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#scrollspy + * ======================================================================== + * Copyright 2012 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"; + + // 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 = /^#\w/.test(href) && $(href) + + return ($href + && $href.length + && [[ $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) + } + + 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) + .parents('.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') + } + + + // 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()) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.0.0 + * http://twbs.github.com/bootstrap/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"; + + // 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] } + } + } + } + + // 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() + }) + +}(window.jQuery); diff --git a/babsi/BabsiWeb/web-app/js/bootstrap.min.js b/babsi/BabsiWeb/web-app/js/bootstrap.min.js new file mode 100644 index 0000000000000000000000000000000000000000..f0b7d681ddcf724f3a0eb4487232c641826eae85 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/bootstrap.min.js @@ -0,0 +1,11 @@ +/*! + * Bootstrap v3.0.0 + * + * 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 @twitter by @mdo and @fat. + */ + ++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 f(){e.trigger("closed.bs.alert").remove()}var c=a(this),d=c.attr("data-target");d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));var e=a(d);b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close.bs.alert"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.one(a.support.transition.end,f).emulateTransitionEnd(150):f()};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)),typeof b=="string"&&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)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");b.prop("type")==="radio"&&a.find(".active").removeClass("active")}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=typeof c=="object"&&c;e||d.data("bs.button",e=new b(this,f)),c=="toggle"?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()})}(window.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,this.options.pause=="hover"&&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();if(b>this.$items.length-1||b<0)return;return this.sliding?this.$element.one("slid",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.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){if(this.sliding)return;return this.slide("next")},b.prototype.prev=function(){if(this.sliding)return;return this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(e.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")}));if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;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")},0)}).emulateTransitionEnd(600)}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return 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(),typeof c=="object"&&c),g=typeof c=="string"?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),typeof c=="number"?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=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),c.data()),g=c.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=c.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())})})}(window.jQuery),+function(a){function e(){a(b).remove(),a(c).each(function(b){var c=f(a(this));if(!c.hasClass("open"))return;c.trigger(b=a.Event("hide.bs.dropdown"));if(b.isDefaultPrevented())return;c.removeClass("open").trigger("hidden.bs.dropdown")})}function f(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}"use strict";var b=".dropdown-backdrop",c="[data-toggle=dropdown]",d=function(b){var c=a(b).on("click.bs.dropdown",this.toggle)};d.prototype.toggle=function(b){var c=a(this);if(c.is(".disabled, :disabled"))return;var d=f(c),g=d.hasClass("open");e();if(!g){"ontouchstart"in document.documentElement&&!d.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",e),d.trigger(b=a.Event("show.bs.dropdown"));if(b.isDefaultPrevented())return;d.toggleClass("open").trigger("shown.bs.dropdown"),c.focus()}return!1},d.prototype.keydown=function(b){if(!/(38|40|27)/.test(b.keyCode))return;var d=a(this);b.preventDefault(),b.stopPropagation();if(d.is(".disabled, :disabled"))return;var e=f(d),g=e.hasClass("open");if(!g||g&&b.keyCode==27)return b.which==27&&e.find(c).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",e);if(!h.length)return;var i=h.index(h.filter(":focus"));b.keyCode==38&&i>0&&i--,b.keyCode==40&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),e=c.data("dropdown");e||c.data("dropdown",e=new d(this)),typeof b=="string"&&e[b].call(c)})},a.fn.dropdown.Constructor=d,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",e).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",c,d.prototype.toggle).on("keydown.bs.dropdown.data-api",c+", [role=menu]",d.prototype.keydown)}(window.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.load(this.options.remote)};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);if(this.isShown||d.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.$element.on("click.dismiss.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(),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);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.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){a.which==27&&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,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){if(a.target!==a.currentTarget)return;this.options.backdrop=="static"?this.$element[0].focus.call(this.$element[0]):this.hide.call(this)},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!b)return;e?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(),typeof c=="object"&&c);f||e.data("bs.modal",f=new b(this,g)),typeof c=="string"?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("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());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")})}(window.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);var e=this.options.trigger.split(" ");for(var f=e.length;f--;){var g=e[f];if(g=="click")this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if(g!="manual"){var h=g=="hover"?"mouseenter":"focus",i=g=="hover"?"mouseleave":"blur";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&&typeof b.delay=="number"&&(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);clearTimeout(c.timeout),c.hoverState="in";if(!c.options.delay||!c.options.delay.show)return c.show();c.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);clearTimeout(c.timeout),c.hoverState="out";if(!c.options.delay||!c.options.delay.hide)return c.hide();c.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);if(b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d=typeof this.options.placement=="function"?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m=this.options.container=="body"?window.innerWidth:j.outerWidth(),n=this.options.container=="body"?window.innerHeight:j.outerHeight(),o=this.options.container=="body"?0:j.offset().left;d=d=="bottom"&&g.top+g.height+i-l>n?"top":d=="top"&&g.top-l-i<0?"bottom":d=="right"&&g.right+h>m?"left":d=="left"&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;b=="top"&&j!=f&&(c=!0,a.top=a.top+f-j);if(/bottom|top/.test(b)){var k=0;a.left<0&&(k=a.left*-2,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},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 e(){b.hoverState!="in"&&c.detach()}var b=this,c=this.tip(),d=a.Event("hide.bs."+this.type);this.$element.trigger(d);if(d.isDefaultPrevented())return;return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?c.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),this.$element.trigger("hidden.bs."+this.type),this},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&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({},typeof b.getBoundingClientRect=="function"?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return a=="bottom"?{top:b.top+b.height,left:b.left+b.width/2-c/2}:a=="top"?{top:b.top-d,left:b.left+b.width/2-c/2}:a=="left"?{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")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},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(){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=typeof c=="object"&&c;e||d.data("bs.tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.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?"html":"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")||(typeof b.content=="function"?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=typeof c=="object"&&c;e||d.data("bs.popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.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.attr("data-target");d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});b.trigger(f);if(f.isDefaultPrevented())return;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 g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g).emulateTransitionEnd(150):g(),e.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)),typeof c=="string"&&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")})}(window.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=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;typeof f!="object"&&(h=g=f),typeof g=="function"&&(g=f.top()),typeof h=="function"&&(h=f.bottom());var i=this.unpin!=null&&d+this.unpin<=e.top?!1:h!=null&&e.top+this.$element.height()>=c-h?"bottom":g!=null&&d<=g?"top":!1;if(this.affixed===i)return;this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin=i=="bottom"?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),i=="bottom"&&this.$element.offset({top:document.body.offsetHeight-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=typeof c=="object"&&c;e||d.data("bs.affix",e=new b(this,f)),typeof c=="string"&&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)})})}(window.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"))return;var b=a.Event("show.bs.collapse");this.$element.trigger(b);if(b.isDefaultPrevented())return;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("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"))return;var b=a.Event("hide.bs.collapse");this.$element.trigger(b);if(b.isDefaultPrevented())return;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")};if(!a.support.transition)return d.call(this);this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350)},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(),typeof c=="object"&&c);e||d.data("bs.collapse",e=new b(this,f)),typeof c=="string"&&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=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":c.data(),i=c.attr("data-parent"),j=i&&a(i);if(!g||!g.transitioning)j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(c).addClass("collapsed"),c[f.hasClass("in")?"addClass":"removeClass"]("collapsed");f.collapse(h)})}(window.jQuery),+function(a){function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(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()}"use strict",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,d=this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[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=this.$scrollElement.scrollTop()+this.options.offset,b=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,c=b-this.$scrollElement.height(),d=this.offsets,e=this.targets,f=this.activeTarget,g;if(a>=c)return f!=(g=e.last()[0])&&this.activate(g);for(g=d.length;g--;)f!=e[g]&&a>=d[g]&&(!d[g+1]||a<=d[g+1])&&this.activate(e[g])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".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")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f=typeof c=="object"&&c;e||d.data("bs.scrollspy",e=new b(this,f)),typeof c=="string"&&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())})})}(window.jQuery),+function(a){function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(a.style[c]!==undefined)return{end:b[c]}}"use strict",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()})}(window.jQuery) \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/js/daterangepicker.js b/babsi/BabsiWeb/web-app/js/daterangepicker.js new file mode 100644 index 0000000000000000000000000000000000000000..f14df67533881b00eb5b55e57aac74b60898a843 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/daterangepicker.js @@ -0,0 +1,862 @@ +/** +* @version: 1.2 +* @author: Dan Grossman http://www.dangrossman.info/ +* @date: 2013-07-25 +* @copyright: Copyright (c) 2012-2013 Dan Grossman. All rights reserved. +* @license: Licensed under Apache License v2.0. See http://www.apache.org/licenses/LICENSE-2.0 +* @website: http://www.improvely.com/ +*/ +!function ($) { + + var DateRangePicker = function (element, options, cb) { + var hasOptions = typeof options == 'object'; + var localeObject; + + //option defaults + + this.startDate = moment().startOf('day'); + this.endDate = moment().startOf('day'); + this.minDate = false; + this.maxDate = false; + this.dateLimit = false; + + this.showDropdowns = false; + this.showWeekNumbers = false; + this.timePicker = false; + this.timePickerIncrement = 30; + this.timePicker12Hour = true; + this.ranges = {}; + this.opens = 'right'; + + this.buttonClasses = ['btn', 'btn-small']; + this.applyClass = 'btn-success'; + this.cancelClass = 'btn-default'; + + this.format = 'MM/DD/YYYY'; + this.separator = ' - '; + + this.locale = { + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment()._lang._weekdaysMin.slice(), + monthNames: moment()._lang._monthsShort.slice(), + firstDay: 0 + }; + + this.cb = function () { }; + + // by default, the daterangepicker element is placed at the bottom of HTML body + this.parentEl = 'body'; + + //element that triggered the date range picker + this.element = $(element); + + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + if (this.element.is('input')) { + this.element.on({ + click: $.proxy(this.show, this), + focus: $.proxy(this.show, this) + }); + } else { + this.element.on('click', $.proxy(this.show, this)); + } + + localeObject = this.locale; + + if (hasOptions) { + if (typeof options.locale == 'object') { + $.each(localeObject, function (property, value) { + localeObject[property] = options.locale[property] || value; + }); + } + + if (options.applyClass) { + this.applyClass = options.applyClass; + } + + if (options.cancelClass) { + this.cancelClass = options.cancelClass; + } + } + + var DRPTemplate = '<div class="daterangepicker dropdown-menu">' + + '<div class="calendar left"></div>' + + '<div class="calendar right"></div>' + + '<div class="ranges">' + + '<div class="range_inputs">' + + '<div class="daterangepicker_start_input" style="float: left">' + + '<label for="daterangepicker_start">' + this.locale.fromLabel + '</label>' + + '<input class="input-mini" type="text" name="daterangepicker_start" value="" disabled="disabled" />' + + '</div>' + + '<div class="daterangepicker_end_input" style="float: left; padding-left: 11px">' + + '<label for="daterangepicker_end">' + this.locale.toLabel + '</label>' + + '<input class="input-mini" type="text" name="daterangepicker_end" value="" disabled="disabled" />' + + '</div>' + + '<button class="' + this.applyClass + ' applyBtn" disabled="disabled">' + this.locale.applyLabel + '</button> ' + + '<button class="' + this.cancelClass + ' cancelBtn">' + this.locale.cancelLabel + '</button>' + + '</div>' + + '</div>' + + '</div>'; + + this.parentEl = (hasOptions && options.parentEl && $(options.parentEl)) || $(this.parentEl); + //the date range picker + this.container = $(DRPTemplate).appendTo(this.parentEl); + + if (hasOptions) { + + if (typeof options.format == 'string') + this.format = options.format; + + if (typeof options.separator == 'string') + this.separator = options.separator; + + if (typeof options.startDate == 'string') + this.startDate = moment(options.startDate, this.format); + + if (typeof options.endDate == 'string') + this.endDate = moment(options.endDate, this.format); + + if (typeof options.minDate == 'string') + this.minDate = moment(options.minDate, this.format); + + if (typeof options.maxDate == 'string') + this.maxDate = moment(options.maxDate, this.format); + + if (typeof options.startDate == 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate == 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate == 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate == 'object') + this.maxDate = moment(options.maxDate); + + if (typeof options.ranges == 'object') { + for (var range in options.ranges) { + + var start = moment(options.ranges[range][0]); + var end = moment(options.ranges[range][1]); + + // If we have a min/max date set, bound this range + // to it, but only if it would otherwise fall + // outside of the min/max. + if (this.minDate && start.isBefore(this.minDate)) + start = moment(this.minDate); + + if (this.maxDate && end.isAfter(this.maxDate)) + end = moment(this.maxDate); + + // If the end of the range is before the minimum (if min is set) OR + // the start of the range is after the max (also if set) don't display this + // range option. + if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { + continue; + } + + this.ranges[range] = [start, end]; + } + + var list = '<ul>'; + for (var range in this.ranges) { + list += '<li>' + range + '</li>'; + } + list += '<li>' + this.locale.customRangeLabel + '</li>'; + list += '</ul>'; + this.container.find('.ranges').prepend(list); + } + + if (typeof options.dateLimit == 'object') + this.dateLimit = options.dateLimit; + + // update day names order to firstDay + if (typeof options.locale == 'object') { + if (typeof options.locale.firstDay == 'number') { + this.locale.firstDay = options.locale.firstDay; + var iterator = options.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + } + + if (typeof options.opens == 'string') + this.opens = options.opens; + + if (typeof options.showWeekNumbers == 'boolean') { + this.showWeekNumbers = options.showWeekNumbers; + } + + if (typeof options.buttonClasses == 'string') { + this.buttonClasses = [options.buttonClasses]; + } + + if (typeof options.buttonClasses == 'object') { + this.buttonClasses = options.buttonClasses; + } + + if (typeof options.showDropdowns == 'boolean') { + this.showDropdowns = options.showDropdowns; + } + + if (typeof options.timePicker == 'boolean') { + this.timePicker = options.timePicker; + } + + if (typeof options.timePickerIncrement == 'number') { + this.timePickerIncrement = options.timePickerIncrement; + } + + if (typeof options.timePicker12Hour == 'boolean') { + this.timePicker12Hour = options.timePicker12Hour; + } + + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.startOf('day'); + } + + //apply CSS classes to buttons + var c = this.container; + $.each(this.buttonClasses, function (idx, val) { + c.find('button').addClass(val); + }); + + if (this.opens == 'right') { + //swap calendar positions + var left = this.container.find('.calendar.left'); + var right = this.container.find('.calendar.right'); + left.removeClass('left').addClass('right'); + right.removeClass('right').addClass('left'); + } + + if (typeof options == 'undefined' || typeof options.ranges == 'undefined') { + this.container.find('.calendar').show(); + this.move(); + } + + if (typeof cb == 'function') + this.cb = cb; + + this.container.addClass('opens' + this.opens); + + //try parse date if in text input + if (!hasOptions || (typeof options.startDate == 'undefined' && typeof options.endDate == 'undefined')) { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(); + var split = val.split(this.separator); + var start, end; + if (split.length == 2) { + start = moment(split[0], this.format); + end = moment(split[1], this.format); + } + if (start != null && end != null) { + this.startDate = start; + this.endDate = end; + } + } + } + + //state + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.leftCalendar = { + month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]), + calendar: [] + }; + + this.rightCalendar = { + month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]), + calendar: [] + }; + + //event listeners + this.container.on('mousedown', $.proxy(this.mousedown, this)); + this.container.find('.calendar').on('click', '.prev', $.proxy(this.clickPrev, this)); + this.container.find('.calendar').on('click', '.next', $.proxy(this.clickNext, this)); + this.container.find('.ranges').on('click', 'button.applyBtn', $.proxy(this.clickApply, this)); + this.container.find('.ranges').on('click', 'button.cancelBtn', $.proxy(this.clickCancel, this)); + + this.container.find('.ranges').on('click', '.daterangepicker_start_input', $.proxy(this.showCalendars, this)); + this.container.find('.ranges').on('click', '.daterangepicker_end_input', $.proxy(this.showCalendars, this)); + + this.container.find('.calendar').on('click', 'td.available', $.proxy(this.clickDate, this)); + this.container.find('.calendar').on('mouseenter', 'td.available', $.proxy(this.enterDate, this)); + this.container.find('.calendar').on('mouseleave', 'td.available', $.proxy(this.updateView, this)); + + this.container.find('.ranges').on('click', 'li', $.proxy(this.clickRange, this)); + this.container.find('.ranges').on('mouseenter', 'li', $.proxy(this.enterRange, this)); + this.container.find('.ranges').on('mouseleave', 'li', $.proxy(this.updateView, this)); + + this.container.find('.calendar').on('change', 'select.yearselect', $.proxy(this.updateMonthYear, this)); + this.container.find('.calendar').on('change', 'select.monthselect', $.proxy(this.updateMonthYear, this)); + + this.container.find('.calendar').on('change', 'select.hourselect', $.proxy(this.updateTime, this)); + this.container.find('.calendar').on('change', 'select.minuteselect', $.proxy(this.updateTime, this)); + this.container.find('.calendar').on('change', 'select.ampmselect', $.proxy(this.updateTime, this)); + + this.element.on('keyup', $.proxy(this.updateFromControl, this)); + + this.updateView(); + this.updateCalendars(); + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + mousedown: function (e) { + e.stopPropagation(); + }, + + updateView: function () { + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); + + if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + }, + + updateFromControl: function () { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.separator); + var start = moment(dateString[0], this.format); + var end = moment(dateString[1], this.format); + + if (start == null || end == null) return; + if (end.isBefore(start)) return; + + this.startDate = start; + this.endDate = end; + + this.notify(); + this.updateCalendars(); + }, + + notify: function () { + this.updateView(); + this.cb(this.startDate, this.endDate); + }, + + move: function () { + var parentOffset = { + top: this.parentEl.offset().top - (this.parentEl.is('body') ? 0 : this.parentEl.scrollTop()), + left: this.parentEl.offset().left - (this.parentEl.is('body') ? 0 : this.parentEl.scrollLeft()) + }; + if (this.opens == 'left') { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + right: $(window).width() - this.element.offset().left - this.element.outerWidth() - parentOffset.left, + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function (e) { + this.container.show(); + this.move(); + + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + + $(document).on('mousedown', $.proxy(this.hide, this)); + this.element.trigger('shown', {target: e.target, picker: this}); + }, + + hide: function (e) { + this.container.hide(); + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + $(document).off('mousedown', this.hide); + this.element.trigger('hidden', { picker: this }); + }, + + enterRange: function (e) { + var label = e.target.innerHTML; + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); + } + }, + + showCalendars: function() { + this.container.find('.calendar').show(); + this.move(); + }, + + updateInputText: function() { + if (this.element.is('input')) + this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); + }, + + clickRange: function (e) { + var label = e.target.innerHTML; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.startOf('day'); + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); + this.updateCalendars(); + + this.updateInputText(); + + this.container.find('.calendar').hide(); + this.hide(); + } + }, + + clickPrev: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract('month', 1); + } else { + this.rightCalendar.month.subtract('month', 1); + } + this.updateCalendars(); + }, + + clickNext: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add('month', 1); + } else { + this.rightCalendar.month.add('month', 1); + } + this.updateCalendars(); + }, + + enterDate: function (e) { + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + if (cal.hasClass('left')) { + this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); + } else { + this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); + } + + }, + + clickDate: function (e) { + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + if (cal.hasClass('left')) { + var startDate = this.leftCalendar.calendar[row][col]; + var endDate = this.endDate; + if (typeof this.dateLimit == 'object') { + var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); + if (endDate.isAfter(maxDate)) { + endDate = maxDate; + } + } + } else { + var startDate = this.startDate; + var endDate = this.rightCalendar.calendar[row][col]; + if (typeof this.dateLimit == 'object') { + var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); + if (startDate.isBefore(minDate)) { + startDate = minDate; + } + } + } + + cal.find('td').removeClass('active'); + + if (startDate.isSame(endDate) || startDate.isBefore(endDate)) { + $(e.target).addClass('active'); + this.startDate = startDate; + this.endDate = endDate; + } else if (startDate.isAfter(endDate)) { + $(e.target).addClass('active'); + this.startDate = startDate; + this.endDate = moment(startDate).add('day', 1).startOf('day'); + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + this.updateCalendars(); + }, + + clickApply: function (e) { + this.updateInputText(); + this.hide(); + }, + + clickCancel: function (e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.updateView(); + this.updateCalendars(); + this.hide(); + }, + + updateMonthYear: function (e) { + + var isLeft = $(e.target).closest('.calendar').hasClass('left'); + var cal = this.container.find('.calendar.left'); + if (!isLeft) + cal = this.container.find('.calendar.right'); + + var month = parseInt(cal.find('.monthselect').val()); + var year = cal.find('.yearselect').val(); + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + } else { + this.rightCalendar.month.month(month).year(year); + } + + this.updateCalendars(); + + }, + + updateTime: function(e) { + + var isLeft = $(e.target).closest('.calendar').hasClass('left'); + var cal = this.container.find('.calendar.left'); + if (!isLeft) + cal = this.container.find('.calendar.right'); + + var hour = parseInt(cal.find('.hourselect').val()); + var minute = parseInt(cal.find('.minuteselect').val()); + + if (this.timePicker12Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm == 'PM' && hour < 12) + hour += 12; + if (ampm == 'AM' && hour == 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate; + start.hour(hour); + start.minute(minute); + this.startDate = start; + this.leftCalendar.month.hour(hour).minute(minute); + } else { + var end = this.endDate; + end.hour(hour); + end.minute(minute); + this.endDate = end; + this.rightCalendar.month.hour(hour).minute(minute); + } + + this.updateCalendars(); + + }, + + updateCalendars: function () { + this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), 'left'); + this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), 'right'); + this.container.find('.calendar.left').html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate)); + this.container.find('.calendar.right').html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate)); + + this.container.find('.ranges li').removeClass('active'); + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { + customRange = false; + this.container.find('.ranges li:eq(' + i + ')').addClass('active'); + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.container.find('.ranges li:eq(' + i + ')').addClass('active'); + } + } + i++; + } + if (customRange) + this.container.find('.ranges li:last').addClass('active'); + }, + + buildCalendar: function (month, year, hour, minute, side) { + + var firstDay = moment([year, month, 1]); + var lastMonth = moment(firstDay).subtract('month', 1).month(); + var lastYear = moment(firstDay).subtract('month', 1).year(); + + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, hour, minute]); + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add('day', 1)) { + if (i > 0 && col % 7 == 0) { + col = 0; + row++; + } + calendar[row][col] = curDate; + } + + return calendar; + + }, + + renderDropdowns: function (selected, minDate, maxDate) { + var currentMonth = selected.month(); + var monthHtml = '<select class="monthselect">'; + var inMinYear = false; + var inMaxYear = false; + + for (var m = 0; m < 12; m++) { + if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m <= maxDate.month())) { + monthHtml += "<option value='" + m + "'" + + (m === currentMonth ? " selected='selected'" : "") + + ">" + this.locale.monthNames[m] + "</option>"; + } + } + monthHtml += "</select>"; + + var currentYear = selected.year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + var yearHtml = '<select class="yearselect">' + + for (var y = minYear; y <= maxYear; y++) { + yearHtml += '<option value="' + y + '"' + + (y === currentYear ? ' selected="selected"' : '') + + '>' + y + '</option>'; + } + + yearHtml += '</select>'; + + return monthHtml + yearHtml; + }, + + renderCalendar: function (calendar, selected, minDate, maxDate) { + + var html = '<div class="calendar-date">'; + html += '<table class="table-condensed">'; + html += '<thead>'; + html += '<tr>'; + + // add empty cell for week number + if (this.showWeekNumbers) + html += '<th></th>'; + + if (!minDate || minDate.isBefore(calendar[1][1])) { + html += '<th class="prev available"><i class="icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>'; + } else { + html += '<th></th>'; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); + } + + html += '<th colspan="5" style="width: auto">' + dateHtml + '</th>'; + if (!maxDate || maxDate.isAfter(calendar[1][1])) { + html += '<th class="next available"><i class="icon-arrow-right glyphicon glyphicon-arrow-right"></i></th>'; + } else { + html += '<th></th>'; + } + + html += '</tr>'; + html += '<tr>'; + + // add week number label + if (this.showWeekNumbers) + html += '<th class="week">' + this.locale.weekLabel + '</th>'; + + $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { + html += '<th>' + dayOfWeek + '</th>'; + }); + + html += '</tr>'; + html += '</thead>'; + html += '<tbody>'; + + for (var row = 0; row < 6; row++) { + html += '<tr>'; + + // add week number + if (this.showWeekNumbers) + html += '<td class="week">' + calendar[row][0].week() + '</td>'; + + for (var col = 0; col < 7; col++) { + var cname = 'available '; + cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; + + if ((minDate && calendar[row][col].isBefore(minDate)) || (maxDate && calendar[row][col].isAfter(maxDate))) { + cname = ' off disabled '; + } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { + cname += ' active '; + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { + cname += ' start-date '; + } + if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { + cname += ' end-date '; + } + } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { + cname += ' in-range '; + if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; } + if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; } + } + + var title = 'r' + row + 'c' + col; + html += '<td class="' + cname.replace(/\s+/g, ' ').replace(/^\s?(.*?)\s?$/, '$1') + '" data-title="' + title + '">' + calendar[row][col].date() + '</td>'; + } + html += '</tr>'; + } + + html += '</tbody>'; + html += '</table>'; + html += '</div>'; + + if (this.timePicker) { + + html += '<div class="calendar-time">'; + html += '<select class="hourselect">'; + var start = 0; + var end = 23; + var selected_hour = selected.hour(); + if (this.timePicker12Hour) { + start = 1; + end = 12; + if (selected_hour >= 12) + selected_hour -= 12; + if (selected_hour == 0) + selected_hour = 12; + } + + for (var i = start; i <= end; i++) { + if (i == selected_hour) { + html += '<option value="' + i + '" selected="selected">' + i + '</option>'; + } else { + html += '<option value="' + i + '">' + i + '</option>'; + } + } + + html += '</select> : '; + + html += '<select class="minuteselect">'; + + for (var i = 0; i < 60; i += this.timePickerIncrement) { + var num = i; + if (num < 10) + num = '0' + num; + if (i == selected.minute()) { + html += '<option value="' + i + '" selected="selected">' + num + '</option>'; + } else { + html += '<option value="' + i + '">' + num + '</option>'; + } + } + + html += '</select> '; + + if (this.timePicker12Hour) { + html += '<select class="ampmselect">'; + if (selected.hour() >= 12) { + html += '<option value="AM">AM</option><option value="PM" selected="selected">PM</option>'; + } else { + html += '<option value="AM" selected="selected">AM</option><option value="PM">PM</option>'; + } + html += '</select>'; + } + + html += '</div>'; + + } + + return html; + + } + + }; + + $.fn.daterangepicker = function (options, cb) { + this.each(function () { + var el = $(this); + if (!el.data('daterangepicker')) + el.data('daterangepicker', new DateRangePicker(el, options, cb)); + }); + return this; + }; + +}(window.jQuery); diff --git a/babsi/BabsiWeb/web-app/js/flot/jquery.flot.axislabels.js b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.axislabels.js new file mode 100644 index 0000000000000000000000000000000000000000..d75b03ba9ce89dae74158cfb188e057876f5d063 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.axislabels.js @@ -0,0 +1,451 @@ +/* +Axis Labels Plugin for flot. +http://github.com/markrcote/flot-axislabels + +Original code is Copyright (c) 2010 Xuan Luo. +Original code was released under the GPLv3 license by Xuan Luo, September 2010. +Original code was rereleased under the MIT license by Xuan Luo, April 2012. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +(function ($) { + var options = { }; + + function canvasSupported() { + return !!document.createElement('canvas').getContext; + } + + function canvasTextSupported() { + if (!canvasSupported()) { + return false; + } + var dummy_canvas = document.createElement('canvas'); + var context = dummy_canvas.getContext('2d'); + return typeof context.fillText == 'function'; + } + + function css3TransitionSupported() { + var div = document.createElement('div'); + return typeof div.style.MozTransition != 'undefined' // Gecko + || typeof div.style.OTransition != 'undefined' // Opera + || typeof div.style.webkitTransition != 'undefined' // WebKit + || typeof div.style.transition != 'undefined'; + } + + + function AxisLabel(axisName, position, padding, plot, opts) { + this.axisName = axisName; + this.position = position; + this.padding = padding; + this.plot = plot; + this.opts = opts; + this.width = 0; + this.height = 0; + } + + AxisLabel.prototype.delete = function() { + }; + + + CanvasAxisLabel.prototype = new AxisLabel(); + CanvasAxisLabel.prototype.constructor = CanvasAxisLabel; + function CanvasAxisLabel(axisName, position, padding, plot, opts) { + AxisLabel.prototype.constructor.call(this, axisName, position, padding, + plot, opts); + } + + CanvasAxisLabel.prototype.calculateSize = function() { + if (!this.opts.axisLabelFontSizePixels) + this.opts.axisLabelFontSizePixels = 14; + if (!this.opts.axisLabelFontFamily) + this.opts.axisLabelFontFamily = 'sans-serif'; + + var textWidth = this.opts.axisLabelFontSizePixels + this.padding; + var textHeight = this.opts.axisLabelFontSizePixels + this.padding; + if (this.position == 'left' || this.position == 'right') { + this.width = this.opts.axisLabelFontSizePixels + this.padding; + this.height = 0; + } else { + this.width = 0; + this.height = this.opts.axisLabelFontSizePixels + this.padding; + } + }; + + CanvasAxisLabel.prototype.draw = function(box) { + var ctx = this.plot.getCanvas().getContext('2d'); + ctx.save(); + ctx.font = this.opts.axisLabelFontSizePixels + 'px ' + + this.opts.axisLabelFontFamily; + var width = ctx.measureText(this.opts.axisLabel).width; + var height = this.opts.axisLabelFontSizePixels; + var x, y, angle = 0; + if (this.position == 'top') { + x = box.left + box.width/2 - width/2; + y = box.top + height*0.72; + } else if (this.position == 'bottom') { + x = box.left + box.width/2 - width/2; + y = box.top + box.height - height*0.72; + } else if (this.position == 'left') { + x = box.left + height*0.72; + y = box.height/2 + box.top + width/2; + angle = -Math.PI/2; + } else if (this.position == 'right') { + x = box.left + box.width - height*0.72; + y = box.height/2 + box.top - width/2; + angle = Math.PI/2; + } + ctx.translate(x, y); + ctx.rotate(angle); + ctx.fillText(this.opts.axisLabel, 0, 0); + ctx.restore(); + }; + + + HtmlAxisLabel.prototype = new AxisLabel(); + HtmlAxisLabel.prototype.constructor = HtmlAxisLabel; + function HtmlAxisLabel(axisName, position, padding, plot, opts) { + AxisLabel.prototype.constructor.call(this, axisName, position, + padding, plot, opts); + this.elem = null; + } + + HtmlAxisLabel.prototype.calculateSize = function() { + var elem = $('<div class="axisLabels" style="position:absolute;">' + + this.opts.axisLabel + '</div>'); + this.plot.getPlaceholder().append(elem); + // store height and width of label itself, for use in draw() + this.labelWidth = elem.outerWidth(true); + this.labelHeight = elem.outerHeight(true); + elem.remove(); + + this.width = this.height = 0; + if (this.position == 'left' || this.position == 'right') { + this.width = this.labelWidth + this.padding; + } else { + this.height = this.labelHeight + this.padding; + } + }; + + HtmlAxisLabel.prototype.delete = function() { + if (this.elem) { + this.elem.remove(); + } + }; + + HtmlAxisLabel.prototype.draw = function(box) { + this.plot.getPlaceholder().find('#' + this.axisName + 'Label').remove(); + this.elem = $('<div id="' + this.axisName + + 'Label" " class="axisLabels" style="position:absolute;">' + + this.opts.axisLabel + '</div>'); + this.plot.getPlaceholder().append(this.elem); + if (this.position == 'top') { + this.elem.css('left', box.left + box.width/2 - this.labelWidth/2 + + 'px'); + this.elem.css('top', box.top + 'px'); + } else if (this.position == 'bottom') { + this.elem.css('left', box.left + box.width/2 - this.labelWidth/2 + + 'px'); + this.elem.css('top', box.top + box.height - this.labelHeight + + 'px'); + } else if (this.position == 'left') { + this.elem.css('top', box.top + box.height/2 - this.labelHeight/2 + + 'px'); + this.elem.css('left', box.left + 'px'); + } else if (this.position == 'right') { + this.elem.css('top', box.top + box.height/2 - this.labelHeight/2 + + 'px'); + this.elem.css('left', box.left + box.width - this.labelWidth + + 'px'); + } + }; + + + CssTransformAxisLabel.prototype = new HtmlAxisLabel(); + CssTransformAxisLabel.prototype.constructor = CssTransformAxisLabel; + function CssTransformAxisLabel(axisName, position, padding, plot, opts) { + HtmlAxisLabel.prototype.constructor.call(this, axisName, position, + padding, plot, opts); + } + + CssTransformAxisLabel.prototype.calculateSize = function() { + HtmlAxisLabel.prototype.calculateSize.call(this); + this.width = this.height = 0; + if (this.position == 'left' || this.position == 'right') { + this.width = this.labelHeight + this.padding; + } else { + this.height = this.labelHeight + this.padding; + } + }; + + CssTransformAxisLabel.prototype.transforms = function(degrees, x, y) { + var stransforms = { + '-moz-transform': '', + '-webkit-transform': '', + '-o-transform': '', + '-ms-transform': '' + }; + if (x != 0 || y != 0) { + var stdTranslate = ' translate(' + x + 'px, ' + y + 'px)'; + stransforms['-moz-transform'] += stdTranslate; + stransforms['-webkit-transform'] += stdTranslate; + stransforms['-o-transform'] += stdTranslate; + stransforms['-ms-transform'] += stdTranslate; + } + if (degrees != 0) { + var rotation = degrees / 90; + var stdRotate = ' rotate(' + degrees + 'deg)'; + stransforms['-moz-transform'] += stdRotate; + stransforms['-webkit-transform'] += stdRotate; + stransforms['-o-transform'] += stdRotate; + stransforms['-ms-transform'] += stdRotate; + } + var s = 'top: 0; left: 0; '; + for (var prop in stransforms) { + if (stransforms[prop]) { + s += prop + ':' + stransforms[prop] + ';'; + } + } + s += ';'; + return s; + }; + + CssTransformAxisLabel.prototype.calculateOffsets = function(box) { + var offsets = { x: 0, y: 0, degrees: 0 }; + if (this.position == 'bottom') { + offsets.x = box.left + box.width/2 - this.labelWidth/2; + offsets.y = box.top + box.height - this.labelHeight; + } else if (this.position == 'top') { + offsets.x = box.left + box.width/2 - this.labelWidth/2; + offsets.y = box.top; + } else if (this.position == 'left') { + offsets.degrees = -90; + offsets.x = box.left - this.labelWidth/2 + this.labelHeight/2; + offsets.y = box.height/2 + box.top; + } else if (this.position == 'right') { + offsets.degrees = 90; + offsets.x = box.left + box.width - this.labelWidth/2 + - this.labelHeight/2; + offsets.y = box.height/2 + box.top; + } + return offsets; + }; + + CssTransformAxisLabel.prototype.draw = function(box) { + this.plot.getPlaceholder().find("." + this.axisName + "Label").remove(); + var offsets = this.calculateOffsets(box); + this.elem = $('<div class="axisLabels ' + this.axisName + + 'Label" style="position:absolute; ' + + 'color: ' + this.opts.color + '; ' + + this.transforms(offsets.degrees, offsets.x, offsets.y) + + '">' + this.opts.axisLabel + '</div>'); + this.plot.getPlaceholder().append(this.elem); + }; + + + IeTransformAxisLabel.prototype = new CssTransformAxisLabel(); + IeTransformAxisLabel.prototype.constructor = IeTransformAxisLabel; + function IeTransformAxisLabel(axisName, position, padding, plot, opts) { + CssTransformAxisLabel.prototype.constructor.call(this, axisName, + position, padding, + plot, opts); + this.requiresResize = false; + } + + IeTransformAxisLabel.prototype.transforms = function(degrees, x, y) { + // I didn't feel like learning the crazy Matrix stuff, so this uses + // a combination of the rotation transform and CSS positioning. + var s = ''; + if (degrees != 0) { + var rotation = degrees/90; + while (rotation < 0) { + rotation += 4; + } + s += ' filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=' + rotation + '); '; + // see below + this.requiresResize = (this.position == 'right'); + } + if (x != 0) { + s += 'left: ' + x + 'px; '; + } + if (y != 0) { + s += 'top: ' + y + 'px; '; + } + return s; + }; + + IeTransformAxisLabel.prototype.calculateOffsets = function(box) { + var offsets = CssTransformAxisLabel.prototype.calculateOffsets.call( + this, box); + // adjust some values to take into account differences between + // CSS and IE rotations. + if (this.position == 'top') { + // FIXME: not sure why, but placing this exactly at the top causes + // the top axis label to flip to the bottom... + offsets.y = box.top + 1; + } else if (this.position == 'left') { + offsets.x = box.left; + offsets.y = box.height/2 + box.top - this.labelWidth/2; + } else if (this.position == 'right') { + offsets.x = box.left + box.width - this.labelHeight; + offsets.y = box.height/2 + box.top - this.labelWidth/2; + } + return offsets; + }; + + IeTransformAxisLabel.prototype.draw = function(box) { + CssTransformAxisLabel.prototype.draw.call(this, box); + if (this.requiresResize) { + this.elem = this.plot.getPlaceholder().find("." + this.axisName + + "Label"); + // Since we used CSS positioning instead of transforms for + // translating the element, and since the positioning is done + // before any rotations, we have to reset the width and height + // in case the browser wrapped the text (specifically for the + // y2axis). + this.elem.css('width', this.labelWidth); + this.elem.css('height', this.labelHeight); + } + }; + + + function init(plot) { + // This is kind of a hack. There are no hooks in Flot between + // the creation and measuring of the ticks (setTicks, measureTickLabels + // in setupGrid() ) and the drawing of the ticks and plot box + // (insertAxisLabels in setupGrid() ). + // + // Therefore, we use a trick where we run the draw routine twice: + // the first time to get the tick measurements, so that we can change + // them, and then have it draw it again. + var secondPass = false; + + var axisLabels = {}; + var axisOffsetCounts = { left: 0, right: 0, top: 0, bottom: 0 }; + + var defaultPadding = 2; // padding between axis and tick labels + plot.hooks.draw.push(function (plot, ctx) { + var hasAxisLabels = false; + if (!secondPass) { + // MEASURE AND SET OPTIONS + $.each(plot.getAxes(), function(axisName, axis) { + var opts = axis.options // Flot 0.7 + || plot.getOptions()[axisName]; // Flot 0.6 + + // Handle redraws initiated outside of this plug-in. + if (axisName in axisLabels) { + axis.labelHeight = axis.labelHeight - + axisLabels[axisName].height; + axis.labelWidth = axis.labelWidth - + axisLabels[axisName].width; + opts.labelHeight = axis.labelHeight; + opts.labelWidth = axis.labelWidth; + axisLabels[axisName].delete(); + delete axisLabels[axisName]; + } + + if (!opts || !opts.axisLabel || !axis.show) + return; + + hasAxisLabels = true; + var renderer = null; + + if (!opts.axisLabelUseHtml && + navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent; + var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) { + rv = parseFloat(RegExp.$1); + } + if (rv >= 9 && !opts.axisLabelUseCanvas && !opts.axisLabelUseHtml) { + renderer = CssTransformAxisLabel; + } else if (!opts.axisLabelUseCanvas && !opts.axisLabelUseHtml) { + renderer = IeTransformAxisLabel; + } else if (opts.axisLabelUseCanvas) { + renderer = CanvasAxisLabel; + } else { + renderer = HtmlAxisLabel; + } + } else { + if (opts.axisLabelUseHtml || (!css3TransitionSupported() && !canvasTextSupported()) && !opts.axisLabelUseCanvas) { + renderer = HtmlAxisLabel; + } else if (opts.axisLabelUseCanvas || !css3TransitionSupported()) { + renderer = CanvasAxisLabel; + } else { + renderer = CssTransformAxisLabel; + } + } + + var padding = opts.axisLabelPadding === undefined ? + defaultPadding : opts.axisLabelPadding; + + axisLabels[axisName] = new renderer(axisName, + axis.position, padding, + plot, opts); + + // flot interprets axis.labelHeight and .labelWidth as + // the height and width of the tick labels. We increase + // these values to make room for the axis label and + // padding. + + axisLabels[axisName].calculateSize(); + + // AxisLabel.height and .width are the size of the + // axis label and padding. + // Just set opts here because axis will be sorted out on + // the redraw. + + opts.labelHeight = axis.labelHeight + + axisLabels[axisName].height; + opts.labelWidth = axis.labelWidth + + axisLabels[axisName].width; + }); + + // If there are axis labels, re-draw with new label widths and + // heights. + + if (hasAxisLabels) { + secondPass = true; + plot.setupGrid(); + plot.draw(); + } + } else { + secondPass = false; + // DRAW + $.each(plot.getAxes(), function(axisName, axis) { + var opts = axis.options // Flot 0.7 + || plot.getOptions()[axisName]; // Flot 0.6 + if (!opts || !opts.axisLabel || !axis.show) + return; + + axisLabels[axisName].draw(axis.box); + }); + } + }); + } + + + $.plot.plugins.push({ + init: init, + options: options, + name: 'axisLabels', + version: '2.0b0' + }); +})(jQuery); diff --git a/babsi/BabsiWeb/web-app/js/flot/jquery.flot.categories.min.js b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.categories.min.js new file mode 100644 index 0000000000000000000000000000000000000000..ca86594fe34ef04e51e8504dcc2131cda08e5b9e --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.categories.min.js @@ -0,0 +1,44 @@ +/* Flot plugin for plotting textual data or categories. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin +allows you to plot such a dataset directly. + +To enable it, you must specify mode: "categories" on the axis with the textual +labels, e.g. + + $.plot("#placeholder", data, { xaxis: { mode: "categories" } }); + +By default, the labels are ordered as they are met in the data series. If you +need a different ordering, you can specify "categories" on the axis options +and list the categories there: + + xaxis: { + mode: "categories", + categories: ["February", "March", "April"] + } + +If you need to customize the distances between the categories, you can specify +"categories" as an object mapping labels to values + + xaxis: { + mode: "categories", + categories: { "February": 1, "March": 3, "April": 4 } + } + +If you don't specify all categories, the remaining categories will be numbered +from the max value plus 1 (with a spacing of 1 between each). + +Internally, the plugin works by transforming the input data through an auto- +generated mapping where the first category becomes 0, the second 1, etc. +Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this +is visible in hover and click events that return numbers rather than the +category labels). The plugin also overrides the tick generator to spit out the +categories as ticks instead of the values. + +If you need to map a value back to its label, the mapping is always accessible +as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories. + +*/(function(e){function n(e,t,n,r){var i=t.xaxis.options.mode=="categories",s=t.yaxis.options.mode=="categories";if(!i&&!s)return;var o=r.format;if(!o){var u=t;o=[],o.push({x:!0,number:!0,required:!0}),o.push({y:!0,number:!0,required:!0});if(u.bars.show||u.lines.show&&u.lines.fill){var a=!!(u.bars.show&&u.bars.zero||u.lines.show&&u.lines.zero);o.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:a}),u.bars.horizontal&&(delete o[o.length-1].y,o[o.length-1].x=!0)}r.format=o}for(var f=0;f<o.length;++f)o[f].x&&i&&(o[f].number=!1),o[f].y&&s&&(o[f].number=!1)}function r(e){var t=-1;for(var n in e)e[n]>t&&(t=e[n]);return t+1}function i(e){var t=[];for(var n in e.categories){var r=e.categories[n];r>=e.min&&r<=e.max&&t.push([r,n])}return t.sort(function(e,t){return e[0]-t[0]}),t}function s(t,n,r){if(t[n].options.mode!="categories")return;if(!t[n].categories){var s={},u=t[n].options.categories||{};if(e.isArray(u))for(var a=0;a<u.length;++a)s[u[a]]=a;else for(var f in u)s[f]=u[f];t[n].categories=s}t[n].options.ticks||(t[n].options.ticks=i),o(r,n,t[n].categories)}function o(e,t,n){var i=e.points,s=e.pointsize,o=e.format,u=t.charAt(0),a=r(n);for(var f=0;f<i.length;f+=s){if(i[f]==null)continue;for(var l=0;l<s;++l){var c=i[f+l];if(c==null||!o[l][u])continue;c in n||(n[c]=a,++a),i[f+l]=n[c]}}}function u(e,t,n){s(t,"xaxis",n),s(t,"yaxis",n)}function a(e){e.hooks.processRawData.push(n),e.hooks.processDatapoints.push(u)}var t={xaxis:{categories:null},yaxis:{categories:null}};e.plot.plugins.push({init:a,options:t,name:"categories",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/js/flot/jquery.flot.crosshair.js b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.crosshair.js new file mode 100644 index 0000000000000000000000000000000000000000..c5df9d910b506b9a8e997f93258e8026f2e69b1f --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.crosshair.js @@ -0,0 +1,176 @@ +/* Flot plugin for showing crosshairs when the mouse hovers over the plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + crosshair: { + mode: null or "x" or "y" or "xy" + color: color + lineWidth: number + } + +Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical +crosshair that lets you trace the values on the x axis, "y" enables a +horizontal crosshair and "xy" enables them both. "color" is the color of the +crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of +the drawn lines (default is 1). + +The plugin also adds four public methods: + + - setCrosshair( pos ) + + Set the position of the crosshair. Note that this is cleared if the user + moves the mouse. "pos" is in coordinates of the plot and should be on the + form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple + axes), which is coincidentally the same format as what you get from a + "plothover" event. If "pos" is null, the crosshair is cleared. + + - clearCrosshair() + + Clear the crosshair. + + - lockCrosshair(pos) + + Cause the crosshair to lock to the current location, no longer updating if + the user moves the mouse. Optionally supply a position (passed on to + setCrosshair()) to move it to. + + Example usage: + + var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; + $("#graph").bind( "plothover", function ( evt, position, item ) { + if ( item ) { + // Lock the crosshair to the data point being hovered + myFlot.lockCrosshair({ + x: item.datapoint[ 0 ], + y: item.datapoint[ 1 ] + }); + } else { + // Return normal crosshair operation + myFlot.unlockCrosshair(); + } + }); + + - unlockCrosshair() + + Free the crosshair to move again after locking it. +*/ + +(function ($) { + var options = { + crosshair: { + mode: null, // one of null, "x", "y" or "xy", + color: "rgba(170, 0, 0, 0.80)", + lineWidth: 1 + } + }; + + function init(plot) { + // position of crosshair in pixels + var crosshair = { x: -1, y: -1, locked: false }; + + plot.setCrosshair = function setCrosshair(pos) { + if (!pos) + crosshair.x = -1; + else { + var o = plot.p2c(pos); + crosshair.x = Math.max(0, Math.min(o.left, plot.width())); + crosshair.y = Math.max(0, Math.min(o.top, plot.height())); + } + + plot.triggerRedrawOverlay(); + }; + + plot.clearCrosshair = plot.setCrosshair; // passes null for pos + + plot.lockCrosshair = function lockCrosshair(pos) { + if (pos) + plot.setCrosshair(pos); + crosshair.locked = true; + }; + + plot.unlockCrosshair = function unlockCrosshair() { + crosshair.locked = false; + }; + + function onMouseOut(e) { + if (crosshair.locked) + return; + + if (crosshair.x != -1) { + crosshair.x = -1; + plot.triggerRedrawOverlay(); + } + } + + function onMouseMove(e) { + if (crosshair.locked) + return; + + if (plot.getSelection && plot.getSelection()) { + crosshair.x = -1; // hide the crosshair while selecting + return; + } + + var offset = plot.offset(); + crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); + crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); + plot.triggerRedrawOverlay(); + } + + plot.hooks.bindEvents.push(function (plot, eventHolder) { + if (!plot.getOptions().crosshair.mode) + return; + + eventHolder.mouseout(onMouseOut); + eventHolder.mousemove(onMouseMove); + }); + + plot.hooks.drawOverlay.push(function (plot, ctx) { + var c = plot.getOptions().crosshair; + if (!c.mode) + return; + + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + if (crosshair.x != -1) { + var adj = plot.getOptions().crosshair.lineWidth % 2 === 0 ? 0 : 0.5; + + ctx.strokeStyle = c.color; + ctx.lineWidth = c.lineWidth; + ctx.lineJoin = "round"; + + ctx.beginPath(); + if (c.mode.indexOf("x") != -1) { + var drawX = Math.round(crosshair.x) + adj; + ctx.moveTo(drawX, 0); + ctx.lineTo(drawX, plot.height()); + } + if (c.mode.indexOf("y") != -1) { + var drawY = Math.round(crosshair.y) + adj; + ctx.moveTo(0, drawY); + ctx.lineTo(plot.width(), drawY); + } + ctx.stroke(); + } + ctx.restore(); + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mouseout", onMouseOut); + eventHolder.unbind("mousemove", onMouseMove); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'crosshair', + version: '1.0' + }); +})(jQuery); diff --git a/babsi/BabsiWeb/web-app/js/flot/jquery.flot.min.js b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.min.js new file mode 100644 index 0000000000000000000000000000000000000000..3706512c4827bd4a502e581760b80fef1956c709 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.min.js @@ -0,0 +1,29 @@ +/* Javascript plotting library for jQuery, version 0.8.1. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery),function(e){function n(t,n){var r=n.children("."+t)[0];if(r==null){r=document.createElement("canvas"),r.className=t,e(r).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(n);if(!r.getContext){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");r=window.G_vmlCanvasManager.initElement(r)}}this.element=r;var i=this.context=r.getContext("2d"),s=window.devicePixelRatio||1,o=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1;this.pixelRatio=s/o,this.resize(n.width(),n.height()),this.textContainer=null,this.text={},this._textCache={}}function r(t,r,s,o){function E(e,t){t=[w].concat(t);for(var n=0;n<e.length;++n)e[n].apply(this,t)}function S(){var t={Canvas:n};for(var r=0;r<o.length;++r){var i=o[r];i.init(w,t),i.options&&e.extend(!0,a,i.options)}}function x(n){e.extend(!0,a,n),n&&n.colors&&(a.colors=n.colors),a.xaxis.color==null&&(a.xaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.yaxis.color==null&&(a.yaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.xaxis.tickColor==null&&(a.xaxis.tickColor=a.grid.tickColor||a.xaxis.color),a.yaxis.tickColor==null&&(a.yaxis.tickColor=a.grid.tickColor||a.yaxis.color),a.grid.borderColor==null&&(a.grid.borderColor=a.grid.color),a.grid.tickColor==null&&(a.grid.tickColor=e.color.parse(a.grid.color).scale("a",.22).toString());var r,i,s,o={style:t.css("font-style"),size:Math.round(.8*(+t.css("font-size").replace("px","")||13)),variant:t.css("font-variant"),weight:t.css("font-weight"),family:t.css("font-family")};o.lineHeight=o.size*1.15,s=a.xaxes.length||1;for(r=0;r<s;++r)i=a.xaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.xaxis,i),a.xaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));s=a.yaxes.length||1;for(r=0;r<s;++r)i=a.yaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.yaxis,i),a.yaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));a.xaxis.noTicks&&a.xaxis.ticks==null&&(a.xaxis.ticks=a.xaxis.noTicks),a.yaxis.noTicks&&a.yaxis.ticks==null&&(a.yaxis.ticks=a.yaxis.noTicks),a.x2axis&&(a.xaxes[1]=e.extend(!0,{},a.xaxis,a.x2axis),a.xaxes[1].position="top"),a.y2axis&&(a.yaxes[1]=e.extend(!0,{},a.yaxis,a.y2axis),a.yaxes[1].position="right"),a.grid.coloredAreas&&(a.grid.markings=a.grid.coloredAreas),a.grid.coloredAreasColor&&(a.grid.markingsColor=a.grid.coloredAreasColor),a.lines&&e.extend(!0,a.series.lines,a.lines),a.points&&e.extend(!0,a.series.points,a.points),a.bars&&e.extend(!0,a.series.bars,a.bars),a.shadowSize!=null&&(a.series.shadowSize=a.shadowSize),a.highlightColor!=null&&(a.series.highlightColor=a.highlightColor);for(r=0;r<a.xaxes.length;++r)O(d,r+1).options=a.xaxes[r];for(r=0;r<a.yaxes.length;++r)O(v,r+1).options=a.yaxes[r];for(var u in b)a.hooks[u]&&a.hooks[u].length&&(b[u]=b[u].concat(a.hooks[u]));E(b.processOptions,[a])}function T(e){u=N(e),M(),_()}function N(t){var n=[];for(var r=0;r<t.length;++r){var i=e.extend(!0,{},a.series);t[r].data!=null?(i.data=t[r].data,delete t[r].data,e.extend(!0,i,t[r]),t[r].data=i.data):i.data=t[r],n.push(i)}return n}function C(e,t){var n=e[t+"axis"];return typeof n=="object"&&(n=n.n),typeof n!="number"&&(n=1),n}function k(){return e.grep(d.concat(v),function(e){return e})}function L(e){var t={},n,r;for(n=0;n<d.length;++n)r=d[n],r&&r.used&&(t["x"+r.n]=r.c2p(e.left));for(n=0;n<v.length;++n)r=v[n],r&&r.used&&(t["y"+r.n]=r.c2p(e.top));return t.x1!==undefined&&(t.x=t.x1),t.y1!==undefined&&(t.y=t.y1),t}function A(e){var t={},n,r,i;for(n=0;n<d.length;++n){r=d[n];if(r&&r.used){i="x"+r.n,e[i]==null&&r.n==1&&(i="x");if(e[i]!=null){t.left=r.p2c(e[i]);break}}}for(n=0;n<v.length;++n){r=v[n];if(r&&r.used){i="y"+r.n,e[i]==null&&r.n==1&&(i="y");if(e[i]!=null){t.top=r.p2c(e[i]);break}}}return t}function O(t,n){return t[n-1]||(t[n-1]={n:n,direction:t==d?"x":"y",options:e.extend(!0,{},t==d?a.xaxis:a.yaxis)}),t[n-1]}function M(){var t=u.length,n=-1,r;for(r=0;r<u.length;++r){var i=u[r].color;i!=null&&(t--,typeof i=="number"&&i>n&&(n=i))}t<=n&&(t=n+1);var s,o=[],f=a.colors,l=f.length,c=0;for(r=0;r<t;r++)s=e.color.parse(f[r%l]||"#666"),r%l==0&&r&&(c>=0?c<.5?c=-c-.2:c=0:c=-c),o[r]=s.scale("rgb",1+c);var h=0,p;for(r=0;r<u.length;++r){p=u[r],p.color==null?(p.color=o[h].toString(),++h):typeof p.color=="number"&&(p.color=o[p.color].toString());if(p.lines.show==null){var m,g=!0;for(m in p)if(p[m]&&p[m].show){g=!1;break}g&&(p.lines.show=!0)}p.lines.zero==null&&(p.lines.zero=!!p.lines.fill),p.xaxis=O(d,C(p,"x")),p.yaxis=O(v,C(p,"y"))}}function _(){function x(e,t,n){t<e.datamin&&t!=-r&&(e.datamin=t),n>e.datamax&&n!=r&&(e.datamax=n)}var t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,r=Number.MAX_VALUE,i,s,o,a,f,l,c,h,p,d,v,m,g,y,w,S;e.each(k(),function(e,r){r.datamin=t,r.datamax=n,r.used=!1});for(i=0;i<u.length;++i)l=u[i],l.datapoints={points:[]},E(b.processRawData,[l,l.data,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],w=l.data,S=l.datapoints.format;if(!S){S=[],S.push({x:!0,number:!0,required:!0}),S.push({y:!0,number:!0,required:!0});if(l.bars.show||l.lines.show&&l.lines.fill){var T=!!(l.bars.show&&l.bars.zero||l.lines.show&&l.lines.zero);S.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:T}),l.bars.horizontal&&(delete S[S.length-1].y,S[S.length-1].x=!0)}l.datapoints.format=S}if(l.datapoints.pointsize!=null)continue;l.datapoints.pointsize=S.length,h=l.datapoints.pointsize,c=l.datapoints.points;var N=l.lines.show&&l.lines.steps;l.xaxis.used=l.yaxis.used=!0;for(s=o=0;s<w.length;++s,o+=h){y=w[s];var C=y==null;if(!C)for(a=0;a<h;++a)m=y[a],g=S[a],g&&(g.number&&m!=null&&(m=+m,isNaN(m)?m=null:m==Infinity?m=r:m==-Infinity&&(m=-r)),m==null&&(g.required&&(C=!0),g.defaultValue!=null&&(m=g.defaultValue))),c[o+a]=m;if(C)for(a=0;a<h;++a)m=c[o+a],m!=null&&(g=S[a],g.autoscale&&(g.x&&x(l.xaxis,m,m),g.y&&x(l.yaxis,m,m))),c[o+a]=null;else if(N&&o>0&&c[o-h]!=null&&c[o-h]!=c[o]&&c[o-h+1]!=c[o+1]){for(a=0;a<h;++a)c[o+h+a]=c[o+a];c[o+1]=c[o-h+1],o+=h}}}for(i=0;i<u.length;++i)l=u[i],E(b.processDatapoints,[l,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],c=l.datapoints.points,h=l.datapoints.pointsize,S=l.datapoints.format;var L=t,A=t,O=n,M=n;for(s=0;s<c.length;s+=h){if(c[s]==null)continue;for(a=0;a<h;++a){m=c[s+a],g=S[a];if(!g||g.autoscale===!1||m==r||m==-r)continue;g.x&&(m<L&&(L=m),m>O&&(O=m)),g.y&&(m<A&&(A=m),m>M&&(M=m))}}if(l.bars.show){var _;switch(l.bars.align){case"left":_=0;break;case"right":_=-l.bars.barWidth;break;case"center":_=-l.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+l.bars.align)}l.bars.horizontal?(A+=_,M+=_+l.bars.barWidth):(L+=_,O+=_+l.bars.barWidth)}x(l.xaxis,L,O),x(l.yaxis,A,M)}e.each(k(),function(e,r){r.datamin==t&&(r.datamin=null),r.datamax==n&&(r.datamax=null)})}function D(){t.css("padding",0).children(":not(.flot-base,.flot-overlay)").remove(),t.css("position")=="static"&&t.css("position","relative"),f=new n("flot-base",t),l=new n("flot-overlay",t),h=f.context,p=l.context,c=e(l.element).unbind();var r=t.data("plot");r&&(r.shutdown(),l.clear()),t.data("plot",w)}function P(){a.grid.hoverable&&(c.mousemove(at),c.bind("mouseleave",ft)),a.grid.clickable&&c.click(lt),E(b.bindEvents,[c])}function H(){ot&&clearTimeout(ot),c.unbind("mousemove",at),c.unbind("mouseleave",ft),c.unbind("click",lt),E(b.shutdown,[c])}function B(e){function t(e){return e}var n,r,i=e.options.transform||t,s=e.options.inverseTransform;e.direction=="x"?(n=e.scale=g/Math.abs(i(e.max)-i(e.min)),r=Math.min(i(e.max),i(e.min))):(n=e.scale=y/Math.abs(i(e.max)-i(e.min)),n=-n,r=Math.max(i(e.max),i(e.min))),i==t?e.p2c=function(e){return(e-r)*n}:e.p2c=function(e){return(i(e)-r)*n},s?e.c2p=function(e){return s(r+e/n)}:e.c2p=function(e){return r+e/n}}function j(e){var t=e.options,n=e.ticks||[],r=t.labelWidth||0,i=t.labelHeight||0,s=r||e.direction=="x"?Math.floor(f.width/(n.length||1)):null;legacyStyles=e.direction+"Axis "+e.direction+e.n+"Axis",layer="flot-"+e.direction+"-axis flot-"+e.direction+e.n+"-axis "+legacyStyles,font=t.font||"flot-tick-label tickLabel";for(var o=0;o<n.length;++o){var u=n[o];if(!u.label)continue;var a=f.getTextInfo(layer,u.label,font,null,s);r=Math.max(r,a.width),i=Math.max(i,a.height)}e.labelWidth=t.labelWidth||r,e.labelHeight=t.labelHeight||i}function F(t){var n=t.labelWidth,r=t.labelHeight,i=t.options.position,s=t.options.tickLength,o=a.grid.axisMargin,u=a.grid.labelMargin,l=t.direction=="x"?d:v,c,h,p=e.grep(l,function(e){return e&&e.options.position==i&&e.reserveSpace});e.inArray(t,p)==p.length-1&&(o=0);if(s==null){var g=e.grep(l,function(e){return e&&e.reserveSpace});h=e.inArray(t,g)==0,h?s="full":s=5}isNaN(+s)||(u+=+s),t.direction=="x"?(r+=u,i=="bottom"?(m.bottom+=r+o,t.box={top:f.height-m.bottom,height:r}):(t.box={top:m.top+o,height:r},m.top+=r+o)):(n+=u,i=="left"?(t.box={left:m.left+o,width:n},m.left+=n+o):(m.right+=n+o,t.box={left:f.width-m.right,width:n})),t.position=i,t.tickLength=s,t.box.padding=u,t.innermost=h}function I(e){e.direction=="x"?(e.box.left=m.left-e.labelWidth/2,e.box.width=f.width-m.left-m.right+e.labelWidth):(e.box.top=m.top-e.labelHeight/2,e.box.height=f.height-m.bottom-m.top+e.labelHeight)}function q(){var t=a.grid.minBorderMargin,n={x:0,y:0},r,i;if(t==null){t=0;for(r=0;r<u.length;++r)t=Math.max(t,2*(u[r].points.radius+u[r].points.lineWidth/2))}n.x=n.y=Math.ceil(t),e.each(k(),function(e,t){var r=t.direction;t.reserveSpace&&(n[r]=Math.ceil(Math.max(n[r],(r=="x"?t.labelWidth:t.labelHeight)/2)))}),m.left=Math.max(n.x,m.left),m.right=Math.max(n.x,m.right),m.top=Math.max(n.y,m.top),m.bottom=Math.max(n.y,m.bottom)}function R(){var t,n=k(),r=a.grid.show;for(var i in m){var s=a.grid.margin||0;m[i]=typeof s=="number"?s:s[i]||0}E(b.processOffset,[m]);for(var i in m)typeof a.grid.borderWidth=="object"?m[i]+=r?a.grid.borderWidth[i]:0:m[i]+=r?a.grid.borderWidth:0;e.each(n,function(e,t){t.show=t.options.show,t.show==null&&(t.show=t.used),t.reserveSpace=t.show||t.options.reserveSpace,U(t)});if(r){var o=e.grep(n,function(e){return e.reserveSpace});e.each(o,function(e,t){z(t),W(t),X(t,t.ticks),j(t)});for(t=o.length-1;t>=0;--t)F(o[t]);q(),e.each(o,function(e,t){I(t)})}g=f.width-m.left-m.right,y=f.height-m.bottom-m.top,e.each(n,function(e,t){B(t)}),r&&G(),it()}function U(e){var t=e.options,n=+(t.min!=null?t.min:e.datamin),r=+(t.max!=null?t.max:e.datamax),i=r-n;if(i==0){var s=r==0?1:.01;t.min==null&&(n-=s);if(t.max==null||t.min!=null)r+=s}else{var o=t.autoscaleMargin;o!=null&&(t.min==null&&(n-=i*o,n<0&&e.datamin!=null&&e.datamin>=0&&(n=0)),t.max==null&&(r+=i*o,r>0&&e.datamax!=null&&e.datamax<=0&&(r=0)))}e.min=n,e.max=r}function z(t){var n=t.options,r;typeof n.ticks=="number"&&n.ticks>0?r=n.ticks:r=.3*Math.sqrt(t.direction=="x"?f.width:f.height);var s=(t.max-t.min)/r,o=-Math.floor(Math.log(s)/Math.LN10),u=n.tickDecimals;u!=null&&o>u&&(o=u);var a=Math.pow(10,-o),l=s/a,c;l<1.5?c=1:l<3?(c=2,l>2.25&&(u==null||o+1<=u)&&(c=2.5,++o)):l<7.5?c=5:c=10,c*=a,n.minTickSize!=null&&c<n.minTickSize&&(c=n.minTickSize),t.delta=s,t.tickDecimals=Math.max(0,u!=null?u:o),t.tickSize=n.tickSize||c;if(n.mode=="time"&&!t.tickGenerator)throw new Error("Time mode requires the flot.time plugin.");t.tickGenerator||(t.tickGenerator=function(e){var t=[],n=i(e.min,e.tickSize),r=0,s=Number.NaN,o;do o=s,s=n+r*e.tickSize,t.push(s),++r;while(s<e.max&&s!=o);return t},t.tickFormatter=function(e,t){var n=t.tickDecimals?Math.pow(10,t.tickDecimals):1,r=""+Math.round(e*n)/n;if(t.tickDecimals!=null){var i=r.indexOf("."),s=i==-1?0:r.length-i-1;if(s<t.tickDecimals)return(s?r:r+".")+(""+n).substr(1,t.tickDecimals-s)}return r}),e.isFunction(n.tickFormatter)&&(t.tickFormatter=function(e,t){return""+n.tickFormatter(e,t)});if(n.alignTicksWithAxis!=null){var h=(t.direction=="x"?d:v)[n.alignTicksWithAxis-1];if(h&&h.used&&h!=t){var p=t.tickGenerator(t);p.length>0&&(n.min==null&&(t.min=Math.min(t.min,p[0])),n.max==null&&p.length>1&&(t.max=Math.max(t.max,p[p.length-1]))),t.tickGenerator=function(e){var t=[],n,r;for(r=0;r<h.ticks.length;++r)n=(h.ticks[r].v-h.min)/(h.max-h.min),n=e.min+n*(e.max-e.min),t.push(n);return t};if(!t.mode&&n.tickDecimals==null){var m=Math.max(0,-Math.floor(Math.log(t.delta)/Math.LN10)+1),g=t.tickGenerator(t);g.length>1&&/\..*0$/.test((g[1]-g[0]).toFixed(m))||(t.tickDecimals=m)}}}}function W(t){var n=t.options.ticks,r=[];n==null||typeof n=="number"&&n>0?r=t.tickGenerator(t):n&&(e.isFunction(n)?r=n(t):r=n);var i,s;t.ticks=[];for(i=0;i<r.length;++i){var o=null,u=r[i];typeof u=="object"?(s=+u[0],u.length>1&&(o=u[1])):s=+u,o==null&&(o=t.tickFormatter(s,t)),isNaN(s)||t.ticks.push({v:s,label:o})}}function X(e,t){e.options.autoscaleMargin&&t.length>0&&(e.options.min==null&&(e.min=Math.min(e.min,t[0].v)),e.options.max==null&&t.length>1&&(e.max=Math.max(e.max,t[t.length-1].v)))}function V(){f.clear(),E(b.drawBackground,[h]);var e=a.grid;e.show&&e.backgroundColor&&K(),e.show&&!e.aboveData&&Q();for(var t=0;t<u.length;++t)E(b.drawSeries,[h,u[t]]),Y(u[t]);E(b.draw,[h]),e.show&&e.aboveData&&Q(),f.render(),ht()}function J(e,t){var n,r,i,s,o=k();for(var u=0;u<o.length;++u){n=o[u];if(n.direction==t){s=t+n.n+"axis",!e[s]&&n.n==1&&(s=t+"axis");if(e[s]){r=e[s].from,i=e[s].to;break}}}e[s]||(n=t=="x"?d[0]:v[0],r=e[t+"1"],i=e[t+"2"]);if(r!=null&&i!=null&&r>i){var a=r;r=i,i=a}return{from:r,to:i,axis:n}}function K(){h.save(),h.translate(m.left,m.top),h.fillStyle=bt(a.grid.backgroundColor,y,0,"rgba(255, 255, 255, 0)"),h.fillRect(0,0,g,y),h.restore()}function Q(){var t,n,r,i;h.save(),h.translate(m.left,m.top);var s=a.grid.markings;if(s){e.isFunction(s)&&(n=w.getAxes(),n.xmin=n.xaxis.min,n.xmax=n.xaxis.max,n.ymin=n.yaxis.min,n.ymax=n.yaxis.max,s=s(n));for(t=0;t<s.length;++t){var o=s[t],u=J(o,"x"),f=J(o,"y");u.from==null&&(u.from=u.axis.min),u.to==null&&(u.to=u.axis.max),f.from==null&&(f.from=f.axis.min),f.to==null&&(f.to=f.axis.max);if(u.to<u.axis.min||u.from>u.axis.max||f.to<f.axis.min||f.from>f.axis.max)continue;u.from=Math.max(u.from,u.axis.min),u.to=Math.min(u.to,u.axis.max),f.from=Math.max(f.from,f.axis.min),f.to=Math.min(f.to,f.axis.max);if(u.from==u.to&&f.from==f.to)continue;u.from=u.axis.p2c(u.from),u.to=u.axis.p2c(u.to),f.from=f.axis.p2c(f.from),f.to=f.axis.p2c(f.to),u.from==u.to||f.from==f.to?(h.beginPath(),h.strokeStyle=o.color||a.grid.markingsColor,h.lineWidth=o.lineWidth||a.grid.markingsLineWidth,h.moveTo(u.from,f.from),h.lineTo(u.to,f.to),h.stroke()):(h.fillStyle=o.color||a.grid.markingsColor,h.fillRect(u.from,f.to,u.to-u.from,f.from-f.to))}}n=k(),r=a.grid.borderWidth;for(var l=0;l<n.length;++l){var c=n[l],p=c.box,d=c.tickLength,v,b,E,S;if(!c.show||c.ticks.length==0)continue;h.lineWidth=1,c.direction=="x"?(v=0,d=="full"?b=c.position=="top"?0:y:b=p.top-m.top+(c.position=="top"?p.height:0)):(b=0,d=="full"?v=c.position=="left"?0:g:v=p.left-m.left+(c.position=="left"?p.width:0)),c.innermost||(h.strokeStyle=c.options.color,h.beginPath(),E=S=0,c.direction=="x"?E=g+1:S=y+1,h.lineWidth==1&&(c.direction=="x"?b=Math.floor(b)+.5:v=Math.floor(v)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S),h.stroke()),h.strokeStyle=c.options.tickColor,h.beginPath();for(t=0;t<c.ticks.length;++t){var x=c.ticks[t].v;E=S=0;if(isNaN(x)||x<c.min||x>c.max||d=="full"&&(typeof r=="object"&&r[c.position]>0||r>0)&&(x==c.min||x==c.max))continue;c.direction=="x"?(v=c.p2c(x),S=d=="full"?-y:d,c.position=="top"&&(S=-S)):(b=c.p2c(x),E=d=="full"?-g:d,c.position=="left"&&(E=-E)),h.lineWidth==1&&(c.direction=="x"?v=Math.floor(v)+.5:b=Math.floor(b)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S)}h.stroke()}r&&(i=a.grid.borderColor,typeof r=="object"||typeof i=="object"?(typeof r!="object"&&(r={top:r,right:r,bottom:r,left:r}),typeof i!="object"&&(i={top:i,right:i,bottom:i,left:i}),r.top>0&&(h.strokeStyle=i.top,h.lineWidth=r.top,h.beginPath(),h.moveTo(0-r.left,0-r.top/2),h.lineTo(g,0-r.top/2),h.stroke()),r.right>0&&(h.strokeStyle=i.right,h.lineWidth=r.right,h.beginPath(),h.moveTo(g+r.right/2,0-r.top),h.lineTo(g+r.right/2,y),h.stroke()),r.bottom>0&&(h.strokeStyle=i.bottom,h.lineWidth=r.bottom,h.beginPath(),h.moveTo(g+r.right,y+r.bottom/2),h.lineTo(0,y+r.bottom/2),h.stroke()),r.left>0&&(h.strokeStyle=i.left,h.lineWidth=r.left,h.beginPath(),h.moveTo(0-r.left/2,y+r.bottom),h.lineTo(0-r.left/2,0),h.stroke())):(h.lineWidth=r,h.strokeStyle=a.grid.borderColor,h.strokeRect(-r/2,-r/2,g+r,y+r))),h.restore()}function G(){e.each(k(),function(e,t){if(!t.show||t.ticks.length==0)return;var n=t.box,r=t.direction+"Axis "+t.direction+t.n+"Axis",i="flot-"+t.direction+"-axis flot-"+t.direction+t.n+"-axis "+r,s=t.options.font||"flot-tick-label tickLabel",o,u,a,l,c;f.removeText(i);for(var h=0;h<t.ticks.length;++h){o=t.ticks[h];if(!o.label||o.v<t.min||o.v>t.max)continue;t.direction=="x"?(l="center",u=m.left+t.p2c(o.v),t.position=="bottom"?a=n.top+n.padding:(a=n.top+n.height-n.padding,c="bottom")):(c="middle",a=m.top+t.p2c(o.v),t.position=="left"?(u=n.left+n.width-n.padding,l="right"):u=n.left+n.padding),f.addText(i,u,a,o.label,s,null,null,l,c)}})}function Y(e){e.lines.show&&Z(e),e.bars.show&&nt(e),e.points.show&&et(e)}function Z(e){function t(e,t,n,r,i){var s=e.points,o=e.pointsize,u=null,a=null;h.beginPath();for(var f=o;f<s.length;f+=o){var l=s[f-o],c=s[f-o+1],p=s[f],d=s[f+1];if(l==null||p==null)continue;if(c<=d&&c<i.min){if(d<i.min)continue;l=(i.min-c)/(d-c)*(p-l)+l,c=i.min}else if(d<=c&&d<i.min){if(c<i.min)continue;p=(i.min-c)/(d-c)*(p-l)+l,d=i.min}if(c>=d&&c>i.max){if(d>i.max)continue;l=(i.max-c)/(d-c)*(p-l)+l,c=i.max}else if(d>=c&&d>i.max){if(c>i.max)continue;p=(i.max-c)/(d-c)*(p-l)+l,d=i.max}if(l<=p&&l<r.min){if(p<r.min)continue;c=(r.min-l)/(p-l)*(d-c)+c,l=r.min}else if(p<=l&&p<r.min){if(l<r.min)continue;d=(r.min-l)/(p-l)*(d-c)+c,p=r.min}if(l>=p&&l>r.max){if(p>r.max)continue;c=(r.max-l)/(p-l)*(d-c)+c,l=r.max}else if(p>=l&&p>r.max){if(l>r.max)continue;d=(r.max-l)/(p-l)*(d-c)+c,p=r.max}(l!=u||c!=a)&&h.moveTo(r.p2c(l)+t,i.p2c(c)+n),u=p,a=d,h.lineTo(r.p2c(p)+t,i.p2c(d)+n)}h.stroke()}function n(e,t,n){var r=e.points,i=e.pointsize,s=Math.min(Math.max(0,n.min),n.max),o=0,u,a=!1,f=1,l=0,c=0;for(;;){if(i>0&&o>r.length+i)break;o+=i;var p=r[o-i],d=r[o-i+f],v=r[o],m=r[o+f];if(a){if(i>0&&p!=null&&v==null){c=o,i=-i,f=2;continue}if(i<0&&o==l+i){h.fill(),a=!1,i=-i,f=1,o=l=c+i;continue}}if(p==null||v==null)continue;if(p<=v&&p<t.min){if(v<t.min)continue;d=(t.min-p)/(v-p)*(m-d)+d,p=t.min}else if(v<=p&&v<t.min){if(p<t.min)continue;m=(t.min-p)/(v-p)*(m-d)+d,v=t.min}if(p>=v&&p>t.max){if(v>t.max)continue;d=(t.max-p)/(v-p)*(m-d)+d,p=t.max}else if(v>=p&&v>t.max){if(p>t.max)continue;m=(t.max-p)/(v-p)*(m-d)+d,v=t.max}a||(h.beginPath(),h.moveTo(t.p2c(p),n.p2c(s)),a=!0);if(d>=n.max&&m>=n.max){h.lineTo(t.p2c(p),n.p2c(n.max)),h.lineTo(t.p2c(v),n.p2c(n.max));continue}if(d<=n.min&&m<=n.min){h.lineTo(t.p2c(p),n.p2c(n.min)),h.lineTo(t.p2c(v),n.p2c(n.min));continue}var g=p,y=v;d<=m&&d<n.min&&m>=n.min?(p=(n.min-d)/(m-d)*(v-p)+p,d=n.min):m<=d&&m<n.min&&d>=n.min&&(v=(n.min-d)/(m-d)*(v-p)+p,m=n.min),d>=m&&d>n.max&&m<=n.max?(p=(n.max-d)/(m-d)*(v-p)+p,d=n.max):m>=d&&m>n.max&&d<=n.max&&(v=(n.max-d)/(m-d)*(v-p)+p,m=n.max),p!=g&&h.lineTo(t.p2c(g),n.p2c(d)),h.lineTo(t.p2c(p),n.p2c(d)),h.lineTo(t.p2c(v),n.p2c(m)),v!=y&&(h.lineTo(t.p2c(v),n.p2c(m)),h.lineTo(t.p2c(y),n.p2c(m)))}}h.save(),h.translate(m.left,m.top),h.lineJoin="round";var r=e.lines.lineWidth,i=e.shadowSize;if(r>0&&i>0){h.lineWidth=i,h.strokeStyle="rgba(0,0,0,0.1)";var s=Math.PI/18;t(e.datapoints,Math.sin(s)*(r/2+i/2),Math.cos(s)*(r/2+i/2),e.xaxis,e.yaxis),h.lineWidth=i/2,t(e.datapoints,Math.sin(s)*(r/2+i/4),Math.cos(s)*(r/2+i/4),e.xaxis,e.yaxis)}h.lineWidth=r,h.strokeStyle=e.color;var o=rt(e.lines,e.color,0,y);o&&(h.fillStyle=o,n(e.datapoints,e.xaxis,e.yaxis)),r>0&&t(e.datapoints,0,0,e.xaxis,e.yaxis),h.restore()}function et(e){function t(e,t,n,r,i,s,o,u){var a=e.points,f=e.pointsize;for(var l=0;l<a.length;l+=f){var c=a[l],p=a[l+1];if(c==null||c<s.min||c>s.max||p<o.min||p>o.max)continue;h.beginPath(),c=s.p2c(c),p=o.p2c(p)+r,u=="circle"?h.arc(c,p,t,0,i?Math.PI:Math.PI*2,!1):u(h,c,p,t,i),h.closePath(),n&&(h.fillStyle=n,h.fill()),h.stroke()}}h.save(),h.translate(m.left,m.top);var n=e.points.lineWidth,r=e.shadowSize,i=e.points.radius,s=e.points.symbol;n==0&&(n=1e-4);if(n>0&&r>0){var o=r/2;h.lineWidth=o,h.strokeStyle="rgba(0,0,0,0.1)",t(e.datapoints,i,null,o+o/2,!0,e.xaxis,e.yaxis,s),h.strokeStyle="rgba(0,0,0,0.2)",t(e.datapoints,i,null,o/2,!0,e.xaxis,e.yaxis,s)}h.lineWidth=n,h.strokeStyle=e.color,t(e.datapoints,i,rt(e.points,e.color),0,!1,e.xaxis,e.yaxis,s),h.restore()}function tt(e,t,n,r,i,s,o,u,a,f,l,c){var h,p,d,v,m,g,y,b,w;l?(b=g=y=!0,m=!1,h=n,p=e,v=t+r,d=t+i,p<h&&(w=p,p=h,h=w,m=!0,g=!1)):(m=g=y=!0,b=!1,h=e+r,p=e+i,d=n,v=t,v<d&&(w=v,v=d,d=w,b=!0,y=!1));if(p<u.min||h>u.max||v<a.min||d>a.max)return;h<u.min&&(h=u.min,m=!1),p>u.max&&(p=u.max,g=!1),d<a.min&&(d=a.min,b=!1),v>a.max&&(v=a.max,y=!1),h=u.p2c(h),d=a.p2c(d),p=u.p2c(p),v=a.p2c(v),o&&(f.beginPath(),f.moveTo(h,d),f.lineTo(h,v),f.lineTo(p,v),f.lineTo(p,d),f.fillStyle=o(d,v),f.fill()),c>0&&(m||g||y||b)&&(f.beginPath(),f.moveTo(h,d+s),m?f.lineTo(h,v+s):f.moveTo(h,v+s),y?f.lineTo(p,v+s):f.moveTo(p,v+s),g?f.lineTo(p,d+s):f.moveTo(p,d+s),b?f.lineTo(h,d+s):f.moveTo(h,d+s),f.stroke())}function nt(e){function t(t,n,r,i,s,o,u){var a=t.points,f=t.pointsize;for(var l=0;l<a.length;l+=f){if(a[l]==null)continue;tt(a[l],a[l+1],a[l+2],n,r,i,s,o,u,h,e.bars.horizontal,e.bars.lineWidth)}}h.save(),h.translate(m.left,m.top),h.lineWidth=e.bars.lineWidth,h.strokeStyle=e.color;var n;switch(e.bars.align){case"left":n=0;break;case"right":n=-e.bars.barWidth;break;case"center":n=-e.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+e.bars.align)}var r=e.bars.fill?function(t,n){return rt(e.bars,e.color,t,n)}:null;t(e.datapoints,n,n+e.bars.barWidth,0,r,e.xaxis,e.yaxis),h.restore()}function rt(t,n,r,i){var s=t.fill;if(!s)return null;if(t.fillColor)return bt(t.fillColor,r,i,n);var o=e.color.parse(n);return o.a=typeof s=="number"?s:.4,o.normalize(),o.toString()}function it(){t.find(".legend").remove();if(!a.legend.show)return;var n=[],r=[],i=!1,s=a.legend.labelFormatter,o,f;for(var l=0;l<u.length;++l)o=u[l],o.label&&(f=s?s(o.label,o):o.label,f&&r.push({label:f,color:o.color}));if(a.legend.sorted)if(e.isFunction(a.legend.sorted))r.sort(a.legend.sorted);else if(a.legend.sorted=="reverse")r.reverse();else{var c=a.legend.sorted!="descending";r.sort(function(e,t){return e.label==t.label?0:e.label<t.label!=c?1:-1})}for(var l=0;l<r.length;++l){var h=r[l];l%a.legend.noColumns==0&&(i&&n.push("</tr>"),n.push("<tr>"),i=!0),n.push('<td class="legendColorBox"><div style="border:1px solid '+a.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+h.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+h.label+"</td>")}i&&n.push("</tr>");if(n.length==0)return;var p='<table style="font-size:smaller;color:'+a.grid.color+'">'+n.join("")+"</table>";if(a.legend.container!=null)e(a.legend.container).html(p);else{var d="",v=a.legend.position,g=a.legend.margin;g[0]==null&&(g=[g,g]),v.charAt(0)=="n"?d+="top:"+(g[1]+m.top)+"px;":v.charAt(0)=="s"&&(d+="bottom:"+(g[1]+m.bottom)+"px;"),v.charAt(1)=="e"?d+="right:"+(g[0]+m.right)+"px;":v.charAt(1)=="w"&&(d+="left:"+(g[0]+m.left)+"px;");var y=e('<div class="legend">'+p.replace('style="','style="position:absolute;'+d+";")+"</div>").appendTo(t);if(a.legend.backgroundOpacity!=0){var b=a.legend.backgroundColor;b==null&&(b=a.grid.backgroundColor,b&&typeof b=="string"?b=e.color.parse(b):b=e.color.extract(y,"background-color"),b.a=1,b=b.toString());var w=y.children();e('<div style="position:absolute;width:'+w.width()+"px;height:"+w.height()+"px;"+d+"background-color:"+b+';"> </div>').prependTo(y).css("opacity",a.legend.backgroundOpacity)}}}function ut(e,t,n){var r=a.grid.mouseActiveRadius,i=r*r+1,s=null,o=!1,f,l,c;for(f=u.length-1;f>=0;--f){if(!n(u[f]))continue;var h=u[f],p=h.xaxis,d=h.yaxis,v=h.datapoints.points,m=p.c2p(e),g=d.c2p(t),y=r/p.scale,b=r/d.scale;c=h.datapoints.pointsize,p.options.inverseTransform&&(y=Number.MAX_VALUE),d.options.inverseTransform&&(b=Number.MAX_VALUE);if(h.lines.show||h.points.show)for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1];if(w==null)continue;if(w-m>y||w-m<-y||E-g>b||E-g<-b)continue;var S=Math.abs(p.p2c(w)-e),x=Math.abs(d.p2c(E)-t),T=S*S+x*x;T<i&&(i=T,s=[f,l/c])}if(h.bars.show&&!s){var N=h.bars.align=="left"?0:-h.bars.barWidth/2,C=N+h.bars.barWidth;for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1],k=v[l+2];if(w==null)continue;if(u[f].bars.horizontal?m<=Math.max(k,w)&&m>=Math.min(k,w)&&g>=E+N&&g<=E+C:m>=w+N&&m<=w+C&&g>=Math.min(k,E)&&g<=Math.max(k,E))s=[f,l/c]}}}return s?(f=s[0],l=s[1],c=u[f].datapoints.pointsize,{datapoint:u[f].datapoints.points.slice(l*c,(l+1)*c),dataIndex:l,series:u[f],seriesIndex:f}):null}function at(e){a.grid.hoverable&&ct("plothover",e,function(e){return e["hoverable"]!=0})}function ft(e){a.grid.hoverable&&ct("plothover",e,function(e){return!1})}function lt(e){ct("plotclick",e,function(e){return e["clickable"]!=0})}function ct(e,n,r){var i=c.offset(),s=n.pageX-i.left-m.left,o=n.pageY-i.top-m.top,u=L({left:s,top:o});u.pageX=n.pageX,u.pageY=n.pageY;var f=ut(s,o,r);f&&(f.pageX=parseInt(f.series.xaxis.p2c(f.datapoint[0])+i.left+m.left,10),f.pageY=parseInt(f.series.yaxis.p2c(f.datapoint[1])+i.top+m.top,10));if(a.grid.autoHighlight){for(var l=0;l<st.length;++l){var h=st[l];h.auto==e&&(!f||h.series!=f.series||h.point[0]!=f.datapoint[0]||h.point[1]!=f.datapoint[1])&&vt(h.series,h.point)}f&&dt(f.series,f.datapoint,e)}t.trigger(e,[u,f])}function ht(){var e=a.interaction.redrawOverlayInterval;if(e==-1){pt();return}ot||(ot=setTimeout(pt,e))}function pt(){ot=null,p.save(),l.clear(),p.translate(m.left,m.top);var e,t;for(e=0;e<st.length;++e)t=st[e],t.series.bars.show?yt(t.series,t.point):gt(t.series,t.point);p.restore(),E(b.drawOverlay,[p])}function dt(e,t,n){typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var r=e.datapoints.pointsize;t=e.datapoints.points.slice(r*t,r*(t+1))}var i=mt(e,t);i==-1?(st.push({series:e,point:t,auto:n}),ht()):n||(st[i].auto=!1)}function vt(e,t){if(e==null&&t==null){st=[],ht();return}typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var n=e.datapoints.pointsize;t=e.datapoints.points.slice(n*t,n*(t+1))}var r=mt(e,t);r!=-1&&(st.splice(r,1),ht())}function mt(e,t){for(var n=0;n<st.length;++n){var r=st[n];if(r.series==e&&r.point[0]==t[0]&&r.point[1]==t[1])return n}return-1}function gt(t,n){var r=n[0],i=n[1],s=t.xaxis,o=t.yaxis,u=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString();if(r<s.min||r>s.max||i<o.min||i>o.max)return;var a=t.points.radius+t.points.lineWidth/2;p.lineWidth=a,p.strokeStyle=u;var f=1.5*a;r=s.p2c(r),i=o.p2c(i),p.beginPath(),t.points.symbol=="circle"?p.arc(r,i,f,0,2*Math.PI,!1):t.points.symbol(p,r,i,f,!1),p.closePath(),p.stroke()}function yt(t,n){var r=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString(),i=r,s=t.bars.align=="left"?0:-t.bars.barWidth/2;p.lineWidth=t.bars.lineWidth,p.strokeStyle=r,tt(n[0],n[1],n[2]||0,s,s+t.bars.barWidth,0,function(){return i},t.xaxis,t.yaxis,p,t.bars.horizontal,t.bars.lineWidth)}function bt(t,n,r,i){if(typeof t=="string")return t;var s=h.createLinearGradient(0,r,0,n);for(var o=0,u=t.colors.length;o<u;++o){var a=t.colors[o];if(typeof a!="string"){var f=e.color.parse(i);a.brightness!=null&&(f=f.scale("rgb",a.brightness)),a.opacity!=null&&(f.a*=a.opacity),a=f.toString()}s.addColorStop(o/(u-1),a)}return s}var u=[],a={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},f=null,l=null,c=null,h=null,p=null,d=[],v=[],m={left:0,right:0,top:0,bottom +:0},g=0,y=0,b={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},w=this;w.setData=T,w.setupGrid=R,w.draw=V,w.getPlaceholder=function(){return t},w.getCanvas=function(){return f.element},w.getPlotOffset=function(){return m},w.width=function(){return g},w.height=function(){return y},w.offset=function(){var e=c.offset();return e.left+=m.left,e.top+=m.top,e},w.getData=function(){return u},w.getAxes=function(){var t={},n;return e.each(d.concat(v),function(e,n){n&&(t[n.direction+(n.n!=1?n.n:"")+"axis"]=n)}),t},w.getXAxes=function(){return d},w.getYAxes=function(){return v},w.c2p=L,w.p2c=A,w.getOptions=function(){return a},w.highlight=dt,w.unhighlight=vt,w.triggerRedrawOverlay=ht,w.pointOffset=function(e){return{left:parseInt(d[C(e,"x")-1].p2c(+e.x)+m.left,10),top:parseInt(v[C(e,"y")-1].p2c(+e.y)+m.top,10)}},w.shutdown=H,w.resize=function(){var e=t.width(),n=t.height();f.resize(e,n),l.resize(e,n)},w.hooks=b,S(w),x(s),D(),T(r),R(),V(),P();var st=[],ot=null}function i(e,t){return t*Math.floor(e/t)}var t=Object.prototype.hasOwnProperty;n.prototype.resize=function(e,t){if(e<=0||t<=0)throw new Error("Invalid dimensions for plot, width = "+e+", height = "+t);var n=this.element,r=this.context,i=this.pixelRatio;this.width!=e&&(n.width=e*i,n.style.width=e+"px",this.width=e),this.height!=t&&(n.height=t*i,n.style.height=t+"px",this.height=t),r.restore(),r.save(),r.scale(i,i)},n.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},n.prototype.render=function(){var e=this._textCache;for(var n in e)if(t.call(e,n)){var r=this.getTextLayer(n),i=e[n];r.hide();for(var s in i)if(t.call(i,s)){var o=i[s];for(var u in o)if(t.call(o,u)){var a=o[u].positions;for(var f=0,l;l=a[f];f++)l.active?l.rendered||(r.append(l.element),l.rendered=!0):(a.splice(f--,1),l.rendered&&l.element.detach());a.length==0&&delete o[u]}}r.show()}},n.prototype.getTextLayer=function(t){var n=this.text[t];return n==null&&(this.textContainer==null&&(this.textContainer=e("<div class='flot-text'></div>").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),n=this.text[t]=e("<div></div>").addClass(t).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),n},n.prototype.getTextInfo=function(t,n,r,i,s){var o,u,a,f;n=""+n,typeof r=="object"?o=r.style+" "+r.variant+" "+r.weight+" "+r.size+"px/"+r.lineHeight+"px "+r.family:o=r,u=this._textCache[t],u==null&&(u=this._textCache[t]={}),a=u[o],a==null&&(a=u[o]={}),f=a[n];if(f==null){var l=e("<div></div>").html(n).css({position:"absolute","max-width":s,top:-9999}).appendTo(this.getTextLayer(t));typeof r=="object"?l.css({font:o,color:r.color}):typeof r=="string"&&l.addClass(r),f=a[n]={width:l.outerWidth(!0),height:l.outerHeight(!0),element:l,positions:[]},l.detach()}return f},n.prototype.addText=function(e,t,n,r,i,s,o,u,a){var f=this.getTextInfo(e,r,i,s,o),l=f.positions;u=="center"?t-=f.width/2:u=="right"&&(t-=f.width),a=="middle"?n-=f.height/2:a=="bottom"&&(n-=f.height);for(var c=0,h;h=l[c];c++)if(h.x==t&&h.y==n){h.active=!0;return}h={active:!0,rendered:!1,element:l.length?f.element.clone():f.element,x:t,y:n},l.push(h),h.element.css({top:Math.round(n),left:Math.round(t),"text-align":u})},n.prototype.removeText=function(e,n,r,i,s,o){if(i==null){var u=this._textCache[e];if(u!=null)for(var a in u)if(t.call(u,a)){var f=u[a];for(var l in f)if(t.call(f,l)){var c=f[l].positions;for(var h=0,p;p=c[h];h++)p.active=!1}}}else{var c=this.getTextInfo(e,i,s,o).positions;for(var h=0,p;p=c[h];h++)p.x==n&&p.y==r&&(p.active=!1)}},e.plot=function(t,n,i){var s=new r(e(t),n,i,e.plot.plugins);return s},e.plot.version="0.8.1",e.plot.plugins=[],e.fn.plot=function(t,n){return this.each(function(){e.plot(this,t,n)})}}(jQuery); \ No newline at end of file diff --git a/babsi/BabsiWeb/web-app/js/flot/jquery.flot.time.js b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.time.js new file mode 100644 index 0000000000000000000000000000000000000000..15f52815fee65ec4f7a40c28500c0edc8dbc432a --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/flot/jquery.flot.time.js @@ -0,0 +1,431 @@ +/* Pretty handling of time axes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Set axis.mode to "time" to enable. See the section "Time series data" in +API.txt for details. + +*/ + +(function($) { + + var options = { + xaxis: { + timezone: null, // "browser" for local to the client or timezone for timezone-js + timeformat: null, // format string to use + twelveHourClock: false, // 12 or 24 time in time mode + monthNames: null // list of names of months + } + }; + + // round to nearby lower multiple of base + + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + + // Returns a string with the date d formatted according to fmt. + // A subset of the Open Group's strftime format is supported. + + function formatDate(d, fmt, monthNames, dayNames) { + + if (typeof d.strftime == "function") { + return d.strftime(fmt); + } + + var leftPad = function(n, pad) { + n = "" + n; + pad = "" + (pad == null ? "0" : pad); + return n.length == 1 ? pad + n : n; + }; + + var r = []; + var escape = false; + var hours = d.getHours(); + var isAM = hours < 12; + + if (monthNames == null) { + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + } + + if (dayNames == null) { + dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + var hours12; + + if (hours > 12) { + hours12 = hours - 12; + } else if (hours == 0) { + hours12 = 12; + } else { + hours12 = hours; + } + + for (var i = 0; i < fmt.length; ++i) { + + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'a': c = "" + dayNames[d.getDay()]; break; + case 'b': c = "" + monthNames[d.getMonth()]; break; + case 'd': c = leftPad(d.getDate()); break; + case 'e': c = leftPad(d.getDate(), " "); break; + case 'h': // For back-compat with 0.7; remove in 1.0 + case 'H': c = leftPad(hours); break; + case 'I': c = leftPad(hours12); break; + case 'l': c = leftPad(hours12, " "); break; + case 'm': c = leftPad(d.getMonth() + 1); break; + case 'M': c = leftPad(d.getMinutes()); break; + // quarters not in Open Group's strftime specification + case 'q': + c = "" + (Math.floor(d.getMonth() / 3) + 1); break; + case 'S': c = leftPad(d.getSeconds()); break; + case 'y': c = leftPad(d.getFullYear() % 100); break; + case 'Y': c = "" + d.getFullYear(); break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case 'w': c = "" + d.getDay(); break; + } + r.push(c); + escape = false; + } else { + if (c == "%") { + escape = true; + } else { + r.push(c); + } + } + } + + return r.join(""); + } + + // To have a consistent view of time-based data independent of which time + // zone the client happens to be in we need a date-like object independent + // of time zones. This is done through a wrapper that only calls the UTC + // versions of the accessor methods. + + function makeUtcWrapper(d) { + + function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) { + sourceObj[sourceMethod] = function() { + return targetObj[targetMethod].apply(targetObj, arguments); + }; + }; + + var utc = { + date: d + }; + + // support strftime, if found + + if (d.strftime != undefined) { + addProxyMethod(utc, "strftime", d, "strftime"); + } + + addProxyMethod(utc, "getTime", d, "getTime"); + addProxyMethod(utc, "setTime", d, "setTime"); + + var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"]; + + for (var p = 0; p < props.length; p++) { + addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]); + addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]); + } + + return utc; + }; + + // select time zone strategy. This returns a date-like object tied to the + // desired timezone + + function dateGenerator(ts, opts) { + if (opts.timezone == "browser") { + return new Date(ts); + } else if (!opts.timezone || opts.timezone == "utc") { + return makeUtcWrapper(new Date(ts)); + } else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") { + var d = new timezoneJS.Date(); + // timezone-js is fickle, so be sure to set the time zone before + // setting the time. + d.setTimezone(opts.timezone); + d.setTime(ts); + return d; + } else { + return makeUtcWrapper(new Date(ts)); + } + } + + // map of app. size of time units in milliseconds + + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "quarter": 3 * 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + + var baseSpec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"] + ]; + + // we don't know which variant(s) we'll need yet, but generating both is + // cheap + + var specMonths = baseSpec.concat([[3, "month"], [6, "month"], + [1, "year"]]); + var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"], + [1, "year"]]); + + function init(plot) { + plot.hooks.processOptions.push(function (plot, options) { + $.each(plot.getAxes(), function(axisName, axis) { + + var opts = axis.options; + + if (opts.mode == "time") { + axis.tickGenerator = function(axis) { + + var ticks = []; + var d = dateGenerator(axis.min, opts); + var minSize = 0; + + // make quarter use a possibility if quarters are + // mentioned in either of these options + + var spec = (opts.tickSize && opts.tickSize[1] === + "quarter") || + (opts.minTickSize && opts.minTickSize[1] === + "quarter") ? specQuarters : specMonths; + + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") { + minSize = opts.tickSize; + } else { + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + } + + for (var i = 0; i < spec.length - 1; ++i) { + if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) { + break; + } + } + + var size = spec[i][0]; + var unit = spec[i][1]; + + // special-case the possibility of several years + + if (unit == "year") { + + // if given a minTickSize in years, just use it, + // ensuring that it's an integer + + if (opts.minTickSize != null && opts.minTickSize[1] == "year") { + size = Math.floor(opts.minTickSize[0]); + } else { + + var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10)); + var norm = (axis.delta / timeUnitSize.year) / magn; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + } + + // minimum size for years is 1 + + if (size < 1) { + size = 1; + } + } + + axis.tickSize = opts.tickSize || [size, unit]; + var tickSize = axis.tickSize[0]; + unit = axis.tickSize[1]; + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") { + d.setSeconds(floorInBase(d.getSeconds(), tickSize)); + } else if (unit == "minute") { + d.setMinutes(floorInBase(d.getMinutes(), tickSize)); + } else if (unit == "hour") { + d.setHours(floorInBase(d.getHours(), tickSize)); + } else if (unit == "month") { + d.setMonth(floorInBase(d.getMonth(), tickSize)); + } else if (unit == "quarter") { + d.setMonth(3 * floorInBase(d.getMonth() / 3, + tickSize)); + } else if (unit == "year") { + d.setFullYear(floorInBase(d.getFullYear(), tickSize)); + } + + // reset smaller components + + d.setMilliseconds(0); + + if (step >= timeUnitSize.minute) { + d.setSeconds(0); + } + if (step >= timeUnitSize.hour) { + d.setMinutes(0); + } + if (step >= timeUnitSize.day) { + d.setHours(0); + } + if (step >= timeUnitSize.day * 4) { + d.setDate(1); + } + if (step >= timeUnitSize.month * 2) { + d.setMonth(floorInBase(d.getMonth(), 3)); + } + if (step >= timeUnitSize.quarter * 2) { + d.setMonth(floorInBase(d.getMonth(), 6)); + } + if (step >= timeUnitSize.year) { + d.setMonth(0); + } + + var carry = 0; + var v = Number.NaN; + var prev; + + do { + + prev = v; + v = d.getTime(); + ticks.push(v); + + if (unit == "month" || unit == "quarter") { + if (tickSize < 1) { + + // a bit complicated - we'll divide the + // month/quarter up but we need to take + // care of fractions so we don't end up in + // the middle of a day + + d.setDate(1); + var start = d.getTime(); + d.setMonth(d.getMonth() + + (unit == "quarter" ? 3 : 1)); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getHours(); + d.setHours(0); + } else { + d.setMonth(d.getMonth() + + tickSize * (unit == "quarter" ? 3 : 1)); + } + } else if (unit == "year") { + d.setFullYear(d.getFullYear() + tickSize); + } else { + d.setTime(v + step); + } + } while (v < axis.max && v != prev); + + return ticks; + }; + + axis.tickFormatter = function (v, axis) { + + var d = dateGenerator(v, axis.options); + + // first check global format + + if (opts.timeformat != null) { + return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames); + } + + // possibly use quarters if quarters are mentioned in + // any of these places + + var useQuarters = (axis.options.tickSize && + axis.options.tickSize[1] == "quarter") || + (axis.options.minTickSize && + axis.options.minTickSize[1] == "quarter"); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + var hourCode = (opts.twelveHourClock) ? "%I" : "%H"; + var fmt; + + if (t < timeUnitSize.minute) { + fmt = hourCode + ":%M:%S" + suffix; + } else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) { + fmt = hourCode + ":%M" + suffix; + } else { + fmt = "%b %d " + hourCode + ":%M" + suffix; + } + } else if (t < timeUnitSize.month) { + fmt = "%b %d"; + } else if ((useQuarters && t < timeUnitSize.quarter) || + (!useQuarters && t < timeUnitSize.year)) { + if (span < timeUnitSize.year) { + fmt = "%b"; + } else { + fmt = "%b %Y"; + } + } else if (useQuarters && t < timeUnitSize.year) { + if (span < timeUnitSize.year) { + fmt = "Q%q"; + } else { + fmt = "Q%q %Y"; + } + } else { + fmt = "%Y"; + } + + var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames); + + return rt; + }; + } + }); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'time', + version: '1.0' + }); + + // Time-axis support used to be in Flot core, which exposed the + // formatDate function on the plot object. Various plugins depend + // on the function, so we need to re-expose it here. + + $.plot.formatDate = formatDate; + +})(jQuery); diff --git a/babsi/BabsiWeb/web-app/js/moment.min.js b/babsi/BabsiWeb/web-app/js/moment.min.js new file mode 100644 index 0000000000000000000000000000000000000000..45d9c14f5a90618758ed5ea6d6dd6e6a3f7bb345 --- /dev/null +++ b/babsi/BabsiWeb/web-app/js/moment.min.js @@ -0,0 +1,6 @@ +// moment.js +// version : 2.1.0 +// author : Tim Wood +// license : MIT +// momentjs.com +!function(t){function e(t,e){return function(n){return u(t.call(this,n),e)}}function n(t,e){return function(n){return this.lang().ordinal(t.call(this,n),e)}}function s(){}function i(t){a(this,t)}function r(t){var e=t.years||t.year||t.y||0,n=t.months||t.month||t.M||0,s=t.weeks||t.week||t.w||0,i=t.days||t.day||t.d||0,r=t.hours||t.hour||t.h||0,a=t.minutes||t.minute||t.m||0,o=t.seconds||t.second||t.s||0,u=t.milliseconds||t.millisecond||t.ms||0;this._input=t,this._milliseconds=u+1e3*o+6e4*a+36e5*r,this._days=i+7*s,this._months=n+12*e,this._data={},this._bubble()}function a(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function o(t){return 0>t?Math.ceil(t):Math.floor(t)}function u(t,e){for(var n=t+"";n.length<e;)n="0"+n;return n}function h(t,e,n,s){var i,r,a=e._milliseconds,o=e._days,u=e._months;a&&t._d.setTime(+t._d+a*n),(o||u)&&(i=t.minute(),r=t.hour()),o&&t.date(t.date()+o*n),u&&t.month(t.month()+u*n),a&&!s&&H.updateOffset(t),(o||u)&&(t.minute(i),t.hour(r))}function d(t){return"[object Array]"===Object.prototype.toString.call(t)}function c(t,e){var n,s=Math.min(t.length,e.length),i=Math.abs(t.length-e.length),r=0;for(n=0;s>n;n++)~~t[n]!==~~e[n]&&r++;return r+i}function f(t){return t?ie[t]||t.toLowerCase().replace(/(.)s$/,"$1"):t}function l(t,e){return e.abbr=t,x[t]||(x[t]=new s),x[t].set(e),x[t]}function _(t){if(!t)return H.fn._lang;if(!x[t]&&A)try{require("./lang/"+t)}catch(e){return H.fn._lang}return x[t]}function m(t){return t.match(/\[.*\]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function y(t){var e,n,s=t.match(E);for(e=0,n=s.length;n>e;e++)s[e]=ue[s[e]]?ue[s[e]]:m(s[e]);return function(i){var r="";for(e=0;n>e;e++)r+=s[e]instanceof Function?s[e].call(i,t):s[e];return r}}function M(t,e){function n(e){return t.lang().longDateFormat(e)||e}for(var s=5;s--&&N.test(e);)e=e.replace(N,n);return re[e]||(re[e]=y(e)),re[e](t)}function g(t,e){switch(t){case"DDDD":return V;case"YYYY":return X;case"YYYYY":return $;case"S":case"SS":case"SSS":case"DDD":return I;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return R;case"a":case"A":return _(e._l)._meridiemParse;case"X":return B;case"Z":case"ZZ":return j;case"T":return q;case"MM":case"DD":case"YY":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":return J;default:return new RegExp(t.replace("\\",""))}}function p(t){var e=(j.exec(t)||[])[0],n=(e+"").match(ee)||["-",0,0],s=+(60*n[1])+~~n[2];return"+"===n[0]?-s:s}function D(t,e,n){var s,i=n._a;switch(t){case"M":case"MM":i[1]=null==e?0:~~e-1;break;case"MMM":case"MMMM":s=_(n._l).monthsParse(e),null!=s?i[1]=s:n._isValid=!1;break;case"D":case"DD":case"DDD":case"DDDD":null!=e&&(i[2]=~~e);break;case"YY":i[0]=~~e+(~~e>68?1900:2e3);break;case"YYYY":case"YYYYY":i[0]=~~e;break;case"a":case"A":n._isPm=_(n._l).isPM(e);break;case"H":case"HH":case"h":case"hh":i[3]=~~e;break;case"m":case"mm":i[4]=~~e;break;case"s":case"ss":i[5]=~~e;break;case"S":case"SS":case"SSS":i[6]=~~(1e3*("0."+e));break;case"X":n._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":n._useUTC=!0,n._tzm=p(e)}null==e&&(n._isValid=!1)}function Y(t){var e,n,s=[];if(!t._d){for(e=0;7>e;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];s[3]+=~~((t._tzm||0)/60),s[4]+=~~((t._tzm||0)%60),n=new Date(0),t._useUTC?(n.setUTCFullYear(s[0],s[1],s[2]),n.setUTCHours(s[3],s[4],s[5],s[6])):(n.setFullYear(s[0],s[1],s[2]),n.setHours(s[3],s[4],s[5],s[6])),t._d=n}}function w(t){var e,n,s=t._f.match(E),i=t._i;for(t._a=[],e=0;e<s.length;e++)n=(g(s[e],t).exec(i)||[])[0],n&&(i=i.slice(i.indexOf(n)+n.length)),ue[s[e]]&&D(s[e],n,t);i&&(t._il=i),t._isPm&&t._a[3]<12&&(t._a[3]+=12),t._isPm===!1&&12===t._a[3]&&(t._a[3]=0),Y(t)}function k(t){var e,n,s,r,o,u=99;for(r=0;r<t._f.length;r++)e=a({},t),e._f=t._f[r],w(e),n=new i(e),o=c(e._a,n.toArray()),n._il&&(o+=n._il.length),u>o&&(u=o,s=n);a(t,s)}function v(t){var e,n=t._i,s=K.exec(n);if(s){for(t._f="YYYY-MM-DD"+(s[2]||" "),e=0;4>e;e++)if(te[e][1].exec(n)){t._f+=te[e][0];break}j.exec(n)&&(t._f+=" Z"),w(t)}else t._d=new Date(n)}function T(e){var n=e._i,s=G.exec(n);n===t?e._d=new Date:s?e._d=new Date(+s[1]):"string"==typeof n?v(e):d(n)?(e._a=n.slice(0),Y(e)):e._d=n instanceof Date?new Date(+n):new Date(n)}function b(t,e,n,s,i){return i.relativeTime(e||1,!!n,t,s)}function S(t,e,n){var s=W(Math.abs(t)/1e3),i=W(s/60),r=W(i/60),a=W(r/24),o=W(a/365),u=45>s&&["s",s]||1===i&&["m"]||45>i&&["mm",i]||1===r&&["h"]||22>r&&["hh",r]||1===a&&["d"]||25>=a&&["dd",a]||45>=a&&["M"]||345>a&&["MM",W(a/30)]||1===o&&["y"]||["yy",o];return u[2]=e,u[3]=t>0,u[4]=n,b.apply({},u)}function F(t,e,n){var s,i=n-e,r=n-t.day();return r>i&&(r-=7),i-7>r&&(r+=7),s=H(t).add("d",r),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function O(t){var e=t._i,n=t._f;return null===e||""===e?null:("string"==typeof e&&(t._i=e=_().preparse(e)),H.isMoment(e)?(t=a({},e),t._d=new Date(+e._d)):n?d(n)?k(t):w(t):T(t),new i(t))}function z(t,e){H.fn[t]=H.fn[t+"s"]=function(t){var n=this._isUTC?"UTC":"";return null!=t?(this._d["set"+n+e](t),H.updateOffset(this),this):this._d["get"+n+e]()}}function C(t){H.duration.fn[t]=function(){return this._data[t]}}function L(t,e){H.duration.fn["as"+t]=function(){return+this/e}}for(var H,P,U="2.1.0",W=Math.round,x={},A="undefined"!=typeof module&&module.exports,G=/^\/?Date\((\-?\d+)/i,Z=/(\-)?(\d*)?\.?(\d+)\:(\d+)\:(\d+)\.?(\d{3})?/,E=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g,N=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,J=/\d\d?/,I=/\d{1,3}/,V=/\d{3}/,X=/\d{1,4}/,$=/[+\-]?\d{1,6}/,R=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,j=/Z|[\+\-]\d\d:?\d\d/i,q=/T/i,B=/[\+\-]?\d+(\.\d{1,3})?/,K=/^\s*\d{4}-\d\d-\d\d((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/,Q="YYYY-MM-DDTHH:mm:ssZ",te=[["HH:mm:ss.S",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],ee=/([\+\-]|\d\d)/gi,ne="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),se={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},ie={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",w:"week",M:"month",y:"year"},re={},ae="DDD w W M D d".split(" "),oe="M D H h m s w W".split(" "),ue={M:function(){return this.month()+1},MMM:function(t){return this.lang().monthsShort(this,t)},MMMM:function(t){return this.lang().months(this,t)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(t){return this.lang().weekdaysMin(this,t)},ddd:function(t){return this.lang().weekdaysShort(this,t)},dddd:function(t){return this.lang().weekdays(this,t)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return u(this.year()%100,2)},YYYY:function(){return u(this.year(),4)},YYYYY:function(){return u(this.year(),5)},gg:function(){return u(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return u(this.weekYear(),5)},GG:function(){return u(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return u(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return~~(this.milliseconds()/100)},SS:function(){return u(~~(this.milliseconds()/10),2)},SSS:function(){return u(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(~~(t/60),2)+":"+u(~~t%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(~~(10*t/6),4)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()}};ae.length;)P=ae.pop(),ue[P+"o"]=n(ue[P],P);for(;oe.length;)P=oe.pop(),ue[P+P]=e(ue[P],2);for(ue.DDDD=e(ue.DDD,3),s.prototype={set:function(t){var e,n;for(n in t)e=t[n],"function"==typeof e?this[n]=e:this["_"+n]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,n,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(n=H([2e3,e]),s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,n,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(n=H([2e3,1]).day(e),s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase()[0]},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var n=this._calendar[t];return"function"==typeof n?n.apply(e):n},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,n,s){var i=this._relativeTime[n];return"function"==typeof i?i(t,e,n,s):i.replace(/%d/i,t)},pastFuture:function(t,e){var n=this._relativeTime[t>0?"future":"past"];return"function"==typeof n?n(e):n.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return F(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6}},H=function(t,e,n){return O({_i:t,_f:e,_l:n,_isUTC:!1})},H.utc=function(t,e,n){return O({_useUTC:!0,_isUTC:!0,_l:n,_i:t,_f:e})},H.unix=function(t){return H(1e3*t)},H.duration=function(t,e){var n,s,i=H.isDuration(t),a="number"==typeof t,o=i?t._input:a?{}:t,u=Z.exec(t);return a?e?o[e]=t:o.milliseconds=t:u&&(n="-"===u[1]?-1:1,o={y:0,d:~~u[2]*n,h:~~u[3]*n,m:~~u[4]*n,s:~~u[5]*n,ms:~~u[6]*n}),s=new r(o),i&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},H.version=U,H.defaultFormat=Q,H.updateOffset=function(){},H.lang=function(t,e){return t?(e?l(t,e):x[t]||_(t),H.duration.fn._lang=H.fn._lang=_(t),void 0):H.fn._lang._abbr},H.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),_(t)},H.isMoment=function(t){return t instanceof i},H.isDuration=function(t){return t instanceof r},H.fn=i.prototype={clone:function(){return H(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){return M(H(this).utc(),"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var t=this;return[t.year(),t.month(),t.date(),t.hours(),t.minutes(),t.seconds(),t.milliseconds()]},isValid:function(){return null==this._isValid&&(this._isValid=this._a?!c(this._a,(this._isUTC?H.utc(this._a):H(this._a)).toArray()):!isNaN(this._d.getTime())),!!this._isValid},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=M(this,t||H.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var n;return n="string"==typeof t?H.duration(+e,t):H.duration(t,e),h(this,n,1),this},subtract:function(t,e){var n;return n="string"==typeof t?H.duration(+e,t):H.duration(t,e),h(this,n,-1),this},diff:function(t,e,n){var s,i,r=this._isUTC?H(t).zone(this._offset||0):H(t).local(),a=6e4*(this.zone()-r.zone());return e=f(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),i=12*(this.year()-r.year())+(this.month()-r.month()),i+=(this-H(this).startOf("month")-(r-H(r).startOf("month")))/s,i-=6e4*(this.zone()-H(this).startOf("month").zone()-(r.zone()-H(r).startOf("month").zone()))/s,"year"===e&&(i/=12)):(s=this-r,i="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),n?i:o(i)},from:function(t,e){return H.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(H(),t)},calendar:function(){var t=this.diff(H().startOf("day"),"days",!0),e=-6>t?"sameElse":-1>t?"lastWeek":0>t?"lastDay":1>t?"sameDay":2>t?"nextDay":7>t?"nextWeek":"sameElse";return this.format(this.lang().calendar(e,this))},isLeapYear:function(){var t=this.year();return 0===t%4&&0!==t%100||0===t%400},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(t){var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?"string"==typeof t&&(t=this.lang().weekdaysParse(t),"number"!=typeof t)?this:this.add({d:t-e}):e},month:function(t){var e,n=this._isUTC?"UTC":"";return null!=t?"string"==typeof t&&(t=this.lang().monthsParse(t),"number"!=typeof t)?this:(e=this.date(),this.date(1),this._d["set"+n+"Month"](t),this.date(Math.min(e,this.daysInMonth())),H.updateOffset(this),this):this._d["get"+n+"Month"]()},startOf:function(t){switch(t=f(t)){case"year":this.month(0);case"month":this.date(1);case"week":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),this},endOf:function(t){return this.startOf(t).add(t,1).subtract("ms",1)},isAfter:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)>+H(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+H(t).startOf(e)},isSame:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)===+H(t).startOf(e)},min:function(t){return t=H.apply(null,arguments),this>t?this:t},max:function(t){return t=H.apply(null,arguments),t>this?this:t},zone:function(t){var e=this._offset||0;return null==t?this._isUTC?e:this._d.getTimezoneOffset():("string"==typeof t&&(t=p(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,e!==t&&h(this,H.duration(e-t,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},daysInMonth:function(){return H.utc([this.year(),this.month()+1,0]).date()},dayOfYear:function(t){var e=W((H(this).startOf("day")-H(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},weekYear:function(t){var e=F(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=F(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=F(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this._d.getDay()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},lang:function(e){return e===t?this._lang:(this._lang=_(e),this)}},P=0;P<ne.length;P++)z(ne[P].toLowerCase().replace(/s$/,""),ne[P]);z("year","FullYear"),H.fn.days=H.fn.day,H.fn.months=H.fn.month,H.fn.weeks=H.fn.week,H.fn.isoWeeks=H.fn.isoWeek,H.fn.toJSON=H.fn.toISOString,H.duration.fn=r.prototype={_bubble:function(){var t,e,n,s,i=this._milliseconds,r=this._days,a=this._months,u=this._data;u.milliseconds=i%1e3,t=o(i/1e3),u.seconds=t%60,e=o(t/60),u.minutes=e%60,n=o(e/60),u.hours=n%24,r+=o(n/24),u.days=r%30,a+=o(r/30),u.months=a%12,s=o(a/12),u.years=s},weeks:function(){return o(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+2592e6*(this._months%12)+31536e6*~~(this._months/12)},humanize:function(t){var e=+this,n=S(e,!t,this.lang());return t&&(n=this.lang().pastFuture(e,n)),this.lang().postformat(n)},add:function(t,e){var n=H.duration(t,e);return this._milliseconds+=n._milliseconds,this._days+=n._days,this._months+=n._months,this._bubble(),this},subtract:function(t,e){var n=H.duration(t,e);return this._milliseconds-=n._milliseconds,this._days-=n._days,this._months-=n._months,this._bubble(),this},get:function(t){return t=f(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=f(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:H.fn.lang};for(P in se)se.hasOwnProperty(P)&&(L(P,se[P]),C(P.toLowerCase()));L("Weeks",6048e5),H.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},H.lang("en",{ordinal:function(t){var e=t%10,n=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),A&&(module.exports=H),"undefined"==typeof ender&&(this.moment=H),"function"==typeof define&&define.amd&&define("moment",[],function(){return H})}.call(this); diff --git a/babsi/babsi-app/.classpath b/babsi/babsi-app/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..0e39364f2ad1ff51dd63427b94ad023842b84207 --- /dev/null +++ b/babsi/babsi-app/.classpath @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> + <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> + <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="gen"/> + <classpathentry kind="src" path="res"/> + <classpathentry exported="true" kind="lib" path="libs/sqlcipher.jar"/> + <classpathentry exported="true" kind="lib" path="libs/guava-r09.jar"/> + <classpathentry exported="true" kind="lib" path="libs/commons-codec.jar"/> + <classpathentry kind="lib" path="libs/shiro-all-1.2.2.jar"/> + <classpathentry kind="output" path="bin/classes"/> +</classpath> diff --git a/babsi/babsi-app/.gitignore b/babsi/babsi-app/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5e56e040ec0902e58df8573adaec65c5da6e9304 --- /dev/null +++ b/babsi/babsi-app/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/medidex/MediDexWeb/.gitignore b/medidex/MediDexWeb/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba --- /dev/null +++ b/medidex/MediDexWeb/.gitignore @@ -0,0 +1 @@ +/target