diff --git a/bigbluebutton-web/COPYING.LESSER b/bigbluebutton-web/COPYING.LESSER old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/INSTALL b/bigbluebutton-web/INSTALL old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/README b/bigbluebutton-web/README deleted file mode 100755 index a0aba6f814893f26da2f010850eb42d849c1db03..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/README +++ /dev/null @@ -1,4 +0,0 @@ - -Testing: -How to run the presentation conversion unit tests. - grails test-app org.bigbluebutton.presentation.imp.* \ No newline at end of file diff --git a/bigbluebutton-web/agi/scripts/meetme.groovy b/bigbluebutton-web/agi/scripts/meetme.groovy deleted file mode 100644 index 30673f19c126641ebba982b8f1f7bd6b333267b8..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/agi/scripts/meetme.groovy +++ /dev/null @@ -1,76 +0,0 @@ - -println "meetme begin" - - -number = channel.getData("conf-getconfno", 10000, 10) -conf = db.firstRow("SELECT * FROM conference WHERE conference_number=$number") -if (conf) println "found one! " + conf.conference_name - -if (conf) { - pin = channel.getData("conf-getpin", 10000) - println pin - println conf.pin - if (pin.toInteger() == conf.pin) { - channel.streamFile("conf-placeintoconf") - channel.exec("Meetme", "$number|dMq") - } else { - channel.streamFile("conf-invalidpin") - } -} else { - channel.streamFile("conf-invalid") -} - -/* -//channel.streamFile("conf-adminmenu") -//channel.streamFile("conf-banned") -//channel.streamFile("conf-enteringno") -//channel.streamFile("conference-call") -//channel.streamFile("conference") -//channel.streamFile("conference-reservations") -//channel.streamFile("conf-errormenu") -channel.streamFile("conf-full") -//channel.streamFile("conf-getchannel") - -channel.streamFile("conf-getpin") -//channel.streamFile("conf-hasentered") -//channel.streamFile("conf-hasjoin") -//channel.streamFile("conf-hasleft") -channel.streamFile("conf-invalid") - -channel.streamFile("confirm-number-is") -//channel.streamFile("conf-kicked") -//channel.streamFile("conf-leaderhasleft") -//channel.streamFile("conf-locked") -//channel.streamFile("conf-lockednow") -//channel.streamFile("conf-muted") -//channel.streamFile("conf-noempty") -//channel.streamFile("conf-onlyone") -//channel.streamFile("conf-onlyperson") -//channel.streamFile("conf-onlypersonleft") -//channel.streamFile("conf-otherinparty") -//channel.streamFile("conf-peopleinconf") - -//channel.streamFile("conf-recordings") -//channel.streamFile("conf-sysop") -//channel.streamFile("conf-sysopreqcancelled") -//channel.streamFile("conf-sysopreq") -channel.streamFile("conf-thereare") -//channel.streamFile("conf-unlockednow") -//channel.streamFile("conf-unmuted") -//channel.streamFile("conf-usermenu") -//channel.streamFile("conf-userswilljoin") -//channel.streamFile("conf-userwilljoin") -channel.streamFile("conf-waitforleader") -channel.streamFile("conf-youareinconfnum") -*/ - -println "meetme end" - - -def getDigits(int number) { - StringBuffer sb = new StringBuffer() - for (int t = 0; t < number; t++) { - sb.append(channel.waitForDigit(10000)) - } - return sb.toString() -} \ No newline at end of file diff --git a/bigbluebutton-web/application.properties b/bigbluebutton-web/application.properties index 406c03513cab1a12824047d47a6ae73a00ef67d4..611530e147f9de0911f09858bb2c111aa8913528 100755 --- a/bigbluebutton-web/application.properties +++ b/bigbluebutton-web/application.properties @@ -1,7 +1,6 @@ #Grails Metadata file -#Thu Jun 06 12:32:30 PDT 2013 -app.grails.version=1.3.9 +#Tue Feb 25 00:47:48 UTC 2014 +app.grails.version=2.3.6 app.name=bigbluebutton -app.servlet.version=2.4 -app.version=0.70dev -plugins.tomcat=1.3.9 +app.servlet.version=3.0 +app.version=0.1 diff --git a/bigbluebutton-web/bigbluebutton.launch b/bigbluebutton-web/bigbluebutton.launch deleted file mode 100644 index 99e07b1b16cad9c5e1971953857572334f0cf3d3..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/bigbluebutton.launch +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/bigbluebutton"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="4"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> -<listEntry value="<?xml version="1.0" encoding="UTF-8"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="bigbluebutton" path="1" type="4"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8"?> <runtimeClasspathEntry containerPath="GRAILS_HOME/dist/grails-bootstrap-1.1.1.jar" path="3" type="3"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8"?> <runtimeClasspathEntry containerPath="GRAILS_HOME/lib/groovy-all-1.6.3.jar" path="3" type="3"/> "/> -</listAttribute> -<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="grails.util.GrailsMain"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="bigbluebutton"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dbase.dir="${project_loc:bigbluebutton}" -Dserver.port=8080 -Dgrails.env=development"/> -</launchConfiguration> diff --git a/bigbluebutton-web/bigbluebutton.tmproj b/bigbluebutton-web/bigbluebutton.tmproj deleted file mode 100644 index 0d1709cf93a82675509bcd90b3074313cb5d87da..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/bigbluebutton.tmproj +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>documents</key> - <array> - <dict> - <key>filename</key> - <string>bigbluebutton.launch</string> - </dict> - <dict> - <key>filename</key> - <string>build.xml</string> - </dict> - <dict> - <key>name</key> - <string>grails-app</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>grails-app</string> - </dict> - <dict> - <key>name</key> - <string>test</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>test</string> - </dict> - <dict> - <key>name</key> - <string>lib</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>lib</string> - </dict> - <dict> - <key>name</key> - <string>scripts</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>scripts</string> - </dict> - <dict> - <key>name</key> - <string>src</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>src</string> - </dict> - <dict> - <key>name</key> - <string>web-app</string> - <key>regexFolderFilter</key> - <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string> - <key>sourceDirectory</key> - <string>web-app</string> - </dict> - </array> - <key>fileHierarchyDrawerWidth</key> - <integer>200</integer> - <key>metaData</key> - <dict/> - <key>showFileHierarchyDrawer</key> - <true/> - <key>windowFrame</key> - <string>{{237, 127}, {742, 553}}</string> -</dict> -</plist> diff --git a/bigbluebutton-web/build.gradle b/bigbluebutton-web/build.gradle index 86583ccccf0bb82708395eddc3c5d637c01dceb3..913b7cdea4b2e88b57bac2ca511ce73833670727 100755 --- a/bigbluebutton-web/build.gradle +++ b/bigbluebutton-web/build.gradle @@ -1,10 +1,10 @@ -usePlugin 'java' -usePlugin 'eclipse' +apply plugin: 'java' +apply plugin: 'eclipse' -task resolveDeps(dependsOn: configurations.default.buildArtifacts, type: Copy) { +task resolveDeps(type: Copy) { into('lib') from configurations.default - from configurations.default.allArtifacts*.file + from configurations.default.allArtifacts.file } repositories { @@ -42,9 +42,15 @@ dependencies { compile 'commons-pool:commons-pool:1.5.6' compile 'commons-lang:commons-lang:2.5' compile 'com.google.code.gson:gson:1.7.1' - - compile 'org.springframework.amqp:spring-rabbit:1.2.0.RELEASE@jar' + // Logging +// compile 'ch.qos.logback:logback-core:1.0.9@jar' +// compile 'ch.qos.logback:logback-classic:1.0.9@jar' +// compile 'org.slf4j:log4j-over-slf4j:1.7.2@jar' +// compile 'org.slf4j:jcl-over-slf4j:1.7.2@jar' +// compile 'org.slf4j:jul-to-slf4j:1.7.2@jar' +// compile 'org.slf4j:slf4j-api:1.7.2@jar' + //junit compile 'junit:junit:4.8.2' } diff --git a/bigbluebutton-web/build.xml b/bigbluebutton-web/build.xml deleted file mode 100644 index 07028c0580dc04aab233e248e0f0db85e727d3b2..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/build.xml +++ /dev/null @@ -1,62 +0,0 @@ -<project name="bigbluebutton" default="run"> - - <condition property="grails" value="grails.bat"> - <os family="windows"/> - </condition> - <property name="grails" value="grails" /> - - <!-- ================================= - target: clean - ================================= --> - <target name="clean" description="--> Cleans a Grails application"> - <exec executable="${grails}" failonerror="true"> - <arg value="clean"/> - </exec> - </target> - - <!-- ================================= - target: war - ================================= --> - <target name="war" description="--> Creates a WAR of a Grails application"> - <exec executable="${grails}" failonerror="true"> - <arg value="war"/> - </exec> - </target> - - <!-- ================================= - target: test - ================================= --> - <target name="test" description="--> Run a Grails applications unit tests"> - <exec executable="${grails}" failonerror="true"> - <arg value="test-app"/> - </exec> - </target> - -<!-- ================================= - target: run - ================================= --> - - <!-- Check whether Tomcat is running --> - <target name="check-port-8080" description="Check whether tomcat6 is running"> - <echo message="Checking whether tomcat6 is running before doing 'grails run-app'"/> - <condition property="tomcat.running"> - <socket server="127.0.0.1" port="8080"/> - </condition> - </target> - - <target name="run" depends="check-port-8080" description="--> Run a Grails applications unit tests"> - - <fail message="Detected that tomcat6 is running on port 8080. Stop tomcat6 then try again." if="tomcat.running" /> - <echo message="Running grails ..." /> - <exec executable="${grails}" failonerror="true"> - <arg value="run-app"/> - </exec> - </target> - - <!-- ================================= - target: deploy - ================================= --> - <target name="deploy" depends="war" description="--> The deploy target (initially empty)"> - <!-- TODO --> - </target> -</project> diff --git a/bigbluebutton-web/grails-app/conf/ApplicationResources.groovy b/bigbluebutton-web/grails-app/conf/ApplicationResources.groovy new file mode 100755 index 0000000000000000000000000000000000000000..06b60c71113a74b89593beb66a8c004df7d15687 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/conf/BootStrap.groovy b/bigbluebutton-web/grails-app/conf/BootStrap.groovy index 01746438a1f5ffe65b7cfd7fb78fe1cea3e2608e..1287daee1d8fdd06938bcf2d28c6faab96489ddd 100755 --- a/bigbluebutton-web/grails-app/conf/BootStrap.groovy +++ b/bigbluebutton-web/grails-app/conf/BootStrap.groovy @@ -1,30 +1,7 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - - class BootStrap { - def jmsContainer - - def init = { servletContext -> - log.debug "Bootstrapping bbb-web" - } - - def destroy = { - } -} + + def init = { servletContext -> + } + def destroy = { + } +} diff --git a/bigbluebutton-web/grails-app/conf/BuildConfig.groovy b/bigbluebutton-web/grails-app/conf/BuildConfig.groovy index 037f40a0a30c62352edc10e78a741a2c362a0909..cdd09b68b47db88acb33e62f64907e7014cec60a 100755 --- a/bigbluebutton-web/grails-app/conf/BuildConfig.groovy +++ b/bigbluebutton-web/grails-app/conf/BuildConfig.groovy @@ -1,35 +1,72 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - - -// This closure is to enable logging in production. -// This closure is passed the location of the staging directory that -// is zipped up to make the WAR file, and the command line arguments. -// Here we copy over oug log4j.properties file while the web.xml is -// overridden from what's in src/templates/war/web.xml. -// (ralam, jan 7, 2010) -grails.war.resources = {stagingDir, args -> - //println '*** Copying our custom web.xml and log4j.properties as workaround for logging problem. ***' - //println '*** Copying our custom web.xml as workaround for logging problem. ***' - //copy(file: "grails-app/conf/custom-web.xml", tofile: "${stagingDir}/WEB-INF/web.xml") - println '*** Copying our custom log4j.properties as workaround for logging problem. ***' - copy(file: "grails-app/conf/log4j.properties", tofile: "${stagingDir}/WEB-INF/classes/log4j.properties") -} - - +grails.servlet.version = "3.0" // 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.work.dir = "target/work" +grails.project.target.level = 1.6 +grails.project.source.level = 1.6 +//grails.project.war.file = "target/${appName}-${appVersion}.war" + +grails.project.fork = [ + // configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required + // compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true], + + // configure settings for the test-app JVM, uses the daemon by default + test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true], + // configure settings for the run-app JVM + run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false], + // configure settings for the run-war JVM + war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false], + // configure settings for the Console UI JVM + console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256] +] + +grails.project.dependency.resolver = "maven" // or ivy +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 + + grailsPlugins() + grailsHome() + mavenLocal() + grailsCentral() + mavenCentral() + // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories + //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.24' + } + + plugins { + // plugins for the build system only + build ":tomcat:7.0.42" + + // plugins for the compile step + compile ":scaffolding:2.0.0" + compile ':cache:1.1.1' + + // plugins needed at runtime but not for compilation + runtime ":hibernate:3.6.10.1" // or ":hibernate4:4.1.11.1" + runtime ":database-migration:1.3.5" + runtime ":jquery:1.10.2" + runtime ":resources:1.2" + // Uncomment these (or add new ones) to enable additional resources capabilities + //runtime ":zipped-resources:1.0.1" + //runtime ":cached-resources:1.1" + //runtime ":yui-minify-resources:0.1.5" + } +} diff --git a/bigbluebutton-web/grails-app/conf/Config.groovy b/bigbluebutton-web/grails-app/conf/Config.groovy index d7c1114358d8d075b8317c48293b226473dbf71c..6e7b67a76ed86d828a3dddff4b857879a68b562b 100755 --- a/bigbluebutton-web/grails-app/conf/Config.groovy +++ b/bigbluebutton-web/grails-app/conf/Config.groovy @@ -1,99 +1,117 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - -// locations to search for config files that get merged into the main config -// config files can either be Java properties files or ConfigSlurper scripts +// 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"] -grails.config.locations = [ "classpath:bigbluebutton.properties"] -// grails.config.locations = [ "classpath:bigbluebutton.properties"] -// if(System.properties["${appName}.config.location"]) { +// if (System.properties["${appName}.config.location"]) { // grails.config.locations << "file:" + System.properties["${appName}.config.location"] // } -grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format -grails.mime.types = [ html: ['text/html','application/xhtml+xml'], - xml: ['text/xml', 'application/xml'], - text: 'text-plain', - js: 'text/javascript', - rss: 'application/rss+xml', - atom: 'application/atom+xml', - css: 'text/css', - csv: 'text/csv', - all: '*/*', - json: ['application/json','text/json'], - form: 'application/x-www-form-urlencoded', - multipartForm: 'multipart/form-data' - ] -// 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" +grails.config.locations = [ "classpath:bigbluebutton.properties"] + +grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination + +// The ACCEPT header will not be used for content negotiation for user agents containing the following strings (defaults to the 4 major rendering engines) +grails.mime.disable.accept.header.userAgents = ['Gecko', 'WebKit', 'Presto', 'Trident'] +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', + hal: ['application/hal+json','application/hal+xml'], + 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/*'] + +// Legacy setting for codec used to encode data with ${} +grails.views.default.codec = "html" + +// The default scope for controllers. May be prototype, session or singleton. +// If unspecified, controllers are prototype scoped. +grails.controllers.defaultScope = 'singleton' +// GSP settings +grails { + views { + gsp { + encoding = 'UTF-8' + htmlcodec = 'xml' // use xml escaping instead of HTML4 escaping + codecs { + expression = 'html' // escapes values inside ${} + scriptlet = 'html' // escapes output from scriptlets in GSPs + taglib = 'none' // escapes output from taglibs + staticparts = 'none' // escapes output from static template parts + } + } + // escapes all not-encoded output at final stage of outputting + filteringCodecForContentType { + //'text/html' = 'html' + } + } +} + +grails.converters.encoding = "UTF-8" +// 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.serverURL = "http://localhost:8080" - } - production { - grails.serverURL = "http://localhost:8080" - } - test { - } + grails.logging.jul.usebridge = true + } + production { + grails.logging.jul.usebridge = false + // TODO: grails.serverURL = "http://www.changeme.com" + } } -// Use own log4j.properties for logging as it seems there is a -// problem with logging on production using the DSL. This works -// ok when ran using "grails run-war" -// (ralam - jan 7, 2010) - -//log4j configuration +// log4j configuration log4j = { - appenders { - rollingFile name:'logfileAppender', maxFileSize:500000, file:"/tmp/bbb-web.log" - console name:'consoleAppender', layout:pattern(conversionPattern: '%d{[dd.MM.yy HH:mm:ss.SSS]} %-5p %c %x - %m%n') - } - - root { - warn 'logfileAppender', 'consoleAppender' - additivity = true - } + // Example of changing the log pattern for the default console appender: + // + //appenders { + // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n') + //} - warn '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', - 'org.mortbay.log' - debug 'grails.app', - 'org.bigbluebutton' - -// additivity.StackTrace=false + 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' + debug 'org.bigbluebutton' } - diff --git a/bigbluebutton-web/grails-app/conf/DataSource.groovy b/bigbluebutton-web/grails-app/conf/DataSource.groovy old mode 100644 new mode 100755 index 91143e70f09b699cfc8a31a95e33fee6f16681c3..c8e376070aa20901da285106e7593cc4f1099419 --- a/bigbluebutton-web/grails-app/conf/DataSource.groovy +++ b/bigbluebutton-web/grails-app/conf/DataSource.groovy @@ -1,32 +1,45 @@ dataSource { pooled = true - driverClassName = "org.hsqldb.jdbcDriver" + driverClassName = "org.h2.Driver" username = "sa" password = "" } hibernate { cache.use_second_level_cache = true - cache.use_query_cache = true - cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' + cache.use_query_cache = false + cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 +// cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4 } + // environment specific settings environments { development { dataSource { - dbCreate = "create-drop" // one of 'create', 'create-drop','update' - url = "jdbc:hsqldb:mem:devDB" + dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' + url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000" } } test { dataSource { dbCreate = "update" - url = "jdbc:hsqldb:mem:testDb" + url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000" } } production { dataSource { dbCreate = "update" - url = "jdbc:hsqldb:file:prodDb;shutdown=true" + url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000" + properties { + maxActive = -1 + minEvictableIdleTimeMillis=1800000 + timeBetweenEvictionRunsMillis=1800000 + numTestsPerEvictionRun=3 + testOnBorrow=true + testWhileIdle=true + testOnReturn=false + validationQuery="SELECT 1" + jdbcInterceptors="ConnectionState" + } } } } diff --git a/bigbluebutton-web/grails-app/conf/UrlMappings.groovy b/bigbluebutton-web/grails-app/conf/UrlMappings.groovy index b0aed3fa11392008051f346966d83f39b2d1b89d..b778fa5b385ea36af854de88f1f5ecea8ad05f2b 100755 --- a/bigbluebutton-web/grails-app/conf/UrlMappings.groovy +++ b/bigbluebutton-web/grails-app/conf/UrlMappings.groovy @@ -1,73 +1,53 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - -class UrlMappings { - static mappings = { - - "/presentation/upload"(controller:"presentation") { - action = [GET:'show', POST:'upload', DELETE:'delete'] - } - - "/presentation/test-convert"(controller:"presentation") { - action = [GET:'testConversion'] - } - - "/presentation/$conference/$room/$presentation_name/slides"(controller:"presentation") { - action = [GET:'numberOfSlides'] - } - - "/presentation/$conference/$room/$presentation_name/slide/$id"(controller:"presentation") { - action = [GET:'showSlide'] - } - - "/presentation/$conference/$room/$presentation_name/thumbnails"(controller:"presentation") { - action = [GET:'numberOfThumbnails'] - } - - "/presentation/$conference/$room/$presentation_name/thumbnail/$id"(controller:"presentation") { - action = [GET:'showThumbnail'] - } - - "/presentation/$conference/$room/$presentation_name/textfiles"(controller:"presentation") { - action = [GET:'numberOfTextfiles'] - } - - "/presentation/$conference/$room/$presentation_name/textfile/$id"(controller:"presentation") { - action = [GET:'showTextfile'] - } - - "/api/setConfigXML"(controller:"api") { - action = [POST:'setConfigXML'] - } - - "/api/setPollXML"(controller:"api") { - action = [POST:'setPollXML'] - } - - "/$controller/$action?/$id?"{ - constraints { - // apply constraints here - } - } - "500"(view:'/error') - - "/" (controller: 'conference', action: 'list') - - } -} +class UrlMappings { + + static mappings = { + "/presentation/upload"(controller:"presentation") { + action = [GET:'show', POST:'upload', DELETE:'delete'] + } + + "/presentation/test-convert"(controller:"presentation") { + action = [GET:'testConversion'] + } + + "/presentation/$conference/$room/$presentation_name/slides"(controller:"presentation") { + action = [GET:'numberOfSlides'] + } + + "/presentation/$conference/$room/$presentation_name/slide/$id"(controller:"presentation") { + action = [GET:'showSlide'] + } + + "/presentation/$conference/$room/$presentation_name/thumbnails"(controller:"presentation") { + action = [GET:'numberOfThumbnails'] + } + + "/presentation/$conference/$room/$presentation_name/thumbnail/$id"(controller:"presentation") { + action = [GET:'showThumbnail'] + } + + "/presentation/$conference/$room/$presentation_name/textfiles"(controller:"presentation") { + action = [GET:'numberOfTextfiles'] + } + + "/presentation/$conference/$room/$presentation_name/textfile/$id"(controller:"presentation") { + action = [GET:'showTextfile'] + } + + "/api/setConfigXML"(controller:"api") { + action = [POST:'setConfigXML'] + } + + "/api/setPollXML"(controller:"api") { + action = [POST:'setPollXML'] + } + + "/$controller/$action?/$id?(.${format})?"{ + constraints { + // apply constraints here + } + } + + "/"(view:"/index") + "500"(view:'/error') + } +} diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties index 153ad161da089dda43d47214d8cea005046350fe..597a5cadc0482e6edf4cd1ea15abc16699ee2125 100755 --- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties +++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties @@ -1,180 +1,180 @@ -# -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -# -# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -# - -# -# These are the default properites for BigBlueButton Web application - -#---------------------------------------------------- -# Directory where BigBlueButton stores uploaded slides -presentationDir=/var/bigbluebutton - -#---------------------------------------------------- -# Directory where SWFTOOLS (pdf2swf, jpeg2swf, png2swf) are located -swfToolsDir=/bin - -#---------------------------------------------------- -# Directory where ImageMagick's convert executable is located -imageMagickDir=/usr/bin - -#---------------------------------------------------- -# Use fullpath to ghostscript executable since the exec names are different -# for each platform. -ghostScriptExec=/usr/bin/gs - -#---------------------------------------------------- -# Fonts directory passed into PDF2SWF to support highlighting of texts -# in the SWF slides. -fontsDir=/usr/share/fonts - -#---------------------------------------------------- -# This is a workaround for a problem converting PDF files, referenced at -# http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/c2e264ca76534ce0?pli=1 -noPdfMarkWorkaround=/etc/bigbluebutton/nopdfmark.ps - -#---------------------------------------------------- -# These will be copied in cases where the conversion process -# fails to generate a slide from the uploaded presentation -BLANK_SLIDE=/var/bigbluebutton/blank/blank-slide.swf -BLANK_THUMBNAIL=/var/bigbluebutton/blank/blank-thumb.png - -#---------------------------------------------------- -# Number of minutes the conversion should take. If it takes -# more than this time, cancel the conversion process. -maxConversionTime=5 - -#---------------------------------------------------- -# Maximum number of pages allowed for an uploaded presentation (default 100). -maxNumPages=200 - -#---------------------------------------------------- -# Maximum swf file size for load to the client (default 500000). -MAX_SWF_FILE_SIZE=500000 - -# Default number of digits for voice conference users joining through the PSTN. -defaultNumDigitsForTelVoice=5 - -#---------------------------------------------------- -# Default dial access number -defaultDialAccessNumber=613-555-1234 - -#---------------------------------------------------- -# Default welcome message to display when the participant joins the web -# conference. This is only used for the old scheduling which will be -# removed in the future. Use the API to create a conference. -defaultWelcomeMessage=<br>Welcome to <b>%%CONFNAME%%</b>!<br><br>For help on using BigBlueButton see these (short) <a href="event:http://www.bigbluebutton.org/content/videos"><u>tutorial videos</u></a>.<br><br>To join the audio bridge click the headset icon (upper-left hand corner). Use a headset to avoid causing background noise for others.<br> -defaultWelcomeMessageFooter=This server is running <a href="https://code.google.com/p/bigbluebutton/wiki/081Overview" target="_blank"><u>BigBlueButton 0.81</u></a>. - -# Default maximum number of users a meeting can have. -# Doesn't get enforced yet but is the default value when the create -# API doesn't pass a value. -defaultMaxUsers=20 - -# Default duration of the meeting in minutes. -# Current default is 0 (meeting doesn't end). -defaultMeetingDuration=0 - -# Remove the meeting from memory when the end API is called. -# This allows 3rd-party apps to recycle the meeting right-away -# instead of waiting for the meeting to expire (see below). -removeMeetingWhenEnded=true - -# The number of minutes before the system removes the meeting from memory. -defaultMeetingExpireDuration=1 - -# The number of minutes the system waits when a meeting is created and when -# a user joins. If after this period, a user hasn't joined, the meeting is -# removed from memory. -defaultMeetingCreateJoinDuration=5 - -# Disable recording by default. -# true - don't record even if record param in the api call is set to record -# false - when record param is passed from api, override this default -disableRecordingDefault=false - -#---------------------------------------------------- -# This URL is where the BBB client is accessible. When a user sucessfully -# enters a name and password, she is redirected here to load the client. -bigbluebutton.web.serverURL=http://192.168.153.139 - -#---------------------------------------------------- -# Assign URL where the logged-out participant will be redirected after sign-out. -# If "default", it returns to bigbluebutton.web.serverURL -bigbluebutton.web.logoutURL=default - -# The url of the BigBlueButton client. User's will be redirected here when -# successfully joining the meeting. -defaultClientUrl=${bigbluebutton.web.serverURL}/client/BigBlueButton.html -#defaultClientUrl=http://192.168.0.235/3rd-party.html - -# The default avatar image to display if nothing is passed on the JOIN API (avatarURL) -# call. This avatar is displayed if the user isn't sharing the webcam and -# the option (displayAvatar) is enabled in config.xml -defaultAvatarURL=${bigbluebutton.web.serverURL}/client/avatar.png - -# The URL of the default configuration -defaultConfigURL=${bigbluebutton.web.serverURL}/client/conf/config.xml - -apiVersion=0.81 - -# Salt which is used by 3rd-party apps to authenticate api calls -securitySalt=873b4c35e992f3e54c374412082934b6 - -# Directory where we drop the <meeting-id-recorded>.done file -recordStatusDir=/var/bigbluebutton/recording/status/recorded - -redisHost=127.0.0.1 -redisPort=6379 - -# The directory where the published/unpublised recordings are located. This is for -# the get recording* api calls -publishedDir=/var/bigbluebutton/published -unpublishedDir=/var/bigbluebutton/unpublished - -# If the API is enabled. -serviceEnabled = true - -# Test voiceBridge number -testVoiceBridge=99999 -testConferenceMock=conference-mock-default - -#------------------------------------------------------ -# These properties are used to test the conversion process. -# Conference name folder in ${presentationDir} (see above) -beans.presentationService.testConferenceMock=${testConferenceMock} - -# Conference room folder in ${presentationDir}/${testConferenceMock} -beans.presentationService.testRoomMock=conference-mock-default -# Uploaded presentation name -beans.presentationService.testPresentationName=appkonference -# Uploaded presentation file -beans.presentationService.testUploadedPresentation=appkonference.txt -# Default Uploaded presentation file -beans.presentationService.defaultUploadedPresentation=${bigbluebutton.web.serverURL}/default.pdf - -#---------------------------------------------------- -# Inject values into grails service beans -beans.presentationService.presentationDir=${presentationDir} - -#---------------------------------------------------- -# Specify which IPs can do cross domain requests -accessControlAllowOrigin=${bigbluebutton.web.serverURL} - -#---------------------------------------------------- -# The lapsus of seconds for polling the BBB Server in order to check if it's down. -# After 5 tries if there isn't response, it will be declared down -checkBBBServerEvery=10 \ No newline at end of file +# +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +# +# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +# + +# +# These are the default properites for BigBlueButton Web application + +#---------------------------------------------------- +# Directory where BigBlueButton stores uploaded slides +presentationDir=/var/bigbluebutton + +#---------------------------------------------------- +# Directory where SWFTOOLS (pdf2swf, jpeg2swf, png2swf) are located +swfToolsDir=/bin + +#---------------------------------------------------- +# Directory where ImageMagick's convert executable is located +imageMagickDir=/usr/bin + +#---------------------------------------------------- +# Use fullpath to ghostscript executable since the exec names are different +# for each platform. +ghostScriptExec=/usr/bin/gs + +#---------------------------------------------------- +# Fonts directory passed into PDF2SWF to support highlighting of texts +# in the SWF slides. +fontsDir=/usr/share/fonts + +#---------------------------------------------------- +# This is a workaround for a problem converting PDF files, referenced at +# http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/c2e264ca76534ce0?pli=1 +noPdfMarkWorkaround=/etc/bigbluebutton/nopdfmark.ps + +#---------------------------------------------------- +# These will be copied in cases where the conversion process +# fails to generate a slide from the uploaded presentation +BLANK_SLIDE=/var/bigbluebutton/blank/blank-slide.swf +BLANK_THUMBNAIL=/var/bigbluebutton/blank/blank-thumb.png + +#---------------------------------------------------- +# Number of minutes the conversion should take. If it takes +# more than this time, cancel the conversion process. +maxConversionTime=5 + +#---------------------------------------------------- +# Maximum number of pages allowed for an uploaded presentation (default 100). +maxNumPages=200 + +#---------------------------------------------------- +# Maximum swf file size for load to the client (default 500000). +MAX_SWF_FILE_SIZE=500000 + +# Default number of digits for voice conference users joining through the PSTN. +defaultNumDigitsForTelVoice=5 + +#---------------------------------------------------- +# Default dial access number +defaultDialAccessNumber=613-555-1234 + +#---------------------------------------------------- +# Default welcome message to display when the participant joins the web +# conference. This is only used for the old scheduling which will be +# removed in the future. Use the API to create a conference. +defaultWelcomeMessage=<br>Welcome to <b>%%CONFNAME%%</b>!<br><br>For help on using BigBlueButton see these (short) <a href="event:http://www.bigbluebutton.org/content/videos"><u>tutorial videos</u></a>.<br><br>To join the audio bridge click the headset icon (upper-left hand corner). Use a headset to avoid causing background noise for others.<br> +defaultWelcomeMessageFooter=This server is running a <a href="https://code.google.com/p/bigbluebutton/wiki/081Overview" target="_blank"><u>BigBlueButton 0.81-RC</u></a>. + +# Default maximum number of users a meeting can have. +# Doesn't get enforced yet but is the default value when the create +# API doesn't pass a value. +defaultMaxUsers=20 + +# Default duration of the meeting in minutes. +# Current default is 0 (meeting doesn't end). +defaultMeetingDuration=0 + +# Remove the meeting from memory when the end API is called. +# This allows 3rd-party apps to recycle the meeting right-away +# instead of waiting for the meeting to expire (see below). +removeMeetingWhenEnded=true + +# The number of minutes before the system removes the meeting from memory. +defaultMeetingExpireDuration=1 + +# The number of minutes the system waits when a meeting is created and when +# a user joins. If after this period, a user hasn't joined, the meeting is +# removed from memory. +defaultMeetingCreateJoinDuration=5 + +# Disable recording by default. +# true - don't record even if record param in the api call is set to record +# false - when record param is passed from api, override this default +disableRecordingDefault=false + +#---------------------------------------------------- +# This URL is where the BBB client is accessible. When a user sucessfully +# enters a name and password, she is redirected here to load the client. +bigbluebutton.web.serverURL=http://192.168.0.150 + +#---------------------------------------------------- +# Assign URL where the logged-out participant will be redirected after sign-out. +# If "default", it returns to bigbluebutton.web.serverURL +bigbluebutton.web.logoutURL=default + +# The url of the BigBlueButton client. User's will be redirected here when +# successfully joining the meeting. +defaultClientUrl=${bigbluebutton.web.serverURL}/client/BigBlueButton.html +#defaultClientUrl=http://192.168.0.235/3rd-party.html + +# The default avatar image to display if nothing is passed on the JOIN API (avatarURL) +# call. This avatar is displayed if the user isn't sharing the webcam and +# the option (displayAvatar) is enabled in config.xml +defaultAvatarURL=${bigbluebutton.web.serverURL}/client/avatar.png + +# The URL of the default configuration +defaultConfigURL=${bigbluebutton.web.serverURL}/client/conf/config.xml + +apiVersion=0.81 + +# Salt which is used by 3rd-party apps to authenticate api calls +securitySalt=0c3eaac5b455b4353ec826fce1657ad8 + +# Directory where we drop the <meeting-id-recorded>.done file +recordStatusDir=/var/bigbluebutton/recording/status/recorded + +redisHost=127.0.0.1 +redisPort=6379 + +# The directory where the published/unpublised recordings are located. This is for +# the get recording* api calls +publishedDir=/var/bigbluebutton/published +unpublishedDir=/var/bigbluebutton/unpublished + +# If the API is enabled. +serviceEnabled = true + +# Test voiceBridge number +testVoiceBridge=99999 +testConferenceMock=conference-mock-default + +#------------------------------------------------------ +# These properties are used to test the conversion process. +# Conference name folder in ${presentationDir} (see above) +beans.presentationService.testConferenceMock=${testConferenceMock} + +# Conference room folder in ${presentationDir}/${testConferenceMock} +beans.presentationService.testRoomMock=conference-mock-default +# Uploaded presentation name +beans.presentationService.testPresentationName=appkonference +# Uploaded presentation file +beans.presentationService.testUploadedPresentation=appkonference.txt +# Default Uploaded presentation file +beans.presentationService.defaultUploadedPresentation=${bigbluebutton.web.serverURL}/default.pdf + +#---------------------------------------------------- +# Inject values into grails service beans +beans.presentationService.presentationDir=${presentationDir} + +#---------------------------------------------------- +# Specify which IPs can do cross domain requests +accessControlAllowOrigin=${bigbluebutton.web.serverURL} + +#---------------------------------------------------- +# The lapsus of seconds for polling the BBB Server in order to check if it's down. +# After 5 tries if there isn't response, it will be declared down +checkBBBServerEvery=10 diff --git a/bigbluebutton-web/grails-app/conf/log4j.properties b/bigbluebutton-web/grails-app/conf/log4j.properties deleted file mode 100755 index 5cd6fa2ece4966ea2b0935b58ed95838beca3af8..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/conf/log4j.properties +++ /dev/null @@ -1,69 +0,0 @@ -# -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -# -# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -# - -# This custom log4j.properties file is a workaround for problem with logging when -# deployed to Tomcat. This goes hand-in-hand with src/templates/war/web.xml -# Taken from /home/firstuser/dev/tools/grails-1.1.1/src/war/WEB-INF/log4j.properties (ralam - jan 6, 2010) -log4j.rootLogger=DEBUG, stdout, logfile - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n - -# Keep 20 days of logs -log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender -log4j.appender.logfile.Append=true -log4j.appender.logfile.File=/var/log/bigbluebutton/bbb-web.log -log4j.appender.logfile.DatePattern='.'yyyy-MM-dd -log4j.appender.logfile.MaxBackupIndex=20 - -# Pattern to output: date priority [category] - message -log4j.appender.logfile.layout=org.apache.log4j.PatternLayout -log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n - - -log4j.logger.org.codehaus.groovy.grails.web.servlet=WARN -log4j.logger.org.codehaus.groovy.grails.web.pages=WARN -log4j.logger.org.codehaus.groovy.grails.web.sitemesh=WARN -log4j.logger.org.codehaus.groovy.grails.web.mapping.filter=WARN -log4j.logger.org.codehaus.groovy.grails.web.mapping=WARN -log4j.logger.org.codehaus.groovy.grails.web.binding=WARN -log4j.logger.org.codehaus.groovy.grails.commons=WARN -log4j.logger.org.codehaus.groovy.grails.plugins=WARN -log4j.logger.org.codehaus.groovy.grails.orm.hibernate=WARN -log4j.logger.org.codehaus.groovy.grails.context.support=WARN - -# Spring -log4j.logger.org.springframework=WARN - -# Hibernate -log4j.logger.org.hibernate=WARN - -# Mortbay -log4j.logger.org.mortbay.log=WARN - -# ActiveMQ -log4j.logger.org.apache.activemq=WARN - -# JSecurity -log4j.logger.org.jsecurity=WARN - -# BigBlueButton -log4j.logger.org.bigbluebutton=DEBUG -log4j.logger.grails.app.controller=DEBUG -log4j.logger.grails.app.service=DEBUG diff --git a/bigbluebutton-web/grails-app/conf/spring/doc-conversion.xml b/bigbluebutton-web/grails-app/conf/spring/doc-conversion.xml index c35361a9c7bba8d1e1a68c24c4802b8e4b419587..818d76710d4352b604acb6974f358a18e11388c1 100755 --- a/bigbluebutton-web/grails-app/conf/spring/doc-conversion.xml +++ b/bigbluebutton-web/grails-app/conf/spring/doc-conversion.xml @@ -1,110 +1,110 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - -BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - -Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). - -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3.0 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - ---> -<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="documentConversionService" class="org.bigbluebutton.presentation.DocumentConversionServiceImp"> - <property name="messagingService" ref="messagingService"/> - <property name="officeToPdfConversionService" ref="officeToPdfConversionService"/> - <property name="pdfToSwfSlidesGenerationService" ref="pdfToSwfSlidesGenerationService"/> - <property name="imageToSwfSlidesGenerationService" ref="imageToSwfSlidesGenerationService"/> - </bean> - - <bean id="officeToPdfConversionService" class="org.bigbluebutton.presentation.imp.OfficeToPdfConversionService"/> - - <bean id="pageExtractor" class="org.bigbluebutton.presentation.imp.GhostscriptPageExtractor"> - <property name="ghostscriptExec" value="${ghostScriptExec}"/> - <property name="noPdfMarkWorkaround" value="${noPdfMarkWorkaround}"/> - </bean> - - <bean id="imageMagickPageConverter" class="org.bigbluebutton.presentation.imp.ImageMagickPageConverter"> - <property name="imageMagickDir" value="${imageMagickDir}"/> - </bean> - - <bean id="png2SwfConverter" class="org.bigbluebutton.presentation.imp.Png2SwfPageConverter"> - <property name="swfToolsDir" value="${swfToolsDir}"/> - </bean> - - <bean id="jpg2SwfConverter" class="org.bigbluebutton.presentation.imp.Jpeg2SwfPageConverter"> - <property name="swfToolsDir" value="${swfToolsDir}"/> - </bean> - - <bean id="pageCounter" class="org.bigbluebutton.presentation.imp.Pdf2SwfPageCounter"> - <property name="swfToolsDir" value="${swfToolsDir}"/> - </bean> - - <bean id="pageCounterService" class="org.bigbluebutton.presentation.imp.PageCounterService"> - <property name="pageCounter" ref="pageCounter"/> - <property name="maxNumPages" value="${maxNumPages}"/> - </bean> - - <bean id="pdf2SwfPageConverter" class="org.bigbluebutton.presentation.imp.Pdf2SwfPageConverter"> - <property name="swfToolsDir" value="${swfToolsDir}"/> - <property name="fontsDir" value="${fontsDir}"/> - </bean> - - <bean id="imageConvSvc" class="org.bigbluebutton.presentation.imp.PdfPageToImageConversionService"> - <property name="pageExtractor" ref="pageExtractor"/> - <property name="pdfToImageConverter" ref="imageMagickPageConverter"/> - <property name="imageToSwfConverter" ref="png2SwfConverter"/> - </bean> - - <bean id="thumbCreator" class="org.bigbluebutton.presentation.imp.ThumbnailCreatorImp"> - <property name="imageMagickDir" value="${imageMagickDir}"/> - <property name="blankThumbnail" value="${BLANK_THUMBNAIL}"/> - </bean> - - <bean id="textFileCreator" class="org.bigbluebutton.presentation.imp.TextFileCreatorImp"> - <property name="imageMagickDir" value="${imageMagickDir}"/> - </bean> - - <bean id="generatedSlidesInfoHelper" class="org.bigbluebutton.presentation.GeneratedSlidesInfoHelperImp"/> - - <bean id="pdfToSwfSlidesGenerationService" class="org.bigbluebutton.presentation.imp.PdfToSwfSlidesGenerationService"> - <property name="counterService" ref="pageCounterService"/> - <property name="pageConverter" ref="pdf2SwfPageConverter"/> - <property name="pdfPageToImageConversionService" ref="imageConvSvc"/> - <property name="thumbnailCreator" ref="thumbCreator"/> - <property name="textFileCreator" ref="textFileCreator"/> - <property name="blankSlide" value="${BLANK_SLIDE}"/> - <property name="maxSwfFileSize" value="${MAX_SWF_FILE_SIZE}"/> - <property name="maxConversionTime" value="${maxConversionTime}"/> - <property name="swfSlidesGenerationProgressNotifier" ref="swfSlidesGenerationProgressNotifier"/> - </bean> - - <bean id="imageToSwfSlidesGenerationService" class="org.bigbluebutton.presentation.imp.ImageToSwfSlidesGenerationService"> - <property name="pngPageConverter" ref="png2SwfConverter"/> - <property name="jpgPageConverter" ref="jpg2SwfConverter"/> - <property name="thumbnailCreator" ref="thumbCreator"/> - <property name="textFileCreator" ref="textFileCreator"/> - <property name="blankSlide" value="${BLANK_SLIDE}"/> - <property name="maxConversionTime" value="${maxConversionTime}"/> - <property name="swfSlidesGenerationProgressNotifier" ref="swfSlidesGenerationProgressNotifier"/> - </bean> - - <bean id="swfSlidesGenerationProgressNotifier" class="org.bigbluebutton.presentation.imp.SwfSlidesGenerationProgressNotifier"> - <property name="messagingService" ref="messagingService"/> - <property name="generatedSlidesInfoHelper" ref="generatedSlidesInfoHelper"/> - </bean> +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + +Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + +This program is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 3.0 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +--> +<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="documentConversionService" class="org.bigbluebutton.presentation.DocumentConversionServiceImp"> + <property name="messagingService" ref="messagingService"/> + <property name="officeToPdfConversionService" ref="officeToPdfConversionService"/> + <property name="pdfToSwfSlidesGenerationService" ref="pdfToSwfSlidesGenerationService"/> + <property name="imageToSwfSlidesGenerationService" ref="imageToSwfSlidesGenerationService"/> + </bean> + + <bean id="officeToPdfConversionService" class="org.bigbluebutton.presentation.imp.OfficeToPdfConversionService"/> + + <bean id="pageExtractor" class="org.bigbluebutton.presentation.imp.GhostscriptPageExtractor"> + <property name="ghostscriptExec" value="${ghostScriptExec}"/> + <property name="noPdfMarkWorkaround" value="${noPdfMarkWorkaround}"/> + </bean> + + <bean id="imageMagickPageConverter" class="org.bigbluebutton.presentation.imp.ImageMagickPageConverter"> + <property name="imageMagickDir" value="${imageMagickDir}"/> + </bean> + + <bean id="png2SwfConverter" class="org.bigbluebutton.presentation.imp.Png2SwfPageConverter"> + <property name="swfToolsDir" value="${swfToolsDir}"/> + </bean> + + <bean id="jpg2SwfConverter" class="org.bigbluebutton.presentation.imp.Jpeg2SwfPageConverter"> + <property name="swfToolsDir" value="${swfToolsDir}"/> + </bean> + + <bean id="pageCounter" class="org.bigbluebutton.presentation.imp.Pdf2SwfPageCounter"> + <property name="swfToolsDir" value="${swfToolsDir}"/> + </bean> + + <bean id="pageCounterService" class="org.bigbluebutton.presentation.imp.PageCounterService"> + <property name="pageCounter" ref="pageCounter"/> + <property name="maxNumPages" value="${maxNumPages}"/> + </bean> + + <bean id="pdf2SwfPageConverter" class="org.bigbluebutton.presentation.imp.Pdf2SwfPageConverter"> + <property name="swfToolsDir" value="${swfToolsDir}"/> + <property name="fontsDir" value="${fontsDir}"/> + </bean> + + <bean id="imageConvSvc" class="org.bigbluebutton.presentation.imp.PdfPageToImageConversionService"> + <property name="pageExtractor" ref="pageExtractor"/> + <property name="pdfToImageConverter" ref="imageMagickPageConverter"/> + <property name="imageToSwfConverter" ref="png2SwfConverter"/> + </bean> + + <bean id="thumbCreator" class="org.bigbluebutton.presentation.imp.ThumbnailCreatorImp"> + <property name="imageMagickDir" value="${imageMagickDir}"/> + <property name="blankThumbnail" value="${BLANK_THUMBNAIL}"/> + </bean> + + <bean id="textFileCreator" class="org.bigbluebutton.presentation.imp.TextFileCreatorImp"> + <property name="imageMagickDir" value="${imageMagickDir}"/> + </bean> + + <bean id="generatedSlidesInfoHelper" class="org.bigbluebutton.presentation.GeneratedSlidesInfoHelperImp"/> + + <bean id="pdfToSwfSlidesGenerationService" class="org.bigbluebutton.presentation.imp.PdfToSwfSlidesGenerationService"> + <property name="counterService" ref="pageCounterService"/> + <property name="pageConverter" ref="pdf2SwfPageConverter"/> + <property name="pdfPageToImageConversionService" ref="imageConvSvc"/> + <property name="thumbnailCreator" ref="thumbCreator"/> + <property name="textFileCreator" ref="textFileCreator"/> + <property name="blankSlide" value="${BLANK_SLIDE}"/> + <property name="maxSwfFileSize" value="${MAX_SWF_FILE_SIZE}"/> + <property name="maxConversionTime" value="${maxConversionTime}"/> + <property name="swfSlidesGenerationProgressNotifier" ref="swfSlidesGenerationProgressNotifier"/> + </bean> + + <bean id="imageToSwfSlidesGenerationService" class="org.bigbluebutton.presentation.imp.ImageToSwfSlidesGenerationService"> + <property name="pngPageConverter" ref="png2SwfConverter"/> + <property name="jpgPageConverter" ref="jpg2SwfConverter"/> + <property name="thumbnailCreator" ref="thumbCreator"/> + <property name="textFileCreator" ref="textFileCreator"/> + <property name="blankSlide" value="${BLANK_SLIDE}"/> + <property name="maxConversionTime" value="${maxConversionTime}"/> + <property name="swfSlidesGenerationProgressNotifier" ref="swfSlidesGenerationProgressNotifier"/> + </bean> + + <bean id="swfSlidesGenerationProgressNotifier" class="org.bigbluebutton.presentation.imp.SwfSlidesGenerationProgressNotifier"> + <property name="messagingService" ref="messagingService"/> + <property name="generatedSlidesInfoHelper" ref="generatedSlidesInfoHelper"/> + </bean> </beans> \ No newline at end of file diff --git a/bigbluebutton-web/grails-app/conf/spring/resources.groovy b/bigbluebutton-web/grails-app/conf/spring/resources.groovy index 7622706ebfbaab59ca68fa06538ac7ce2edec243..fa950068bbf09933b338207af9cbbc2f5888e960 100755 --- a/bigbluebutton-web/grails-app/conf/spring/resources.groovy +++ b/bigbluebutton-web/grails-app/conf/spring/resources.groovy @@ -1,23 +1,3 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - // Place your Spring DSL code here beans = { - -} \ No newline at end of file +} diff --git a/bigbluebutton-web/grails-app/conf/spring/resources.xml b/bigbluebutton-web/grails-app/conf/spring/resources.xml index 86449b4a19a2ea4403724d6b9ba6a73ef53d771f..c87612733f5b686516020e374367c9a99139dd77 100755 --- a/bigbluebutton-web/grails-app/conf/spring/resources.xml +++ b/bigbluebutton-web/grails-app/conf/spring/resources.xml @@ -1,117 +1,117 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - -BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - -Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). - -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3.0 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - ---> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:util="http://www.springframework.org/schema/util" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd - http://www.springframework.org/schema/util - http://www.springframework.org/schema/util/spring-util-2.0.xsd - "> - - <bean id="config" class="org.bigbluebutton.api.messaging.GenericObjectPoolConfigWrapper"> - <!-- Action to take when trying to acquire a connection and all connections are taken --> - <property name="whenExhaustedAction"> - <!-- Fail-fast behaviour, we don't like to keep the kids waiting --> - <util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_FAIL" /> - <!-- Default behaviour, block the caller until a resource becomes available --> - <!--<util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK" />--> - </property> - <!-- Maximum active connections to Redis instance --> - <property name="maxActive" value="12" /> - <!-- Number of connections to Redis that just sit there and do nothing --> - <property name="maxIdle" value="6" /> - <!-- Minimum number of idle connections to Redis - these can be seen as always open and ready to serve --> - <property name="minIdle" value="1" /> - <!-- Tests whether connection is dead when connection retrieval method is called --> - <property name="testOnBorrow" value="true" /> - <!-- Tests whether connection is dead when returning a connection to the pool --> - <property name="testOnReturn" value="true" /> - <!-- Tests whether connections are dead during idle periods --> - <property name="testWhileIdle" value="true" /> - <!-- Maximum number of connections to test in each idle check --> - <property name="numTestsPerEvictionRun" value="12" /> - <!-- Idle connection checking period --> - <property name="timeBetweenEvictionRunsMillis" value="60000" /> - <!-- Maximum time, in milliseconds, to wait for a resource when exausted action is set to WHEN_EXAUSTED_BLOCK --> - <property name="maxWait" value="5000" /> - </bean> - - <bean id="messagingService" class="org.bigbluebutton.api.messaging.RedisMessagingService"> - <property name="redisPool" ref="redisPool"/> - </bean> - - <bean id="redisPool" class="redis.clients.jedis.JedisPool"> - <constructor-arg index="0"> - <bean factory-bean="config" factory-method="getConfig" /> - </constructor-arg> - <constructor-arg index="1" value="${redisHost}"/> - <constructor-arg index="2" value="${redisPort}"/> - </bean> - - <bean id="expiredMeetingCleanupTimerTask" class="org.bigbluebutton.web.services.ExpiredMeetingCleanupTimerTask"/> - - <bean id="keepAliveService" class="org.bigbluebutton.web.services.KeepAliveService" init-method="start"> - <property name="runEvery" value="${checkBBBServerEvery}"/> - <property name="messagingService" ref="messagingService" /> - </bean> - - <bean id="meetingService" class="org.bigbluebutton.api.MeetingService"> - <property name="defaultMeetingExpireDuration" value="${defaultMeetingExpireDuration}"/> - <property name="defaultMeetingCreateJoinDuration" value="${defaultMeetingCreateJoinDuration}"/> - <property name="removeMeetingWhenEnded" value="${removeMeetingWhenEnded}"/> - <property name="expiredMeetingCleanupTimerTask" ref="expiredMeetingCleanupTimerTask"/> - <property name="keepAliveService" ref="keepAliveService"/> - <property name="messagingService" ref="messagingService"/> - <property name="recordingService" ref="recordingService"/> - </bean> - - <bean id="recordingServiceHelper" class="org.bigbluebutton.api.RecordingServiceHelperImp"/> - - <bean id="recordingService" class="org.bigbluebutton.api.RecordingService" > - <property name="recordingStatusDir" value="${recordStatusDir}"/> - <property name="publishedDir" value="${publishedDir}"/> - <property name="unpublishedDir" value="${unpublishedDir}"/> - <property name="recordingServiceHelper" ref="recordingServiceHelper"/> - </bean> - - <bean id="paramsProcessorUtil" class="org.bigbluebutton.api.ParamsProcessorUtil"> - <property name="apiVersion" value="${apiVersion}"/> - <property name="serviceEnabled" value="${serviceEnabled}"/> - <property name="securitySalt" value="${securitySalt}"/> - <property name="defaultMaxUsers" value="${defaultMaxUsers}"/> - <property name="defaultWelcomeMessage" value="${defaultWelcomeMessage}"/> - <property name="defaultWelcomeMessageFooter" value="${defaultWelcomeMessageFooter}"/> - <property name="defaultDialAccessNumber" value="${defaultDialAccessNumber}"/> - <property name="testVoiceBridge" value="${testVoiceBridge}"/> - <property name="testConferenceMock" value="${testConferenceMock}"/> - <property name="defaultLogoutUrl" value="${bigbluebutton.web.logoutURL}"/> - <property name="defaultServerUrl" value="${bigbluebutton.web.serverURL}"/> - <property name="defaultNumDigitsForTelVoice" value="${defaultNumDigitsForTelVoice}"/> - <property name="defaultClientUrl" value="${defaultClientUrl}"/> - <property name="defaultMeetingDuration" value="${defaultMeetingDuration}"/> - <property name="disableRecordingDefault" value="${disableRecordingDefault}"/> - <property name="defaultAvatarURL" value="${defaultAvatarURL}"/> - <property name="defaultConfigURL" value="${defaultConfigURL}"/> - </bean> - - <import resource="doc-conversion.xml" /> +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + +Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + +This program is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 3.0 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util-2.0.xsd + "> + + <bean id="config" class="org.bigbluebutton.api.messaging.GenericObjectPoolConfigWrapper"> + <!-- Action to take when trying to acquire a connection and all connections are taken --> + <property name="whenExhaustedAction"> + <!-- Fail-fast behaviour, we don't like to keep the kids waiting --> + <util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_FAIL" /> + <!-- Default behaviour, block the caller until a resource becomes available --> + <!--<util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK" />--> + </property> + <!-- Maximum active connections to Redis instance --> + <property name="maxActive" value="12" /> + <!-- Number of connections to Redis that just sit there and do nothing --> + <property name="maxIdle" value="6" /> + <!-- Minimum number of idle connections to Redis - these can be seen as always open and ready to serve --> + <property name="minIdle" value="1" /> + <!-- Tests whether connection is dead when connection retrieval method is called --> + <property name="testOnBorrow" value="true" /> + <!-- Tests whether connection is dead when returning a connection to the pool --> + <property name="testOnReturn" value="true" /> + <!-- Tests whether connections are dead during idle periods --> + <property name="testWhileIdle" value="true" /> + <!-- Maximum number of connections to test in each idle check --> + <property name="numTestsPerEvictionRun" value="12" /> + <!-- Idle connection checking period --> + <property name="timeBetweenEvictionRunsMillis" value="60000" /> + <!-- Maximum time, in milliseconds, to wait for a resource when exausted action is set to WHEN_EXAUSTED_BLOCK --> + <property name="maxWait" value="5000" /> + </bean> + + <bean id="messagingService" class="org.bigbluebutton.api.messaging.RedisMessagingService"> + <property name="redisPool" ref="redisPool"/> + </bean> + + <bean id="redisPool" class="redis.clients.jedis.JedisPool"> + <constructor-arg index="0"> + <bean factory-bean="config" factory-method="getConfig" /> + </constructor-arg> + <constructor-arg index="1" value="${redisHost}"/> + <constructor-arg index="2" value="${redisPort}"/> + </bean> + + <bean id="expiredMeetingCleanupTimerTask" class="org.bigbluebutton.web.services.ExpiredMeetingCleanupTimerTask"/> + + <bean id="keepAliveService" class="org.bigbluebutton.web.services.KeepAliveService" init-method="start"> + <property name="runEvery" value="${checkBBBServerEvery}"/> + <property name="messagingService" ref="messagingService" /> + </bean> + + <bean id="meetingService" class="org.bigbluebutton.api.MeetingService"> + <property name="defaultMeetingExpireDuration" value="${defaultMeetingExpireDuration}"/> + <property name="defaultMeetingCreateJoinDuration" value="${defaultMeetingCreateJoinDuration}"/> + <property name="removeMeetingWhenEnded" value="${removeMeetingWhenEnded}"/> + <property name="expiredMeetingCleanupTimerTask" ref="expiredMeetingCleanupTimerTask"/> + <property name="keepAliveService" ref="keepAliveService"/> + <property name="messagingService" ref="messagingService"/> + <property name="recordingService" ref="recordingService"/> + </bean> + + <bean id="recordingServiceHelper" class="org.bigbluebutton.api.RecordingServiceHelperImp"/> + + <bean id="recordingService" class="org.bigbluebutton.api.RecordingService" > + <property name="recordingStatusDir" value="${recordStatusDir}"/> + <property name="publishedDir" value="${publishedDir}"/> + <property name="unpublishedDir" value="${unpublishedDir}"/> + <property name="recordingServiceHelper" ref="recordingServiceHelper"/> + </bean> + + <bean id="paramsProcessorUtil" class="org.bigbluebutton.api.ParamsProcessorUtil"> + <property name="apiVersion" value="${apiVersion}"/> + <property name="serviceEnabled" value="${serviceEnabled}"/> + <property name="securitySalt" value="${securitySalt}"/> + <property name="defaultMaxUsers" value="${defaultMaxUsers}"/> + <property name="defaultWelcomeMessage" value="${defaultWelcomeMessage}"/> + <property name="defaultWelcomeMessageFooter" value="${defaultWelcomeMessageFooter}"/> + <property name="defaultDialAccessNumber" value="${defaultDialAccessNumber}"/> + <property name="testVoiceBridge" value="${testVoiceBridge}"/> + <property name="testConferenceMock" value="${testConferenceMock}"/> + <property name="defaultLogoutUrl" value="${bigbluebutton.web.logoutURL}"/> + <property name="defaultServerUrl" value="${bigbluebutton.web.serverURL}"/> + <property name="defaultNumDigitsForTelVoice" value="${defaultNumDigitsForTelVoice}"/> + <property name="defaultClientUrl" value="${defaultClientUrl}"/> + <property name="defaultMeetingDuration" value="${defaultMeetingDuration}"/> + <property name="disableRecordingDefault" value="${disableRecordingDefault}"/> + <property name="defaultAvatarURL" value="${defaultAvatarURL}"/> + <property name="defaultConfigURL" value="${defaultConfigURL}"/> + </bean> + + <import resource="doc-conversion.xml" /> </beans> \ No newline at end of file diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/.project b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/.project old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/grails-app/i18n/jsecurity.properties b/bigbluebutton-web/grails-app/i18n/jsecurity.properties deleted file mode 100644 index ddba8d9b589263bac938a808fd0f27f768091eab..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/i18n/jsecurity.properties +++ /dev/null @@ -1 +0,0 @@ -login.failed = Invalid username and/or password diff --git a/bigbluebutton-web/grails-app/i18n/messages.properties b/bigbluebutton-web/grails-app/i18n/messages.properties old mode 100644 new mode 100755 index 92a1cf47763a607f597d83b48fd0952a03b4e0e5..0c9d7eea90a429d4fc4bf3ab8faa2b8e38500013 --- a/bigbluebutton-web/grails-app/i18n/messages.properties +++ b/bigbluebutton-web/grails-app/i18n/messages.properties @@ -17,6 +17,31 @@ default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must b 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 @@ -28,6 +53,3 @@ 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 - -conference.name.blank=Please enter a name for this conference -conference.name.max.exceeded=Please enter a valid name no more than {3} characters \ No newline at end of file diff --git a/bigbluebutton-web/grails-app/i18n/messages_cs_CZ.properties b/bigbluebutton-web/grails-app/i18n/messages_cs_CZ.properties new file mode 100755 index 0000000000000000000000000000000000000000..73455311c804f6e8b2e1e98fd9c1512d2ab210b6 --- /dev/null +++ b/bigbluebutton-web/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 diff --git a/bigbluebutton-web/grails-app/i18n/messages_da.properties b/bigbluebutton-web/grails-app/i18n/messages_da.properties new file mode 100755 index 0000000000000000000000000000000000000000..858b22903cfa750b226164c17a558f49ea5fdcb0 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_de.properties b/bigbluebutton-web/grails-app/i18n/messages_de.properties old mode 100644 new mode 100755 index 584e6c09b402b9a24356456b72fc06df07061ff4..0f7bfe92c31282a0b89e4f43834af88b5900c63e --- a/bigbluebutton-web/grails-app/i18n/messages_de.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_de.properties @@ -1,30 +1,55 @@ -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 - -# 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 \ No newline at end of file +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} Liste +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 diff --git a/bigbluebutton-web/grails-app/i18n/messages_es.properties b/bigbluebutton-web/grails-app/i18n/messages_es.properties old mode 100644 new mode 100755 index 6295b7754c03816039f0c6088b45dbef96b74add..f0ede539685ea6464e57e758bf1d25eea48427cd --- a/bigbluebutton-web/grails-app/i18n/messages_es.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_es.properties @@ -17,6 +17,31 @@ default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] 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 diff --git a/bigbluebutton-web/grails-app/i18n/messages_fr.properties b/bigbluebutton-web/grails-app/i18n/messages_fr.properties old mode 100644 new mode 100755 index b1d665c3181e4a36a1b2c5d8dbfe3165e2346a50..55721641494d3a1900db11e279c72e0840a05278 --- a/bigbluebutton-web/grails-app/i18n/messages_fr.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_fr.properties @@ -1,19 +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 +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/bigbluebutton-web/grails-app/i18n/messages_it.properties b/bigbluebutton-web/grails-app/i18n/messages_it.properties old mode 100644 new mode 100755 index ea83b92dafdb27a2959d6ee256c67dd0c5008d4b..a90f1c72c33360f0207c78bae5e72fbca326431c --- a/bigbluebutton-web/grails-app/i18n/messages_it.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_it.properties @@ -1,19 +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 \ No newline at end of file +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/bigbluebutton-web/grails-app/i18n/messages_ja.properties b/bigbluebutton-web/grails-app/i18n/messages_ja.properties old mode 100644 new mode 100755 index 9f492494d778a1c10707fc0c90ab4b252a2cd3b8..f716d75be29c57edf634f7a8990f7f14d7b2d111 --- a/bigbluebutton-web/grails-app/i18n/messages_ja.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_ja.properties @@ -1,19 +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.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/bigbluebutton-web/grails-app/i18n/messages_nb.properties b/bigbluebutton-web/grails-app/i18n/messages_nb.properties new file mode 100755 index 0000000000000000000000000000000000000000..47a8a1abe7cd555d2b8c21f35fe00b0b0d7f2986 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_nl.properties b/bigbluebutton-web/grails-app/i18n/messages_nl.properties old mode 100644 new mode 100755 index 31a89778818f1932cf929c7cb60d9a7415495bf6..cd5cc94ee755450fc4d9884d695e1dd326117501 --- a/bigbluebutton-web/grails-app/i18n/messages_nl.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_nl.properties @@ -1,30 +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 mainimumgrootte 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 - -# 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 \ No newline at end of file +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/bigbluebutton-web/grails-app/i18n/messages_pl.properties b/bigbluebutton-web/grails-app/i18n/messages_pl.properties new file mode 100755 index 0000000000000000000000000000000000000000..959296cee30e83d02686da574fd71c1d46ccb3bd --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_pt_BR.properties b/bigbluebutton-web/grails-app/i18n/messages_pt_BR.properties new file mode 100755 index 0000000000000000000000000000000000000000..0c368f22eb409608254b5d8acf655f5382aab9a9 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_pt_PT.properties b/bigbluebutton-web/grails-app/i18n/messages_pt_PT.properties new file mode 100755 index 0000000000000000000000000000000000000000..a386070674fd0a26e72cb33e69caf9df253b9cce --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_ru.properties b/bigbluebutton-web/grails-app/i18n/messages_ru.properties old mode 100644 new mode 100755 index 02239db0a8012a2bcb0ad45920bb3d475f72be7a..53a4bdc4318bf77db74be617f0be2c8a0a3f69e2 --- a/bigbluebutton-web/grails-app/i18n/messages_ru.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_ru.properties @@ -1,31 +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} не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом +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/bigbluebutton-web/grails-app/i18n/messages_sv.properties b/bigbluebutton-web/grails-app/i18n/messages_sv.properties new file mode 100755 index 0000000000000000000000000000000000000000..61899d79491c39206398d8c046c2af0f05387d05 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/i18n/messages_th.properties b/bigbluebutton-web/grails-app/i18n/messages_th.properties old mode 100644 new mode 100755 index 6ec53147f5c0e9da2517c8359c9dcd885b977f13..fd0dbb68d403493ac664d9c03775da83e4e78494 --- a/bigbluebutton-web/grails-app/i18n/messages_th.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_th.properties @@ -1,30 +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=ถัดไป - -# 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 \ No newline at end of file +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/bigbluebutton-web/grails-app/i18n/messages_zh_CN.properties b/bigbluebutton-web/grails-app/i18n/messages_zh_CN.properties old mode 100644 new mode 100755 index 782580b04634a5219b59c1582a9749f16213d527..b89bc933bbf59c31d593bc8275ebd82e70ba7f63 --- a/bigbluebutton-web/grails-app/i18n/messages_zh_CN.properties +++ b/bigbluebutton-web/grails-app/i18n/messages_zh_CN.properties @@ -1,18 +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 +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/bigbluebutton-web/grails-app/views/_adminmenubar.gsp b/bigbluebutton-web/grails-app/views/_adminmenubar.gsp deleted file mode 100644 index c2a7fc097c85adbccb00aeb60df56b2486ffa976..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/views/_adminmenubar.gsp +++ /dev/null @@ -1,11 +0,0 @@ -<jsec:isLoggedIn> - <jsec:hasRole name="Administrator"> - <div align="right"> - <g:link controller="user" action="list">Manage Users</g:link> | - Logged in as: <jsec:principal/> (<g:link controller="auth" action="signOut">sign out</g:link>) - </div> - </jsec:hasRole> - <jsec:lacksRole name="Administrator"> - <div align="right">Logged in as: <jsec:principal/> (<g:link controller="auth" action="signOut">sign out</g:link>)</div> - </jsec:lacksRole> -</jsec:isLoggedIn> \ No newline at end of file diff --git a/bigbluebutton-web/grails-app/views/error.gsp b/bigbluebutton-web/grails-app/views/error.gsp old mode 100644 new mode 100755 index 781d66cdd2d13165b68fc3fc29fe1212142e55b8..d85f57ba2bbd63e86ab4dde65c6d3309297dcc5a --- a/bigbluebutton-web/grails-app/views/error.gsp +++ b/bigbluebutton-web/grails-app/views/error.gsp @@ -1,46 +1,18 @@ +<!DOCTYPE html> <html> - <head> - <title>Grails Runtime Exception</title> - <style type="text/css"> - .message { - border: 1px solid black; - padding: 5px; - background-color:#E9E9E9; - } - .stack { - border: 1px solid black; - padding: 5px; - overflow:auto; - height: 300px; - } - .snippet { - padding: 5px; - background-color:white; - border:1px solid black; - margin:3px; - font-family:courier; - } - </style> - </head> - - <body> - <h1>Grails Runtime Exception</h1> - <h2>Error Details</h2> - <div class="message"> - <strong>Message:</strong> ${exception.message?.encodeAsHTML()} <br /> - <strong>Caused by:</strong> ${exception.cause?.message?.encodeAsHTML()} <br /> - <strong>Class:</strong> ${exception.className} <br /> - <strong>At Line:</strong> [${exception.lineNumber}] <br /> - <strong>Code Snippet:</strong><br /> - <div class="snippet"> - <g:each var="cs" in="${exception.codeSnippet}"> - ${cs?.encodeAsHTML()}<br /> - </g:each> - </div> - </div> - <h2>Stack Trace</h2> - <div class="stack"> - <pre><g:each in="${exception.stackTraceLines}">${it.encodeAsHTML()}<br/></g:each></pre> - </div> - </body> -</html> \ No newline at end of file + <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/bigbluebutton-web/grails-app/views/index.gsp b/bigbluebutton-web/grails-app/views/index.gsp new file mode 100755 index 0000000000000000000000000000000000000000..cf4c0b438bba152d5f21b8f552794c021859be87 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/grails-app/views/layouts/main.gsp b/bigbluebutton-web/grails-app/views/layouts/main.gsp old mode 100644 new mode 100755 index 9cf0fa43b9f1be029325e28e85f2f5616f993ddf..c69c988f57274812cd5984bccfbf351860f8e221 --- a/bigbluebutton-web/grails-app/views/layouts/main.gsp +++ b/bigbluebutton-web/grails-app/views/layouts/main.gsp @@ -1,22 +1,28 @@ -<html> - <head> - <title><g:layoutTitle default="Grails" /></title> - <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" /> - <link rel="shortcut icon" href="${createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" /> - <g:layoutHead /> - <g:javascript library="application" /> - </head> - <body> - <div id="spinner" class="spinner" style="display:none;"> - <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> - </div> - <div class="logo"><img src="${createLinkTo(dir:'images',file:'bbb_banner.jpg')}" alt="BigBlueButton" /></div> - <div class="nav"> - <div class="nav"> - <g:render template="/adminmenubar" /> - </div> - <h1>NOTE: We are deprecating this web interface in favor of the API. This will be removed in the next release.</h1> - <g:layoutBody /> - bbb-web v. <g:meta name="app.version"/> - </body> +<!DOCTYPE html> +<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]--> +<!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]--> +<!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]--> +<!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]--> +<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"><!--<![endif]--> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <title><g:layoutTitle default="Grails"/></title> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="shortcut icon" href="${resource(dir: 'images', file: 'favicon.ico')}" type="image/x-icon"> + <link rel="apple-touch-icon" href="${resource(dir: 'images', file: 'apple-touch-icon.png')}"> + <link rel="apple-touch-icon" sizes="114x114" href="${resource(dir: 'images', file: 'apple-touch-icon-retina.png')}"> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'main.css')}" type="text/css"> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'mobile.css')}" type="text/css"> + <g:layoutHead/> + <r:layoutResources /> + </head> + <body> + <div id="grailsLogo" role="banner"><a href="http://grails.org"><img src="${resource(dir: 'images', file: 'grails_logo.png')}" alt="Grails"/></a></div> + <g:layoutBody/> + <div class="footer" role="contentinfo"></div> + <div id="spinner" class="spinner" style="display:none;"><g:message code="spinner.alt" default="Loading…"/></div> + <g:javascript library="application"/> + <r:layoutResources /> + </body> </html> diff --git a/bigbluebutton-web/grails-app/views/presentation/list.gsp b/bigbluebutton-web/grails-app/views/presentation/list.gsp deleted file mode 100644 index 98ed284209137cc4678b0c3c374f99e3dd6bca01..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/views/presentation/list.gsp +++ /dev/null @@ -1,71 +0,0 @@ -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>FileResource List</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="/">Home</a></span> - </div> - <div class="body"> - - <h1>File Upload:</h1><br> - - <g:form method="post" enctype="multipart/form-data"> - <div class="dialog"> - <table> - <tbody> - <tr class="prop"> - <td valign="top" class="name"> - <label for="presentationName">Presentation Name:</label> - </td> - <td valign="top" class="name"> - <input type="text" name="presentationName" value="${presentationName}" /> - </td> - </tr> - <tr class="prop"> - <td valign="top" class="name"> - <label for="fileUpload">Upload:</label> - </td> - <td valign="top" class="value ${hasErrors(presentations,field:'upload','errors')}"> - <input type="file" id="fileUpload" name="fileUpload" /> - </td> - </tr> - </tbody> - </table> - </div> - <div class="buttons"> - <span class="button"><g:actionSubmit class="upload" value="Upload" action="upload" /></span> - </div> - </g:form> - - <h1>Presentations</h1> - <g:if test="${flash.message}"> - <div class="message">${flash.message}</div> - </g:if> - <div id="success"></div> - <div class="list"> - <table> - <thead> - <tr> - <g:sortableColumn property="files" title="file"/> - <g:sortableColumn property="path" title="path" colspan="3"/> - </tr> - </thead> - <tbody> - <g:each in="${presentations}" status="i" var="presentation"> - <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> - <td>${presentation.decodeURL()}</td> - <td><g:link action="thumbnails" id="${presentation.replace('.','###')}"> thumbnails </g:link></td> - <td><g:link action="show" id="${presentation.replace('.','###')}"> show </g:link></td> - <td><g:link action="delete" id="${presentation.replace('.','###')}" onclick="return confirm('Are you sure?');"> delete </g:link></td> - </tr> - </g:each> - </tbody> - </table> - </div> - </div> - </body> -</html> - diff --git a/bigbluebutton-web/grails-app/views/presentation/thumbnails.gsp b/bigbluebutton-web/grails-app/views/presentation/thumbnails.gsp deleted file mode 100644 index 4d83e8683f34df54649f9851eed3d232ab9aba6c..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/views/presentation/thumbnails.gsp +++ /dev/null @@ -1,24 +0,0 @@ -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>FileResource List</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="/">Home</a></span> - </div> - <div class="body"> - - <h1>${numThumbs} </h1><br>re ${presSlides} - <g:each var="x" in="${ (0..<numThumbs) }"> - <li><g:createLink action="show" params="[foo: 'bar', boo: 'far']"/> - <img src="${createLink(action:'thumbnail', params:[id:presSlides, thumb:x])}" alt="BigBlueButton" /> - <g:link action="thumbnail" id="${presSlides}" params="[thumb:x]">t</g:link> - </li> - </g:each> - - </div> - </body> -</html> - diff --git a/bigbluebutton-web/grails-app/views/presentation/upload-file.gsp b/bigbluebutton-web/grails-app/views/presentation/upload-file.gsp deleted file mode 100644 index aa7432e03d750e81902ab30110853a95fd7aa6af..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/grails-app/views/presentation/upload-file.gsp +++ /dev/null @@ -1,40 +0,0 @@ -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="layout" content="main" /> - <title>Upload Presentation</title> -</head> -<body> - <g:if test="${flash.message}"> - <div class="message">${flash.message}</div> - </g:if> - <g:form controller="presentation" method="post" action="upload" enctype="multipart/form-data"> - <div class="dialog"> - <table> - <tbody> - <tr class="prop"> - <td valign="top" class="name"> - <label for="presentationName">Presentation Name:</label> - </td> - <td valign="top" class="name"> - <input type="text" name="presentation_name" value="${presentation_name}" /> - </td> - </tr> - <tr class="prop"> - <td valign="top" class="name"> - <label for="fileUpload">Upload:</label> - </td> - <td valign="top" class="name"> - <input type="file" id="fileUpload" name="fileUpload" /> - </td> - </tr> - </tbody> - </table> - </div> - <div class="buttons"> - <!--span class="button"><g:actionSubmit class="upload" value="Upload" action="upload" /></span--> - <input type="submit" value="Upload"/> - </div> - </g:form> -</body> -</html> diff --git a/bigbluebutton-web/grails-app/views/presentation/upload.gsp b/bigbluebutton-web/grails-app/views/presentation/upload.gsp deleted file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/bigbluebutton-web/grailsw b/bigbluebutton-web/grailsw new file mode 100755 index 0000000000000000000000000000000000000000..c1e4df826f9101bb4ad0b8e41681be7f3cb409d1 --- /dev/null +++ b/bigbluebutton-web/grailsw @@ -0,0 +1,338 @@ +############################################################################## +## ## +## Grails JVM Bootstrap for UN*X ## +## ## +############################################################################## + +PROGNAME=`basename "$0"` +DIRNAME=`dirname "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that +MAX_FD="maximum" + +warn() { + echo "${PROGNAME}: $*" +} + +die() { + warn "$*" + exit 1 +} + +earlyInit() { + return +} +lateInit() { + return +} + +GROOVY_STARTUP=~/.groovy/startup +if [ -r "$GROOVY_STARTUP" ]; then + . "$GROOVY_STARTUP" +fi + +earlyInit + +# OS specific support (must be 'true' or 'false'). +cygwin=false; +darwin=false; +case "`uname`" in + CYGWIN*) + cygwin=true + ;; + + Darwin*) + darwin=true + ;; +esac + +# Attempt to set JAVA_HOME if it's not already set +if [ -z "$JAVA_HOME" ]; then + + # Set JAVA_HOME for Darwin + if $darwin; then + + [ -z "$JAVA_HOME" -a -d "/Library/Java/Home" ] && + export JAVA_HOME="/Library/Java/Home" + + [ -z "$JAVA_HOME" -a -d "/System/Library/Frameworks/JavaVM.framework/Home" ] && + export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Home" + + fi + +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$GRAILS_HOME" ] && + GRAILS_HOME=`cygpath --unix "$GRAILS_HOME"` + [ -n "$JAVACMD" ] && + JAVACMD=`cygpath --unix "$JAVACMD"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CP" ] && + CP=`cygpath --path --unix "$CP"` +fi + +# Remove possible trailing slash (after possible cygwin correction) +GRAILS_HOME=`echo $GRAILS_HOME | sed -e 's|/$||g'` + +# Locate GRAILS_HOME if not it is not set +if [ -z "$GRAILS_HOME" -o ! -d "$GRAILS_HOME" ] ; then + # resolve links - $0 may be a link to groovy's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi + done + + SAVED="`pwd`" + cd "`dirname \"$PRG\"`/.." + GRAILS_HOME="`pwd -P`" + cd "$SAVED" +fi + +# Warn the user if JAVA_HOME and/or GRAILS_HOME are not set. +if [ -z "$JAVA_HOME" ] ; then + die "JAVA_HOME environment variable is not set" +elif [ ! -d "$JAVA_HOME" ] ; then + die "JAVA_HOME is not a directory: $JAVA_HOME" +fi + +if [ -z "$GRAILS_HOME" ] ; then + warn "GRAILS_HOME environment variable is not set" +fi + +if [ ! -d "$GRAILS_HOME" ] ; then + die "GRAILS_HOME is not a directory: $GRAILS_HOME" +fi + +# Use default groovy-conf config +if [ -z "$STARTER_CONF" ]; then + STARTER_CONF="$GRAILS_HOME/conf/groovy-starter.conf" +fi +STARTER_CLASSPATH="wrapper/grails-wrapper-runtime-2.3.0.jar:wrapper:." + +# Allow access to Cocoa classes on OS X +if $darwin; then + STARTER_CLASSPATH="$STARTER_CLASSPATH:/System/Library/Java/Support" +fi + +# Create the final classpath +# Setting a classpath using the -cp or -classpath option means not to use +# the global classpath. Groovy behaves then the same as the java +# interpreter +if [ -n "$CP" ] ; then + CP="$CP" +elif [ -n "$CLASSPATH" ] ; then + CP="$CLASSPATH" +fi + +# Determine the Java command to use to start the JVM +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="java" + fi +fi +if [ ! -x "$JAVACMD" ]; then + die "JAVA_HOME is not defined correctly; can not execute: $JAVACMD" +fi + +# Increase the maximum file descriptors if we can +if [ "$cygwin" = "false" ]; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ "$MAX_FD_LIMIT" != "unlimited" ]; then + if [ $? -eq 0 ]; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then + # use the businessSystem max + MAX_FD="$MAX_FD_LIMIT" + fi + + ulimit -n $MAX_FD + if [ $? -ne 0 ]; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query businessSystem maximum file descriptor limit: $MAX_FD_LIMIT" + fi + fi +fi + +# Fix the cygwin agent issue +AGENT_GRAILS_HOME=$GRAILS_HOME +if $cygwin ; then + [ -n "$GRAILS_HOME" ] && + AGENT_GRAILS_HOME=`cygpath --windows "$GRAILS_HOME"` +fi + +if [ -z "$GRAILS_AGENT_CACHE_DIR" ]; then + GRAILS_AGENT_CACHE_DIR=~/.grails/2.3.0/ +fi +SPRINGLOADED_PARAMS=profile=grails\;cacheDir=$GRAILS_AGENT_CACHE_DIR +if [ ! -d "$GRAILS_AGENT_CACHE_DIR" ]; then + mkdir -p "$GRAILS_AGENT_CACHE_DIR" +fi + +# Process JVM args +AGENT_STRING="-javaagent:wrapper/springloaded-core-1.1.3.jar -noverify -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=$SPRINGLOADED_PARAMS" +CMD_LINE_ARGS="" +DISABLE_RELOADING=true + +while true; do + if [ "$1" = "-cp" ] || [ "$1" = "-classpath" ]; then + CP=$2 + shift 2 + break + fi + + if [ "$1" = "-reloading" ]; then + AGENT=$AGENT_STRING + DISABLE_RELOADING=false + shift + break + fi + + if [ "$1" = "-noreloading" ]; then + DISABLE_RELOADING=true + shift + break + fi + + if [ "$1" = "-debug" ]; then + JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Dgrails.full.stacktrace=true -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" + shift + break + fi + + if [ "$1" != -* ]; then + break + fi + + CMD_LINE_ARGS="$CMD_LINE_ARGS $1" + shift +done + +# Enable agent-based reloading for the 'run-app' command. +if ! $DISABLE_RELOADING; then + for a in "$@"; do + if [ "$a" = "run-app" ]; then + AGENT=$AGENT_STRING + fi + done + + if [ $# = 0 ]; then + AGENT=$AGENT_STRING + fi +fi + +ARGUMENTS="$CMD_LINE_ARGS $@" + +# Setup Profiler +useprofiler=false +if [ "x$PROFILER" != "x" ]; then + if [ -r "$PROFILER" ]; then + . $PROFILER + useprofiler=true + else + die "Profiler file not found: $PROFILER" + fi +fi + +# For Darwin, use classes.jar for TOOLS_JAR +TOOLS_JAR="$JAVA_HOME/lib/tools.jar" +if $darwin; then + JAVA_OPTS="-Xdock:name=Grails -Xdock:icon=$GRAILS_HOME/media/icons/grails.icns $JAVA_OPTS" +# TOOLS_JAR="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes/classes.jar" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + GRAILS_HOME=`cygpath --path --mixed "$GRAILS_HOME"` + JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"` + STARTER_CONF=`cygpath --path --mixed "$STARTER_CONF"` + CP=`cygpath --path --mixed "$CP"` + TOOLS_JAR=`cygpath --path --mixed "$TOOLS_JAR"` + STARTER_CLASSPATH=`cygpath --path --mixed "$STARTER_CLASSPATH"` + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GROOVY_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GROOVY_CYGPATTERN)" + fi + # Now convert the arguments + ARGUMENTS="" + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + if [ $CHECK -ne 0 ] ; then + convArg=`cygpath --path --ignore --mixed "$arg"` + else + convArg=$arg + fi + ARGUMENTS="$ARGUMENTS $convArg" + done +fi + +STARTER_MAIN_CLASS=org.grails.wrapper.GrailsWrapper + +lateInit + +startGrails() { + CLASS=$1 + shift + if [ -n "$GRAILS_OPTS" ] + then + GRAILS_OPTS="$GRAILS_OPTS" + else + GRAILS_OPTS="-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8" + fi + JAVA_OPTS="$GRAILS_OPTS $JAVA_OPTS $AGENT" + # Start the Profiler or the JVM + if $useprofiler; then + runProfiler + else + if [ $# -eq 0 ] ; then # no argument given + exec "$JAVACMD" $JAVA_OPTS \ + -classpath "$STARTER_CLASSPATH" \ + -Dgrails.home="$GRAILS_HOME" \ + -Dtools.jar="$TOOLS_JAR" \ + -Djava.net.preferIPv4Stack=true \ + $STARTER_MAIN_CLASS \ + --main $CLASS \ + --conf "$STARTER_CONF" \ + --classpath "$CP" + else + exec "$JAVACMD" $JAVA_OPTS \ + -classpath "$STARTER_CLASSPATH" \ + -Dgrails.home="$GRAILS_HOME" \ + -Dtools.jar="$TOOLS_JAR" \ + -Djava.net.preferIPv4Stack=true \ + $STARTER_MAIN_CLASS \ + --main $CLASS \ + --conf "$STARTER_CONF" \ + --classpath "$CP" \ + "${ARGUMENTS}" + fi + fi +} + +startGrails $STARTER_MAIN_CLASS "$@" diff --git a/bigbluebutton-web/grailsw.bat b/bigbluebutton-web/grailsw.bat new file mode 100755 index 0000000000000000000000000000000000000000..98c6a7fea9590590dca23a4627869794393c89ea --- /dev/null +++ b/bigbluebutton-web/grailsw.bat @@ -0,0 +1,176 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem ## +@rem Grails JVM Bootstrap for Windows ## +@rem ## +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set CLASS=org.grails.wrapper.GrailsWrapper + +if exist "%USERPROFILE%/.groovy/preinit.bat" call "%USERPROFILE%/.groovy/preinit.bat" + +@rem Determine the command interpreter to execute the "CD" later +set COMMAND_COM="cmd.exe" +if exist "%SystemRoot%\system32\cmd.exe" set COMMAND_COM="%SystemRoot%\system32\cmd.exe" +if exist "%SystemRoot%\command.com" set COMMAND_COM="%SystemRoot%\command.com" + +@rem Use explicit find.exe to prevent cygwin and others find.exe from being used +set FIND_EXE="find.exe" +if exist "%SystemRoot%\system32\find.exe" set FIND_EXE="%SystemRoot%\system32\find.exe" +if exist "%SystemRoot%\command\find.exe" set FIND_EXE="%SystemRoot%\command\find.exe" + +:check_JAVA_HOME +@rem Make sure we have a valid JAVA_HOME +if not "%JAVA_HOME%" == "" goto have_JAVA_HOME + +echo. +echo ERROR: Environment variable JAVA_HOME has not been set. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. +echo. +goto end + +:have_JAVA_HOME +@rem Remove trailing slash from JAVA_HOME if found +if "%JAVA_HOME:~-1%"=="\" SET JAVA_HOME=%JAVA_HOME:~0,-1% + +@rem Validate JAVA_HOME +%COMMAND_COM% /C DIR "%JAVA_HOME%" 2>&1 | %FIND_EXE% /I /C "%JAVA_HOME%" >nul +if not errorlevel 1 goto check_GRAILS_HOME + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. +echo. +goto end + +:check_GRAILS_HOME +@rem Define GRAILS_HOME if not set +if "%GRAILS_HOME%" == "" set GRAILS_HOME=%DIRNAME%.. + +@rem Remove trailing slash from GRAILS_HOME if found +if "%GRAILS_HOME:~-1%"=="\" SET GRAILS_HOME=%GRAILS_HOME:~0,-1% + +:init + +for %%x in ("%HOMEPATH%") do set SHORTHOME=%%~fsx +if "x%GRAILS_AGENT_CACHE_DIR%" == "x" set GRAILS_AGENT_CACHE_DIR=%SHORTHOME%/.grails/2.3.0/ +set SPRINGLOADED_PARAMS="profile=grails;cacheDir=%GRAILS_AGENT_CACHE_DIR%" +if not exist "%GRAILS_AGENT_CACHE_DIR%" mkdir "%GRAILS_AGENT_CACHE_DIR%" + +set AGENT_STRING=-javaagent:wrapper/springloaded-core-1.1.3.jar -noverify -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=\"%SPRINGLOADED_PARAMS%\" +set DISABLE_RELOADING= +if "%GRAILS_OPTS%" == "" set GRAILS_OPTS=-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8 + +@rem Get command-line arguments, handling Windows variants +if "%@eval[2+2]" == "4" goto 4NT_args + +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set CP= +set INTERACTIVE=true + +:win9xME_args_slurp +if "x%~1" == "x" goto execute +set CURR_ARG=%~1 +if "%CURR_ARG:~0,2%" == "-D" ( + set GRAILS_OPTS=%GRAILS_OPTS% %~1=%~2 + shift + shift + goto win9xME_args_slurp +) +if "x%~1" == "x-cp" ( + set CP=%~2 + shift + shift + goto win9xME_args_slurp +) +if "x%~1" == "x-debug" ( + set JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xnoagent -Dgrails.full.stacktrace=true -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 + shift + goto win9xME_args_slurp +) +if "x%~1" == "x-classpath" ( + set CP=%~2 + shift + shift + goto win9xME_args_slurp +) +if "x%~1" == "x-reloading" ( + set AGENT=%AGENT_STRING% + shift + goto win9xME_args_slurp +) +if "x%~1" == "xrun-app" ( + set AGENT=%AGENT_STRING% + set INTERACTIVE= + set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 + shift + goto win9xME_args_slurp +) +if "x%~1" == "x-noreloading" ( + set DISABLE_RELOADING=true + shift + goto win9xME_args_slurp +) +set INTERACTIVE= +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto win9xME_args_slurp + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line +set STARTER_CLASSPATH=wrapper/grails-wrapper-runtime-2.3.0.jar;wrapper;. + +if exist "%USERPROFILE%/.groovy/init.bat" call "%USERPROFILE%/.groovy/init.bat" + +@rem Setting a classpath using the -cp or -classpath option means not to use +@rem the global classpath. Groovy behaves then the same as the java interpreter + +if "x" == "x%CLASSPATH%" goto after_classpath +set CP=%CP%;%CLASSPATH% +:after_classpath + +if "x%DISABLE_RELOADING%" == "xtrue" ( + set AGENT= +) else ( + if "x%INTERACTIVE%" == "xtrue" ( + set AGENT=%AGENT_STRING% + ) +) + +set STARTER_MAIN_CLASS=org.grails.wrapper.GrailsWrapper +set STARTER_CONF=%GRAILS_HOME%\conf\groovy-starter.conf + +set JAVA_EXE=%JAVA_HOME%\bin\java.exe +set TOOLS_JAR=%JAVA_HOME%\lib\tools.jar + +set JAVA_OPTS=%GRAILS_OPTS% %JAVA_OPTS% %AGENT% + +set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name="%PROGNAME%" +set JAVA_OPTS=%JAVA_OPTS% -Dgrails.home="%GRAILS_HOME%" +set JAVA_OPTS=%JAVA_OPTS% -Dgrails.version=2.3.0 +set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir=. +set JAVA_OPTS=%JAVA_OPTS% -Dtools.jar="%TOOLS_JAR%" +set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.starter.conf="%STARTER_CONF%" + +if exist "%USERPROFILE%/.groovy/postinit.bat" call "%USERPROFILE%/.groovy/postinit.bat" + +@rem Execute Grails +CALL "%JAVA_EXE%" %JAVA_OPTS% -classpath "%STARTER_CLASSPATH%" %STARTER_MAIN_CLASS% --main %CLASS% --conf "%STARTER_CONF%" --classpath "%CP%" "%CMD_LINE_ARGS%" +:end +@rem End local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" endlocal + +@rem Optional pause the batch file +if "%GROOVY_BATCH_PAUSE%" == "on" pause diff --git a/bigbluebutton-web/ivy.xml b/bigbluebutton-web/ivy.xml deleted file mode 100755 index 61f4d0e9052dcea33cb1cde5f3f070f7354623e7..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/ivy.xml +++ /dev/null @@ -1,28 +0,0 @@ -<ivy-module version="2.0"> - <info organisation="org.example" module="bigbluebutton"/> - <configurations defaultconfmapping="build->default;compile->compile(*),master(*);test,runtime->runtime(*),master(*)"> - <conf name="build"/> - <conf name="compile"/> - <conf name="test" extends="compile"/> - <conf name="runtime" extends="compile"/> - </configurations> - <dependencies> - <dependency org="org.grails" name="grails-bootstrap" rev="1.3.9" conf="build"/> - <dependency org="org.grails" name="grails-scripts" rev="1.3.9" conf="build"/> - <dependency org="org.grails" name="grails-gorm" rev="1.3.9" conf="compile"/> - <dependency org="org.grails" name="grails-web" rev="1.3.9" conf="compile"/> - <dependency org="org.grails" name="grails-test" rev="1.3.9" conf="test"/> - <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.5.5" conf="runtime"/> - <dependency org="opensymphony" name="oscache" rev="2.4" conf="runtime"> - <exclude org="javax.jms" module="jms" name="*" type="*" ext="*" conf="" matcher="exact"/> - <exclude org="commons-logging" module="commons-logging" name="*" type="*" ext="*" conf="" matcher="exact"/> - <exclude org="javax.servlet" module="servlet-api" name="*" type="*" ext="*" conf="" matcher="exact"/> - </dependency> - <dependency org="hsqldb" name="hsqldb" rev="1.8.0.5" conf="runtime"/> - <dependency org="net.sf.ehcache" name="ehcache" rev="1.5.0" conf="runtime"/> - <!-- - <dependency org="mysql" name="mysql-connector-java" rev="5.1.6" conf="runtime"/> - <dependency org="postgresql" name="postgresql" rev="8.3-603.jdbc3" conf="runtime"/> - --> - </dependencies> -</ivy-module> diff --git a/bigbluebutton-web/ivysettings.xml b/bigbluebutton-web/ivysettings.xml deleted file mode 100644 index 5972c9ad7d9e31576c537cbdc639778d46a71fe6..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/ivysettings.xml +++ /dev/null @@ -1,15 +0,0 @@ -<ivysettings> - <settings defaultResolver="codehaus-plus"/> - <include url="${ivy.default.settings.dir}/ivysettings-public.xml" /> - <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/> - <include url="${ivy.default.settings.dir}/ivysettings-local.xml" /> - <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/> - <resolvers> - <chain name="codehaus-plus" dual="true"> - <ibiblio name="codehaus-snapshots" root="http://snapshots.repository.codehaus.org" m2compatible="true" changingPattern=".*SNAPSHOT"/> - <ibiblio name="codehaus" root="http://repository.codehaus.org" m2compatible="true"/> - <ibiblio name="javanet" root="http://download.java.net/maven/2/" m2compatible="true"/> - <resolver ref="public"/> - </chain> - </resolvers> -</ivysettings> diff --git a/bigbluebutton-web/lib/activemq-core-5.1.0.jar b/bigbluebutton-web/lib/activemq-core-5.1.0.jar deleted file mode 100644 index 99fe85f36e197c5befe6ddd6dd1fb20df96e1371..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/lib/activemq-core-5.1.0.jar and /dev/null differ diff --git a/bigbluebutton-web/lib/asterisk-java-0.3.1.jar b/bigbluebutton-web/lib/asterisk-java-0.3.1.jar deleted file mode 100644 index b4ee62d75ef580ee08340fd9a8eddaa380896821..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/lib/asterisk-java-0.3.1.jar and /dev/null differ diff --git a/bigbluebutton-web/lib/commons-codec-1.3.jar b/bigbluebutton-web/lib/commons-codec-1.3.jar old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/lib/commons-httpclient.jar b/bigbluebutton-web/lib/commons-httpclient.jar old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/lib/geronimo-j2ee-management_1.0_spec-1.0.jar b/bigbluebutton-web/lib/geronimo-j2ee-management_1.0_spec-1.0.jar old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/lib/geronimo-jms_1.1_spec-1.0.jar b/bigbluebutton-web/lib/geronimo-jms_1.1_spec-1.0.jar deleted file mode 100644 index 42bf403e283386881e5751e88581c28b500012b7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/lib/geronimo-jms_1.1_spec-1.0.jar and /dev/null differ diff --git a/bigbluebutton-web/lib/mysql-connector-java-5.1.6-bin.jar b/bigbluebutton-web/lib/mysql-connector-java-5.1.6-bin.jar deleted file mode 100644 index 0539039f716034c4896c8eaa81c075c7fa3bc997..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/lib/mysql-connector-java-5.1.6-bin.jar and /dev/null differ diff --git a/bigbluebutton-web/lib/slf4j-api-1.5.6.jar b/bigbluebutton-web/lib/slf4j-api-1.5.6.jar deleted file mode 100755 index d794252336e627b38e183beaaa66c62192a97135..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/lib/slf4j-api-1.5.6.jar and /dev/null differ diff --git a/bigbluebutton-web/plugins/grails-jsecurity-0.3.zip b/bigbluebutton-web/plugins/grails-jsecurity-0.3.zip deleted file mode 100644 index d80baa094c2b7f701f85ac0f9bf75aadca5f36e5..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/plugins/grails-jsecurity-0.3.zip and /dev/null differ diff --git a/bigbluebutton-web/pom.xml b/bigbluebutton-web/pom.xml deleted file mode 100644 index 1b79537576cd68b374eac4ec870001f5ad1c2ee9..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/pom.xml +++ /dev/null @@ -1,316 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <groupId>org.bigbluebutton</groupId> - <artifactId>bigbluebutton</artifactId> - <packaging>war</packaging> - <version>0.70dev</version> - - <name>A custom grails project</name> - <description>A custom grails project</description> - <url>http://www.myorganization.org</url> - - <properties> - <grails.version>1.3.7</grails.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.grails</groupId> - <artifactId>grails-bootstrap</artifactId> - <version>${grails.version}</version> - <exclusions> - <exclusion> - <groupId>org.codehaus.gpars</groupId> - <artifactId>gpars</artifactId> - </exclusion> - <exclusion> - <groupId>org.codehaus.gant</groupId> - <artifactId>gant_groovy1.7</artifactId> - </exclusion> - <exclusion> - <groupId>org.gparallelizer</groupId> - <artifactId>GParallelizer</artifactId> - </exclusion> - <exclusion> - <groupId>org.codehaus.gant</groupId> - <artifactId>gant_groovy1.6</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant-launcher</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ivy</groupId> - <artifactId>ivy</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.grails</groupId> - <artifactId>grails-crud</artifactId> - <version>${grails.version}</version> - <exclusions> - <exclusion> - <groupId>org.grails</groupId> - <artifactId>grails-docs</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant-launcher</artifactId> - </exclusion> - <exclusion> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - </exclusion> - <exclusion> - <groupId>radeox</groupId> - <artifactId>radeox</artifactId> - </exclusion> - <exclusion> - <groupId>commons-digester</groupId> - <artifactId>commons-digester</artifactId> - </exclusion> - <exclusion> - <groupId>javax.persistence</groupId> - <artifactId>persistence-api</artifactId> - </exclusion> - <exclusion> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.grails</groupId> - <artifactId>grails-gorm</artifactId> - <version>${grails.version}</version> - <exclusions> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.ant</groupId> - <artifactId>ant-launcher</artifactId> - </exclusion> - <exclusion> - <groupId>commons-digester</groupId> - <artifactId>commons-digester</artifactId> - </exclusion> - <exclusion> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - </exclusion> - <exclusion> - <groupId>org.hibernate</groupId> - <artifactId>hibernate</artifactId> - </exclusion> - <exclusion> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-annotations</artifactId> - </exclusion> - <exclusion> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-commons-annotations</artifactId> - </exclusion> - <exclusion> - <groupId>antlr</groupId> - <artifactId>antlr</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.grails</groupId> - <artifactId>grails-test</artifactId> - <version>${grails.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jstl</artifactId> - <version>1.1.2</version> - </dependency> - - <dependency> - <groupId>taglibs</groupId> - <artifactId>standard</artifactId> - <version>1.1.2</version> - </dependency> - - <!-- Grails defaults to Ehache for the second-level Hibernate cache. --> - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-ehcache</artifactId> - <version>3.3.1.GA</version> - <exclusions> - <!-- See http://www.slf4j.org/faq.html#IllegalAccessError --> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </exclusion> - - <!-- We are pulling in ehcache-core below --> - <exclusion> - <groupId>net.sf.ehcache</groupId> - <artifactId>ehcache</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>net.sf.ehcache</groupId> - <artifactId>ehcache-core</artifactId> - <version>1.7.1</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </exclusion> - </exclusions> - </dependency> - - <!-- For ease of development and testing, we include the HSQLDB database. --> - <dependency> - <groupId>hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <version>1.8.0.10</version> - </dependency> - - <!-- Use Log4J for logging. This artifact also pulls in the Log4J JAR. --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.5.8</version> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.5.8</version> - <scope>runtime</scope> - </dependency> - - <!-- Needed in the case of AOP usage --> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjweaver</artifactId> - <version>1.6.8</version> - </dependency> - - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - <version>1.6.8</version> - </dependency> - - <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <version>1.3</version> - </dependency> - - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - <version>3.2.1</version> - </dependency> - - <dependency> - <groupId>commons-pool</groupId> - <artifactId>commons-pool</artifactId> - <version>1.5.3</version> - </dependency> - - </dependencies> - - <dependencyManagement> - <dependencies> - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - <version>1.2.16</version> - <scope>runtime</scope> - </dependency> - </dependencies> - </dependencyManagement> - - <repositories> - <!-- Required to get hold of javassist:javassist --> - <repository> - <id>jboss.org</id> - <name>jboss.org</name> - <url>http://repository.jboss.com/maven2/</url> - </repository> - </repositories> - - <build> - <pluginManagement /> - - <plugins> - <plugin> - <groupId>org.grails</groupId> - <artifactId>grails-maven-plugin</artifactId> - <version>${grails.version}</version> - <extensions>true</extensions> - <executions> - <execution> - <goals> - <goal>init</goal> - <goal>maven-clean</goal> - <goal>validate</goal> - <goal>config-directories</goal> - <goal>maven-compile</goal> - <goal>maven-test</goal> - <goal>maven-war</goal> - <goal>maven-functional-test</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>1.5</source> - <target>1.5</target> - </configuration> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>tools</id> - <activation> - <property> - <name>java.vendor</name> - <value>Sun Microsystems Inc.</value> - </property> - </activation> - <dependencies> - <dependency> - <groupId>com.sun</groupId> - <artifactId>tools</artifactId> - <version>${java.version}</version> - <scope>system</scope> - <systemPath>${java.home}/../lib/tools.jar</systemPath> - </dependency> - </dependencies> - </profile> - </profiles> -</project> diff --git a/bigbluebutton-web/scripts/sofficed.sh b/bigbluebutton-web/scripts/sofficed.sh deleted file mode 100755 index a756b2ed6c02a41cdef2f76d737ce1fb689dba5c..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/scripts/sofficed.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh -# openoffice.org headless server script -# -# chkconfig: 2345 80 30 -# description: headless openoffice server script -# processname: openoffice -# -# Author: Vic Vijayakumar -# Modified by Federico Ch. Tomasczik -# -OOo_HOME=/usr/bin -SOFFICE_PATH=$OOo_HOME/soffice -PIDFILE=/var/run/openoffice-server.pid -set -e -case "$1" in - start) - if [ -f $PIDFILE ]; then - echo "OpenOffice headless server has already started." - sleep 5 - exit - fi - echo "Starting OpenOffice headless server" - $SOFFICE_PATH -headless -nologo -nofirststartwizard -accept="socket,host=127.0.0.1,port=8100;urp" & > /dev/null 2>&1 - touch $PIDFILE - ;; - stop) - if [ -f $PIDFILE ]; then - echo "Stopping OpenOffice headless server." - killall -9 soffice && killall -9 soffice.bin - rm -f $PIDFILE - exit - fi - echo "Openoffice headless server is not running." - exit - ;; - *) - echo "Usage: $0 {start|stop}" - exit 1 -esac -exit 0 \ No newline at end of file diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java b/bigbluebutton-web/src/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java index 91238852b9b5a9659b4e96e42adf2919c3adb2de..5ddf09db959250a153ed013f1a9169585666676e 100755 --- a/bigbluebutton-web/src/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java +++ b/bigbluebutton-web/src/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java @@ -31,8 +31,6 @@ import org.bigbluebutton.presentation.UploadedPresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.mysql.jdbc.log.LogUtils; - public class ThumbnailCreatorImp implements ThumbnailCreator { private static Logger log = LoggerFactory.getLogger(ThumbnailCreatorImp.class); diff --git a/bigbluebutton-web/src/templates/artifacts/Controller.groovy b/bigbluebutton-web/src/templates/artifacts/Controller.groovy deleted file mode 100644 index 310a581152a1d49d8f4719aafc2d91afe2dfa44c..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/Controller.groovy +++ /dev/null @@ -1,4 +0,0 @@ -@artifact.package@class @artifact.name@ { - - def index = { } -} diff --git a/bigbluebutton-web/src/templates/artifacts/DomainClass.groovy b/bigbluebutton-web/src/templates/artifacts/DomainClass.groovy deleted file mode 100644 index 5a611dcde91055db7fb87fa6a7abec05b1c4ed69..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/DomainClass.groovy +++ /dev/null @@ -1,5 +0,0 @@ -@artifact.package@class @artifact.name@ { - - static constraints = { - } -} diff --git a/bigbluebutton-web/src/templates/artifacts/Filters.groovy b/bigbluebutton-web/src/templates/artifacts/Filters.groovy deleted file mode 100644 index da8ca60426521ad622368b7340be23e519c187d5..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/Filters.groovy +++ /dev/null @@ -1,17 +0,0 @@ -@artifact.package@class @artifact.name@ { - - def filters = { - all(controller:'*', action:'*') { - before = { - - } - after = { - - } - afterView = { - - } - } - } - -} diff --git a/bigbluebutton-web/src/templates/artifacts/Script.groovy b/bigbluebutton-web/src/templates/artifacts/Script.groovy deleted file mode 100644 index 2ba402050f6a59fc14487b44c5e23a5032ff5caa..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/Script.groovy +++ /dev/null @@ -1,7 +0,0 @@ -includeTargets << grailsScript("Init") - -target(main: "The description of the script goes here!") { - // TODO: Implement script here -} - -setDefaultTarget(main) diff --git a/bigbluebutton-web/src/templates/artifacts/Service.groovy b/bigbluebutton-web/src/templates/artifacts/Service.groovy deleted file mode 100644 index 4acf62614cdcae7881b0ef55efb085f2d5b3e3ef..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/Service.groovy +++ /dev/null @@ -1,8 +0,0 @@ -@artifact.package@class @artifact.name@ { - - boolean transactional = true - - def serviceMethod() { - - } -} diff --git a/bigbluebutton-web/src/templates/artifacts/TagLib.groovy b/bigbluebutton-web/src/templates/artifacts/TagLib.groovy deleted file mode 100644 index 8aea148ebcc900eaac947e7b88a15d2a68ad6705..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/TagLib.groovy +++ /dev/null @@ -1,3 +0,0 @@ -@artifact.package@class @artifact.name@ { - -} diff --git a/bigbluebutton-web/src/templates/artifacts/Tests.groovy b/bigbluebutton-web/src/templates/artifacts/Tests.groovy deleted file mode 100644 index 37c12e243d4d11e8ebc3b0f0ed5a8fd6b90844f6..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/Tests.groovy +++ /dev/null @@ -1,15 +0,0 @@ -@artifact.package@import grails.test.* - -class @artifact.name@ extends @artifact.superclass@ { - protected void setUp() { - super.setUp() - } - - protected void tearDown() { - super.tearDown() - } - - void testSomething() { - - } -} diff --git a/bigbluebutton-web/src/templates/artifacts/WebTest.groovy b/bigbluebutton-web/src/templates/artifacts/WebTest.groovy deleted file mode 100644 index d446d3533200a55da66c74c3b43c372507d6f68e..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/artifacts/WebTest.groovy +++ /dev/null @@ -1,54 +0,0 @@ -class @webtest.name.caps@Test extends grails.util.WebTest { - - // Unlike unit tests, functional tests are often sequence dependent. - // Specify that sequence here. - void suite() { - test@webtest.name.caps@ListNewDelete() - // add tests for more operations here - } - - def test@webtest.name.caps@ListNewDelete() { - webtest('@webtest.name.caps@ basic operations: view list, create new entry, view, edit, delete, view') { - invoke(url:'@webtest.name.lower@') - verifyText(text:'Home') - - verifyListPage(0) - - clickLink(label:'New @webtest.name.caps@') - verifyText(text:'Create @webtest.name.caps@') - clickButton(label:'Create') - verifyText(text:'Show @webtest.name.caps@', description:'Detail page') - clickLink(label:'List', description:'Back to list view') - - verifyListPage(1) - - group(description:'edit the one element') { - clickLink(label:'Show', description:'go to detail view') - clickButton(label:'Edit') - verifyText(text:'Edit @webtest.name.caps@') - clickButton(label:'Update') - verifyText(text:'Show @webtest.name.caps@') - clickLink(label:'List', description:'Back to list view') - } - - verifyListPage(1) - - group(description:'delete the only element') { - clickLink(label:'Show', description:'go to detail view') - clickButton(label:'Delete') - verifyXPath(xpath:"//div[@class='message']", text:/@webtest.name.caps@.*deleted./, regex:true) - } - - verifyListPage(0) - } - } - - String ROW_COUNT_XPATH = "count(//td[@class='actionButtons']/..)" - - def verifyListPage(int count) { - ant.group(description:"verify @webtest.name.caps@ list view with $count row(s)") { - verifyText(text:'@webtest.name.caps@ List') - verifyXPath(xpath:ROW_COUNT_XPATH, text:count, description:"$count row(s) of data expected") - } - } -} \ No newline at end of file diff --git a/bigbluebutton-web/src/templates/scaffolding/Controller.groovy b/bigbluebutton-web/src/templates/scaffolding/Controller.groovy deleted file mode 100644 index c9573b1c214be56379ee164feb432522f4dac218..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/Controller.groovy +++ /dev/null @@ -1,99 +0,0 @@ - - -<%=packageName ? "package ${packageName}\n\n" : ''%>class ${className}Controller { - - def index = { redirect(action:list,params:params) } - - // the delete, save and update actions only accept POST requests - static allowedMethods = [delete:'POST', save:'POST', update:'POST'] - - def list = { - params.max = Math.min( params.max ? params.max.toInteger() : 10, 100) - [ ${propertyName}List: ${className}.list( params ), ${propertyName}Total: ${className}.count() ] - } - - def show = { - def ${propertyName} = ${className}.get( params.id ) - - if(!${propertyName}) { - flash.message = "${className} not found with id \${params.id}" - redirect(action:list) - } - else { return [ ${propertyName} : ${propertyName} ] } - } - - def delete = { - def ${propertyName} = ${className}.get( params.id ) - if(${propertyName}) { - try { - ${propertyName}.delete(flush:true) - flash.message = "${className} \${params.id} deleted" - redirect(action:list) - } - catch(org.springframework.dao.DataIntegrityViolationException e) { - flash.message = "${className} \${params.id} could not be deleted" - redirect(action:show,id:params.id) - } - } - else { - flash.message = "${className} not found with id \${params.id}" - redirect(action:list) - } - } - - def edit = { - def ${propertyName} = ${className}.get( params.id ) - - if(!${propertyName}) { - flash.message = "${className} not found with id \${params.id}" - redirect(action:list) - } - else { - return [ ${propertyName} : ${propertyName} ] - } - } - - def update = { - def ${propertyName} = ${className}.get( params.id ) - if(${propertyName}) { - if(params.version) { - def version = params.version.toLong() - if(${propertyName}.version > version) { - <%def lowerCaseName = grails.util.GrailsNameUtils.getPropertyName(className)%> - ${propertyName}.errors.rejectValue("version", "${lowerCaseName}.optimistic.locking.failure", "Another user has updated this ${className} while you were editing.") - render(view:'edit',model:[${propertyName}:${propertyName}]) - return - } - } - ${propertyName}.properties = params - if(!${propertyName}.hasErrors() && ${propertyName}.save()) { - flash.message = "${className} \${params.id} updated" - redirect(action:show,id:${propertyName}.id) - } - else { - render(view:'edit',model:[${propertyName}:${propertyName}]) - } - } - else { - flash.message = "${className} not found with id \${params.id}" - redirect(action:list) - } - } - - def create = { - def ${propertyName} = new ${className}() - ${propertyName}.properties = params - return ['${propertyName}':${propertyName}] - } - - def save = { - def ${propertyName} = new ${className}(params) - if(!${propertyName}.hasErrors() && ${propertyName}.save()) { - flash.message = "${className} \${${propertyName}.id} created" - redirect(action:show,id:${propertyName}.id) - } - else { - render(view:'create',model:[${propertyName}:${propertyName}]) - } - } -} diff --git a/bigbluebutton-web/src/templates/scaffolding/create.gsp b/bigbluebutton-web/src/templates/scaffolding/create.gsp deleted file mode 100644 index 9488992b6414e051406d722203c29de7cf44ea7d..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/create.gsp +++ /dev/null @@ -1,62 +0,0 @@ -<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %> -<%=packageName%> -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>Create ${className}</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span> - <span class="menuButton"><g:link class="list" action="list">${className} List</g:link></span> - </div> - <div class="body"> - <h1>Create ${className}</h1> - <g:if test="\${flash.message}"> - <div class="message">\${flash.message}</div> - </g:if> - <g:hasErrors bean="\${${propertyName}}"> - <div class="errors"> - <g:renderErrors bean="\${${propertyName}}" as="list" /> - </div> - </g:hasErrors> - <g:form action="save" method="post" <%= multiPart ? ' enctype="multipart/form-data"' : '' %>> - <div class="dialog"> - <table> - <tbody> - <% - - excludedProps = ['version', - 'id', - Events.ONLOAD_EVENT, - Events.BEFORE_DELETE_EVENT, - Events.BEFORE_INSERT_EVENT, - Events.BEFORE_UPDATE_EVENT] - props = domainClass.properties.findAll { !excludedProps.contains(it.name) } - - Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) - props.each { p -> - if(!Collection.class.isAssignableFrom(p.type)) { - cp = domainClass.constrainedProperties[p.name] - display = (cp ? cp.display : true) - if(display) { %> - <tr class="prop"> - <td valign="top" class="name"> - <label for="${p.name}">${p.naturalName}:</label> - </td> - <td valign="top" class="value \${hasErrors(bean:${propertyName},field:'${p.name}','errors')}"> - ${renderEditor(p)} - </td> - </tr> - <% } } } %> - </tbody> - </table> - </div> - <div class="buttons"> - <span class="button"><input class="save" type="submit" value="Create" /></span> - </div> - </g:form> - </div> - </body> -</html> diff --git a/bigbluebutton-web/src/templates/scaffolding/edit.gsp b/bigbluebutton-web/src/templates/scaffolding/edit.gsp deleted file mode 100644 index a1c6bf511e7886b33a680205495e9a09b8ed416e..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/edit.gsp +++ /dev/null @@ -1,64 +0,0 @@ -<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %> -<%=packageName%> -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>Edit ${className}</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span> - <span class="menuButton"><g:link class="list" action="list">${className} List</g:link></span> - <span class="menuButton"><g:link class="create" action="create">New ${className}</g:link></span> - </div> - <div class="body"> - <h1>Edit ${className}</h1> - <g:if test="\${flash.message}"> - <div class="message">\${flash.message}</div> - </g:if> - <g:hasErrors bean="\${${propertyName}}"> - <div class="errors"> - <g:renderErrors bean="\${${propertyName}}" as="list" /> - </div> - </g:hasErrors> - <g:form method="post" <%= multiPart ? ' enctype="multipart/form-data"' : '' %>> - <input type="hidden" name="id" value="\${${propertyName}?.id}" /> - <input type="hidden" name="version" value="\${${propertyName}?.version}" /> - <div class="dialog"> - <table> - <tbody> - <% - excludedProps = ['version', - 'id', - Events.ONLOAD_EVENT, - Events.BEFORE_DELETE_EVENT, - Events.BEFORE_INSERT_EVENT, - Events.BEFORE_UPDATE_EVENT] - props = domainClass.properties.findAll { !excludedProps.contains(it.name) } - - Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) - props.each { p -> - cp = domainClass.constrainedProperties[p.name] - display = (cp ? cp.display : true) - if(display) { %> - <tr class="prop"> - <td valign="top" class="name"> - <label for="${p.name}">${p.naturalName}:</label> - </td> - <td valign="top" class="value \${hasErrors(bean:${propertyName},field:'${p.name}','errors')}"> - ${renderEditor(p)} - </td> - </tr> - <% } } %> - </tbody> - </table> - </div> - <div class="buttons"> - <span class="button"><g:actionSubmit class="save" value="Update" /></span> - <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span> - </div> - </g:form> - </div> - </body> -</html> diff --git a/bigbluebutton-web/src/templates/scaffolding/list.gsp b/bigbluebutton-web/src/templates/scaffolding/list.gsp deleted file mode 100644 index d3931a286e40d77ea45ec4a05146f624a5d20fcc..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/list.gsp +++ /dev/null @@ -1,60 +0,0 @@ -<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %> -<%=packageName%> -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>${className} List</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span> - <span class="menuButton"><g:link class="create" action="create">New ${className}</g:link></span> - </div> - <div class="body"> - <h1>${className} List</h1> - <g:if test="\${flash.message}"> - <div class="message">\${flash.message}</div> - </g:if> - <div class="list"> - <table> - <thead> - <tr> - <% - excludedProps = ['version', - Events.ONLOAD_EVENT, - Events.BEFORE_DELETE_EVENT, - Events.BEFORE_INSERT_EVENT, - Events.BEFORE_UPDATE_EVENT] - - props = domainClass.properties.findAll { !excludedProps.contains(it.name) && it.type != Set.class } - Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) - props.eachWithIndex { p,i -> - if(i < 6) { - if(p.isAssociation()) { %> - <th>${p.naturalName}</th> - <% } else { %> - <g:sortableColumn property="${p.name}" title="${p.naturalName}" /> - <% } } } %> - </tr> - </thead> - <tbody> - <g:each in="\${${propertyName}List}" status="i" var="${propertyName}"> - <tr class="\${(i % 2) == 0 ? 'odd' : 'even'}"> - <% props.eachWithIndex { p,i -> - if(i == 0) { %> - <td><g:link action="show" id="\${${propertyName}.id}">\${fieldValue(bean:${propertyName}, field:'${p.name}')}</g:link></td> - <% } else if(i < 6) { %> - <td>\${fieldValue(bean:${propertyName}, field:'${p.name}')}</td> - <% } } %> - </tr> - </g:each> - </tbody> - </table> - </div> - <div class="paginateButtons"> - <g:paginate total="\${${propertyName}Total}" /> - </div> - </div> - </body> -</html> diff --git a/bigbluebutton-web/src/templates/scaffolding/renderEditor.template b/bigbluebutton-web/src/templates/scaffolding/renderEditor.template deleted file mode 100644 index 192df05ad2dfe041f85fcb8199d502f55d996eed..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/renderEditor.template +++ /dev/null @@ -1,190 +0,0 @@ -<% if(property.type == Boolean.class || property.type == boolean.class) - out << renderBooleanEditor(domainClass,property) - else if(Number.class.isAssignableFrom(property.type) || (property.type.isPrimitive() && property.type != boolean.class)) - out << renderNumberEditor(domainClass,property) - else if(property.type == String.class) - out << renderStringEditor(domainClass,property) - else if(property.type == Date.class || property.type == java.sql.Date.class || property.type == java.sql.Time.class) - out << renderDateEditor(domainClass,property) - else if(property.type == Calendar.class) - out << renderDateEditor(domainClass,property) - else if(property.type == URL.class) - out << renderStringEditor(domainClass,property) - else if(property.isEnum()) - out << renderEnumEditor(domainClass,property) - else if(property.type == TimeZone.class) - out << renderSelectTypeEditor("timeZone",domainClass,property) - else if(property.type == Locale.class) - out << renderSelectTypeEditor("locale",domainClass,property) - else if(property.type == Currency.class) - out << renderSelectTypeEditor("currency",domainClass,property) - else if(property.type==([] as Byte[]).class) //TODO: Bug in groovy means i have to do this :( - out << renderByteArrayEditor(domainClass,property) - else if(property.type==([] as byte[]).class) //TODO: Bug in groovy means i have to do this :( - out << renderByteArrayEditor(domainClass,property) - else if(property.manyToOne || property.oneToOne) - out << renderManyToOne(domainClass,property) - else if((property.oneToMany && !property.bidirectional) || (property.manyToMany && property.isOwningSide())) - out << renderManyToMany(domainClass, property) - else if(property.oneToMany) - out << renderOneToMany(domainClass,property) - - private renderEnumEditor(domainClass,property) { - if(property.isEnum()) { - return "<g:select from=\"\${${property.type.name}?.values()}\" value=\"\${${domainInstance}?.${property.name}}\" name=\"${property.name}\" ${renderNoSelection(property)}></g:select>" - } - } - - private renderStringEditor(domainClass, property) { - if(!cp) { - return "<input type=\"text\" name=\"${property.name}\" id=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" - } - else { - if("textarea" == cp.widget || (cp.maxSize > 250 && !cp.password && !cp.inList)) { - return "<textarea rows=\"5\" cols=\"40\" name=\"${property.name}\">\${fieldValue(bean:${domainInstance}, field:'${property.name}')}</textarea>" - } - else { - if(cp.inList) { - def sb = new StringBuffer('<g:select ') - sb << "id=\"${property.name}\" name=\"${property.name}\" from=\"\${${domainInstance}.constraints.${property.name}.inList}\" value=\"\${${domainInstance}.${property?.name}}\" ${renderNoSelection(property)}>" - sb << '</g:select>' - return sb.toString() - } - else { - def sb = new StringBuffer('<input ') - cp.password ? sb << 'type="password" ' : sb << 'type="text" ' - if(!cp.editable) sb << 'readonly="readonly" ' - if(cp.maxSize) sb << "maxlength=\"${cp.maxSize}\" " - sb << "id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\"/>" - return sb.toString() - } - } - } - } - - private renderByteArrayEditor(domainClass,property) { - return "<input type=\"file\" id=\"${property.name}\" name=\"${property.name}\" />" - } - - private renderManyToOne(domainClass,property) { - if(property.association) { - return "<g:select optionKey=\"id\" from=\"\${${property.type.name}.list()}\" name=\"${property.name}.id\" value=\"\${${domainInstance}?.${property.name}?.id}\" ${renderNoSelection(property)}></g:select>" - } - } - - private renderManyToMany(domainClass,property) { - def sw = new StringWriter() - def pw = new PrintWriter(sw) - - pw.println "<g:select name=\"${property.name}\"" - pw.println "from=\"\${${property.referencedDomainClass.fullName}.list()}\"" - pw.println "size=\"5\" multiple=\"yes\" optionKey=\"id\"" - pw.println "value=\"\${${domainInstance}?.${property.name}}\" />" - - return sw.toString() - } - - private renderOneToMany(domainClass,property) { - def sw = new StringWriter() - def pw = new PrintWriter(sw) - pw.println() - pw.println "<ul>" - pw.println "<g:each var=\"${property.name[0]}\" in=\"\${${domainInstance}?.${property.name}?}\">" - pw.println " <li><g:link controller=\"${property.referencedDomainClass.propertyName}\" action=\"show\" id=\"\${${property.name[0]}.id}\">\${${property.name[0]}?.encodeAsHTML()}</g:link></li>" - pw.println "</g:each>" - pw.println "</ul>" - pw.println "<g:link controller=\"${property.referencedDomainClass.propertyName}\" params=\"['${domainClass.propertyName}.id':${domainInstance}?.id]\" action=\"create\">Add ${property.referencedDomainClass.shortName}</g:link>" - return sw.toString() - } - - private renderNumberEditor(domainClass,property) { - if(!cp) { - if(property.type == Byte.class) { - return "<g:select from=\"\${-128..127}\" name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:select>" - } - else { - return "<input type=\"text\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" - } - } - else { - if(cp.range) { - return "<g:select from=\"\${${cp.range.from}..${cp.range.to}}\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" ${renderNoSelection(property)}></g:select>" - } - else if(cp.inList) { - def sb = new StringBuffer('<g:select ') - sb << "id=\"${property.name}\" name=\"${property.name}\" from=\"\${${domainClass.propertyName}.constraints.${property.name}.inList}\" value=\"\${${domainClass.propertyName}.${property?.name}}\" ${renderNoSelection(property)}>" - sb << '</g:select>' - return sb.toString() - } - else { - return "<input type=\"text\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" - } - } - } - - private renderBooleanEditor(domainClass,property) { - if(!cp) { - return "<g:checkBox name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:checkBox>" - } - else { - def buf = new StringBuffer('<g:checkBox ') - if(cp.widget) buf << "widget=\"${cp.widget}\""; - - buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" " - cp.attributes.each { k,v -> - buf << "${k}=\"${v}\" " - } - buf << '></g:checkBox>' - return buf.toString() - } - } - - private renderDateEditor(domainClass,property) { - def precision = property.type == java.sql.Date ? 'day' : 'minute'; - if(!cp) { - return "<g:datePicker name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" precision=\"${precision}\"></g:datePicker>" - } - else { - if(!cp.editable) { - return "\${${domainInstance}?.${property.name}?.toString()}" - } - else { - def buf = new StringBuffer('<g:datePicker ') - if(cp.widget) buf << "widget=\"${cp.widget}\" " - if(cp.format) buf << "format=\"${cp.format}\" " - cp.attributes.each { k,v -> - buf << "${k}=\"${v}\" " - } - buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" precision=\"${precision}\" ${renderNoSelection(property)}></g:datePicker>" - return buf.toString() - } - } - } - - private renderSelectTypeEditor(type,domainClass,property) { - if(!cp) { - return "<g:${type}Select name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:${type}Select>" - } - else { - def buf = new StringBuffer("<g:${type}Select ") - if(cp.widget) buf << "widget=\"${cp.widget}\" "; - cp.attributes.each { k,v -> - buf << "${k}=\"${v}\" " - } - buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" ${renderNoSelection(property)}></g:${type}Select>" - return buf.toString() - } - } - - private renderNoSelection(property) { - if(property.optional) { - if(property.manyToOne || property.oneToOne) { - return "noSelection=\"['null':'']\"" - } - else { - return "noSelection=\"['':'']\"" - } - } - return "" - } -%> \ No newline at end of file diff --git a/bigbluebutton-web/src/templates/scaffolding/show.gsp b/bigbluebutton-web/src/templates/scaffolding/show.gsp deleted file mode 100644 index 42333be7c7673d2beda2ef4aea2ed77f35c0b863..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/scaffolding/show.gsp +++ /dev/null @@ -1,64 +0,0 @@ -<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %> -<%=packageName%> -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <meta name="layout" content="main" /> - <title>Show ${className}</title> - </head> - <body> - <div class="nav"> - <span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span> - <span class="menuButton"><g:link class="list" action="list">${className} List</g:link></span> - <span class="menuButton"><g:link class="create" action="create">New ${className}</g:link></span> - </div> - <div class="body"> - <h1>Show ${className}</h1> - <g:if test="\${flash.message}"> - <div class="message">\${flash.message}</div> - </g:if> - <div class="dialog"> - <table> - <tbody> - - <% - excludedProps = ['version', - Events.ONLOAD_EVENT, - Events.BEFORE_DELETE_EVENT, - Events.BEFORE_INSERT_EVENT, - Events.BEFORE_UPDATE_EVENT] - props = domainClass.properties.findAll { !excludedProps.contains(it.name) } - Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) - props.each { p -> %> - <tr class="prop"> - <td valign="top" class="name">${p.naturalName}:</td> - <% if(p.isEnum()) { %> - <td valign="top" class="value">\${${propertyName}?.${p.name}?.encodeAsHTML()}</td> - <% } else if(p.oneToMany || p.manyToMany) { %> - <td valign="top" style="text-align:left;" class="value"> - <ul> - <g:each var="${p.name[0]}" in="\${${propertyName}.${p.name}}"> - <li><g:link controller="${p.referencedDomainClass?.propertyName}" action="show" id="\${${p.name[0]}.id}">\${${p.name[0]}?.encodeAsHTML()}</g:link></li> - </g:each> - </ul> - </td> - <% } else if(p.manyToOne || p.oneToOne) { %> - <td valign="top" class="value"><g:link controller="${p.referencedDomainClass?.propertyName}" action="show" id="\${${propertyName}?.${p.name}?.id}">\${${propertyName}?.${p.name}?.encodeAsHTML()}</g:link></td> - <% } else { %> - <td valign="top" class="value">\${fieldValue(bean:${propertyName}, field:'${p.name}')}</td> - <% } %> - </tr> - <% } %> - </tbody> - </table> - </div> - <div class="buttons"> - <g:form> - <input type="hidden" name="id" value="\${${propertyName}?.id}" /> - <span class="button"><g:actionSubmit class="edit" value="Edit" /></span> - <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span> - </g:form> - </div> - </div> - </body> -</html> diff --git a/bigbluebutton-web/src/templates/war/web.xml b/bigbluebutton-web/src/templates/war/web.xml deleted file mode 100644 index 5387edef57201da2594e3e489b39bb77cfd9ca6b..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/src/templates/war/web.xml +++ /dev/null @@ -1,107 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<web-app version="2.4" - 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-app_2_4.xsd"> - <display-name>/@grails.project.key@</display-name> - - - <context-param> - <param-name>contextConfigLocation</param-name> - <param-value>/WEB-INF/applicationContext.xml</param-value> - </context-param> - - <context-param> - <param-name>webAppRootKey</param-name> - <param-value>@grails.project.key@</param-value> - </context-param> - - <filter> - <filter-name>sitemesh</filter-name> - <filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class> - </filter> - - <filter> - <filter-name>charEncodingFilter</filter-name> - <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> - <init-param> - <param-name>targetBeanName</param-name> - <param-value>characterEncodingFilter</param-value> - </init-param> - <init-param> - <param-name>targetFilterLifecycle</param-name> - <param-value>true</param-value> - </init-param> - </filter> - - <filter-mapping> - <filter-name>charEncodingFilter</filter-name> - <url-pattern>/*</url-pattern> - </filter-mapping> - - <filter-mapping> - <filter-name>sitemesh</filter-name> - <url-pattern>/*</url-pattern> - </filter-mapping> - - <listener> - <!-- There is a problem with logging in production for Grails 1.1.1. We cannot get it to work - when deployed to Tomcat. To get logging working is to create this customer web.xml changing - the Log4jConfigListener to Spring and providing our own log4j.properties. When upgrading - Grails, we need to revisit this problem. (ralam, jan 6, 2010) --> - <!--listener-class>org.codehaus.groovy.grails.web.util.Log4jConfigListener</listener-class--> - <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> - </listener> - - <listener> - <listener-class>org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener</listener-class> - </listener> - - <!-- Grails dispatcher servlet --> - <servlet> - <servlet-name>grails</servlet-name> - <servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class> - <load-on-startup>1</load-on-startup> - </servlet> - - <!-- The Groovy Server Pages servlet --> - <servlet> - <servlet-name>gsp</servlet-name> - <servlet-class>org.codehaus.groovy.grails.web.pages.GroovyPagesServlet</servlet-class> - </servlet> - - <servlet-mapping> - <servlet-name>gsp</servlet-name> - <url-pattern>*.gsp</url-pattern> - </servlet-mapping> - - <welcome-file-list> - <!-- - The order of the welcome pages is important. JBoss deployment will - break if index.gsp is first in the list. - --> - <welcome-file>index.html</welcome-file> - <welcome-file>index.jsp</welcome-file> - <welcome-file>index.gsp</welcome-file> - </welcome-file-list> - - <jsp-config> - <taglib> - <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> - <taglib-location>/WEB-INF/tld/c.tld</taglib-location> - </taglib> - <taglib> - <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri> - <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location> - </taglib> - <taglib> - <taglib-uri>http://www.springframework.org/tags</taglib-uri> - <taglib-location>/WEB-INF/tld/spring.tld</taglib-location> - </taglib> - <taglib> - <taglib-uri>http://grails.codehaus.org/tags</taglib-uri> - <taglib-location>/WEB-INF/tld/grails.tld</taglib-location> - </taglib> - </jsp-config> - -</web-app> \ No newline at end of file diff --git a/bigbluebutton-web/test/resources/3-07_CPAC_Straw_Poll.ppt b/bigbluebutton-web/test/resources/3-07_CPAC_Straw_Poll.ppt old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/Barn Raising Final.ppt b/bigbluebutton-web/test/resources/Barn Raising Final.ppt deleted file mode 100644 index f79122b2e654f584eb10402fd3c0c66b4e5b87fd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/test/resources/Barn Raising Final.ppt and /dev/null differ diff --git a/bigbluebutton-web/test/resources/CaratulasManualesNutrisol.pdf b/bigbluebutton-web/test/resources/CaratulasManualesNutrisol.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/Energy_and_Climate_Courses.xls b/bigbluebutton-web/test/resources/Energy_and_Climate_Courses.xls old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/GoodPresentation.pdf b/bigbluebutton-web/test/resources/GoodPresentation.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/OneBigPagePresentation.pdf b/bigbluebutton-web/test/resources/OneBigPagePresentation.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/OnePage.pdf b/bigbluebutton-web/test/resources/OnePage.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/PresentationsTips.pdf b/bigbluebutton-web/test/resources/PresentationsTips.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/SeveralBigPagesPresentation.pdf b/bigbluebutton-web/test/resources/SeveralBigPagesPresentation.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/big-lots-of-objects.pdf b/bigbluebutton-web/test/resources/big-lots-of-objects.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/big.pdf b/bigbluebutton-web/test/resources/big.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/blankpresentation.pdf b/bigbluebutton-web/test/resources/blankpresentation.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/folb_apha.ppt b/bigbluebutton-web/test/resources/folb_apha.ppt old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/sample-presentation.pdf b/bigbluebutton-web/test/resources/sample-presentation.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/sampleslide.jpeg b/bigbluebutton-web/test/resources/sampleslide.jpeg old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/resources/secure-slides.pdf b/bigbluebutton-web/test/resources/secure-slides.pdf old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy b/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy deleted file mode 100755 index d6facaeffdf81390719ea937a58116fa45f5ce00..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton.api; - -class UtilTest extends GroovyTestCase { - - void testPresentationFilename() { - String filename = Util.cleanPresentationFilename("mypresentation%#@foo.txt"); - assertTrue(filename.equals("mypresentation---foo.txt")) - } - - void testPresentationFilenameThatBeginsWithDot() { - String filename = Util.cleanPresentationFilename(".mypresentation%#@foo.txt"); - assertTrue(filename.equals("mypresentation---foo.txt")) - } - - void testPresentationFilenameWithMultipleDot() { - String filename = Util.cleanPresentationFilename(".mypresentation%#@foo.txt.png"); - assertTrue(filename.equals("mypresentation---foo.txt.png")) - } -} \ No newline at end of file diff --git a/bigbluebutton-web/vm-build-debug.sh b/bigbluebutton-web/vm-build-debug.sh deleted file mode 100755 index 9cc0fee371e4b1fd0aaabf3b272f0c6045e0c821..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/vm-build-debug.sh +++ /dev/null @@ -1,14 +0,0 @@ -pushd . - -# stop -sudo /etc/init.d/tomcat6 stop - -# build -cd ~/dev/source/bigbluebutton/bigbluebutton-web -gradle resolveDeps - -# run -ant - -# return to working dir -popd diff --git a/bigbluebutton-web/vm-build.sh b/bigbluebutton-web/vm-build.sh deleted file mode 100755 index 00ee1ab09c4a43a6e7a99a7cabd9836938505aeb..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/vm-build.sh +++ /dev/null @@ -1 +0,0 @@ -gradle resolveDeps && ant diff --git a/bigbluebutton-web/web-app/WEB-INF/applicationContext.xml b/bigbluebutton-web/web-app/WEB-INF/applicationContext.xml old mode 100644 new mode 100755 index 6f427963b3a82a3ec5a1322116563b7e5fb7cfdf..a48dec085c539f2eeede891da725e48d9ba4077b --- a/bigbluebutton-web/web-app/WEB-INF/applicationContext.xml +++ b/bigbluebutton-web/web-app/WEB-INF/applicationContext.xml @@ -1,42 +1,34 @@ <?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"> + 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.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" /> + <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" /> + <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="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="grailsResourceLoader" class="org.codehaus.groovy.grails.commons.GrailsResourceLoaderFactoryBean"> - <property name="grailsResourceHolder" ref="grailsResourceHolder" /> - </bean> + <bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter"> + <property name="encoding"> + <value>utf-8</value> + </property> + </bean> - <bean id="grailsResourceHolder" scope="prototype" class="org.codehaus.groovy.grails.commons.spring.GrailsResourceHolder"> - <property name="resources"> - <value>classpath*:**/grails-app/**/*.groovy</value> - </property> - </bean> - - <bean id="characterEncodingFilter" - class="org.springframework.web.filter.CharacterEncodingFilter"> - <property name="encoding"> - <value>utf-8</value> - </property> - </bean> + <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" /> </beans> \ No newline at end of file diff --git a/bigbluebutton-web/web-app/WEB-INF/sitemesh.xml b/bigbluebutton-web/web-app/WEB-INF/sitemesh.xml old mode 100644 new mode 100755 index a547b41ae75dc3e3b081aad61459335ed9059c33..72399ceca6a4441be771cdee9f82056f5d86366a --- a/bigbluebutton-web/web-app/WEB-INF/sitemesh.xml +++ b/bigbluebutton-web/web-app/WEB-INF/sitemesh.xml @@ -5,7 +5,7 @@ <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" /> + class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" /> </page-parsers> <decorator-mappers> diff --git a/bigbluebutton-web/web-app/WEB-INF/tld/c.tld b/bigbluebutton-web/web-app/WEB-INF/tld/c.tld old mode 100644 new mode 100755 index 22698c97dcbeaab361c8ab511d949ac26ba507ff..5e18236fefd8f106dba161507c69772a522db6ed --- a/bigbluebutton-web/web-app/WEB-INF/tld/c.tld +++ b/bigbluebutton-web/web-app/WEB-INF/tld/c.tld @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> -<taglib xmlns="http://java.sun.com/xml/ns/j2ee" +<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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" - version="2.0"> - - <description>JSTL 1.1 core library</description> + 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.1</tlib-version> + <tlib-version>1.2</tlib-version> <short-name>c</short-name> <uri>http://java.sun.com/jsp/jstl/core</uri> @@ -74,7 +74,7 @@ not the body content should be processed. <description> Name of the exported scoped variable for the resulting value of the test condition. The type -of the scoped variable is Boolean. +of the scoped variable is Boolean. </description> <name>var</name> <required>false</required> @@ -174,6 +174,9 @@ Collection of items to iterate over. <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.Object</type> + <deferred-value> + <type>java.lang.Object</type> + </deferred-value> </attribute> <attribute> <description> @@ -253,6 +256,9 @@ String of tokens to iterate over. <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> + <deferred-value> + <type>java.lang.String</type> + </deferred-value> </attribute> <attribute> <description> @@ -322,7 +328,7 @@ visibility. <tag> <description> Like <%= ... >, but for expressions. - </description> + </description> <name>out</name> <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class> <body-content>JSP</body-content> @@ -467,6 +473,9 @@ Expression to be evaluated. <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> + <deferred-value> + <type>java.lang.Object</type> + </deferred-value> </attribute> <attribute> <description> diff --git a/bigbluebutton-web/web-app/WEB-INF/tld/fmt.tld b/bigbluebutton-web/web-app/WEB-INF/tld/fmt.tld old mode 100644 new mode 100755 index 3b9a54a87dcd8b5231cbcd3561aee637595fdae3..2ae47762dac24521091f29ee6d356c3219ec8b5c --- a/bigbluebutton-web/web-app/WEB-INF/tld/fmt.tld +++ b/bigbluebutton-web/web-app/WEB-INF/tld/fmt.tld @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> -<taglib xmlns="http://java.sun.com/xml/ns/j2ee" +<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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" - version="2.0"> - - <description>JSTL 1.1 i18n-capable formatting library</description> + 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.1</tlib-version> + <tlib-version>1.2</tlib-version> <short-name>fmt</short-name> <uri>http://java.sun.com/jsp/jstl/fmt</uri> @@ -55,7 +55,7 @@ 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> @@ -496,7 +496,7 @@ Date and/or time to be formatted. <description> Specifies whether the time, the date, or both the time and date components of the given -date are to be formatted. +date are to be formatted. </description> <name>type</name> <required>false</required> diff --git a/bigbluebutton-web/web-app/WEB-INF/tld/grails.tld b/bigbluebutton-web/web-app/WEB-INF/tld/grails.tld old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/WEB-INF/tld/spring-form.tld b/bigbluebutton-web/web-app/WEB-INF/tld/spring-form.tld new file mode 100755 index 0000000000000000000000000000000000000000..1520a6860412848086674193c58558f2fb0bbb9c --- /dev/null +++ b/bigbluebutton-web/web-app/WEB-INF/tld/spring-form.tld @@ -0,0 +1,2411 @@ +<?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>Spring Framework JSP Form Tag Library</description> + <tlib-version>3.0</tlib-version> + <short-name>form</short-name> + <uri>http://www.springframework.org/tags/form</uri> + + <tag> + <description>Renders an HTML 'form' tag and exposes a binding path to inner tags for binding.</description> + <name>form</name> + <tag-class>org.springframework.web.servlet.tags.form.FormTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute - added for backwards compatibility cases</description> + <name>name</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the model attribute under which the form object is exposed. + Defaults to 'command'.</description> + <name>modelAttribute</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the model attribute under which the form object is exposed. + Defaults to 'command'.</description> + <name>commandName</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Required Attribute</description> + <name>action</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>method</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>target</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>enctype</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Specifies the list of character encodings for input data that is accepted by the server processing this form. The value is a space- and/or comma-delimited list of charset values. The client must interpret this list as an exclusive-or list, i.e., the server is able to accept any single character encoding per entity received.</description> + <name>acceptCharset</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onsubmit</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onreset</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Common Optional Attribute</description> + <name>autocomplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The parameter name used for HTTP methods other then GET and POST. Default is '_method'</description> + <name>methodParam</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description> + <name>input</name> + <tag-class>org.springframework.web.servlet.tags.form.InputTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>size</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>maxlength</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>alt</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onselect</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will make the HTML element readonly.</description> + <name>readonly</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Common Optional Attribute</description> + <name>autocomplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'input' tag with type 'password' using the bound value.</description> + <name>password</name> + <tag-class>org.springframework.web.servlet.tags.form.PasswordInputTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>size</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>maxlength</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>alt</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onselect</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will make the HTML element readonly.</description> + <name>readonly</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Common Optional Attribute</description> + <name>autocomplete</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Is the password value to be shown? Defaults to false.</description> + <name>showPassword</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'input' tag with type 'hidden' using the bound value.</description> + <name>hidden</name> + <tag-class>org.springframework.web.servlet.tags.form.HiddenInputTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'select' element. Supports databinding to the selected option.</description> + <name>select</name> + <tag-class>org.springframework.web.servlet.tags.form.SelectTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The Collection, Map or array of objects used to generate the inner 'option' tags</description> + <name>items</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to 'value' attribute of the 'option' tag</description> + <name>itemValue</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to the inner text of the 'option' tag</description> + <name>itemLabel</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>size</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>multiple</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders a single HTML 'option'. Sets 'selected' as appropriate based on bound value.</description> + <name>option</name> + <tag-class>org.springframework.web.servlet.tags.form.OptionTag</tag-class> + <body-content>JSP</body-content> + <variable> + <description>The actual value bound to the 'value' attribute</description> + <name-given>value</name-given> + <variable-class>java.lang.Object</variable-class> + </variable> + <variable> + <description>The String representation of thr value bound to the 'value' attribute, taking into consideration + any PropertyEditor associated with the enclosing 'select' tag.</description> + <name-given>displayValue</name-given> + <variable-class>java.lang.String</variable-class> + </variable> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>label</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders a list of HTML 'option' tags. Sets 'selected' as appropriate based on bound value.</description> + <name>options</name> + <tag-class>org.springframework.web.servlet.tags.form.OptionsTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The Collection, Map or array of objects used to generate the inner 'option' tags. This attribute is required unless the containing select's property for data binding is an Enum, in which case the enum's values are used.</description> + <name>items</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to 'value' attribute of the 'option' tag</description> + <name>itemValue</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to the inner text of the 'option' tag</description> + <name>itemLabel</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'input' tag with type 'radio'.</description> + <name>radiobutton</name> + <tag-class>org.springframework.web.servlet.tags.form.RadioButtonTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Value to be displayed as part of the tag</description> + <name>label</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders multiple HTML 'input' tags with type 'radio'.</description> + <name>radiobuttons</name> + <tag-class>org.springframework.web.servlet.tags.form.RadioButtonsTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The Collection, Map or array of objects used to generate the 'input' tags with type 'radio'. This attribute is required unless the property for data binding is an Enum, in which case the enum's values are used.</description> + <name>items</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to 'value' attribute of the 'input' tags with type 'radio'</description> + <name>itemValue</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Value to be displayed as part of the 'input' tags with type 'radio'</description> + <name>itemLabel</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Delimiter to use between each 'input' tag with type 'radio'. There is no delimiter by default.</description> + <name>delimiter</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Specifies the HTML element that is used to enclose each 'input' tag with type 'radio'. Defaults to 'span'.</description> + <name>element</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'input' tag with type 'checkbox'.</description> + <name>checkbox</name> + <tag-class>org.springframework.web.servlet.tags.form.CheckboxTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute</description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Value to be displayed as part of the tag</description> + <name>label</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders multiple HTML 'input' tags with type 'checkbox'.</description> + <name>checkboxes</name> + <tag-class>org.springframework.web.servlet.tags.form.CheckboxesTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The Collection, Map or array of objects used to generate the 'input' tags with type 'checkbox'</description> + <name>items</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Name of the property mapped to 'value' attribute of the 'input' tags with type 'checkbox'</description> + <name>itemValue</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Value to be displayed as part of the 'input' tags with type 'checkbox'</description> + <name>itemLabel</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Delimiter to use between each 'input' tag with type 'checkbox'. There is no delimiter by default.</description> + <name>delimiter</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Specifies the HTML element that is used to enclose each 'input' tag with type 'checkbox'. Defaults to 'span'.</description> + <name>element</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'textarea'.</description> + <name>textarea</name> + <tag-class>org.springframework.web.servlet.tags.form.TextareaTag</tag-class> + <body-content>empty</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used when the bound field has errors.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onfocus</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onblur</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onchange</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Required Attribute</description> + <name>rows</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Required Attribute</description> + <name>cols</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onselect</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will make the HTML element readonly.</description> + <name>readonly</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders field errors in an HTML 'span' tag.</description> + <name>errors</name> + <tag-class>org.springframework.web.servlet.tags.form.ErrorsTag</tag-class> + <body-content>JSP</body-content> + <variable> + <name-given>messages</name-given> + <variable-class>java.util.List</variable-class> + </variable> + <attribute> + <description>Path to errors object for data binding</description> + <name>path</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Delimiter for displaying multiple error messages. Defaults to the br tag.</description> + <name>delimiter</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Specifies the HTML element that is used to render the enclosing errors.</description> + <name>element</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders a form field label in an HTML 'label' tag.</description> + <name>label</name> + <tag-class>org.springframework.web.servlet.tags.form.LabelTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>Path to property for data binding</description> + <name>path</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Enable/disable HTML escaping of rendered values.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>for</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute.</description> + <name>cssClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "class" - HTML Optional Attribute. Used only when errors are present.</description> + <name>cssErrorClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Equivalent to "style" - HTML Optional Attribute</description> + <name>cssStyle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>lang</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>dir</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Standard Attribute</description> + <name>tabindex</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>ondblclick</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousedown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseover</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmousemove</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onmouseout</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeypress</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeyup</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Event Attribute</description> + <name>onkeydown</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + + <tag> + <description>Renders an HTML 'button' tag.</description> + <name>button</name> + <tag-class>org.springframework.web.servlet.tags.form.ButtonTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>HTML Standard Attribute</description> + <name>id</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The name attribute for the HTML button tag</description> + <name>name</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The value attribute for the HTML button tag</description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element.</description> + <name>disabled</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <dynamic-attributes>true</dynamic-attributes> + </tag> + +</taglib> diff --git a/bigbluebutton-web/web-app/WEB-INF/tld/spring.tld b/bigbluebutton-web/web-app/WEB-INF/tld/spring.tld old mode 100644 new mode 100755 index 1bc7091f03c98e4c6182a154aafddef0c4ff78e6..a0a8c6f7fc7c27edf677957d66f6c877c24b8b97 --- a/bigbluebutton-web/web-app/WEB-INF/tld/spring.tld +++ b/bigbluebutton-web/web-app/WEB-INF/tld/spring.tld @@ -1,311 +1,457 @@ -<?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> - +<?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>Spring Framework JSP Tag Library</description> + <tlib-version>3.0</tlib-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> - + <name>htmlEscape</name> + <tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class> + <body-content>JSP</body-content> <attribute> + <description>Set the default value for HTML escaping, to be put + into the current PageContext.</description> <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> - + <name>escapeBody</name> + <tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class> + <body-content>JSP</body-content> <attribute> + <description>Set HTML escaping for this tag, as boolean value. Overrides the + default HTML escaping setting for the current page.</description> <name>htmlEscape</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set JavaScript escaping for this tag, as boolean value. + Default is false.</description> <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> - + <name>message</name> + <tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class> + <body-content>JSP</body-content> <attribute> + <description>A MessageSourceResolvable argument (direct or through JSP EL). + Fits nicely when used in conjunction with Spring's own validation error + classes which all implement the MessageSourceResolvable interface. For + example, this allows you to iterate over all of the errors in a form, + passing each error (using a runtime expression) as the value of this + 'message' attribute, thus effecting the easy display of such error + messages.</description> + <name>message</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The code (key) to use when looking up the message. + If code is not provided, the text attribute will be used.</description> <name>code</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set optional message arguments for this tag, as a + (comma-)delimited String (each String argument can contain JSP EL), + an Object array (used as argument array), or a single Object (used + as single argument).</description> <name>arguments</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The separator character to be used for splitting the + arguments string value; defaults to a 'comma' (',').</description> + <name>argumentSeparator</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Default text to output when a message for the given code + could not be found. If both text and code are not set, the tag will + output null.</description> <name>text</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The string to use when binding the result to the page, + request, session or application scope. If not specified, the result + gets outputted to the writer (i.e. typically directly to the JSP).</description> <name>var</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The scope to use when exporting the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application.</description> <name>scope</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page.</description> <name>htmlEscape</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set JavaScript escaping for this tag, as boolean value. Default is false.</description> <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> - + <name>theme</name> + <tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class> + <body-content>JSP</body-content> <attribute> + <description>A MessageSourceResolvable argument (direct or through JSP EL).</description> + <name>message</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The code (key) to use when looking up the message. + If code is not provided, the text attribute will be used.</description> <name>code</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set optional message arguments for this tag, as a + (comma-)delimited String (each String argument can contain JSP EL), + an Object array (used as argument array), or a single Object (used + as single argument).</description> <name>arguments</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The separator character to be used for splitting the + arguments string value; defaults to a 'comma' (',').</description> + <name>argumentSeparator</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Default text to output when a message for the given code + could not be found. If both text and code are not set, the tag will + output null.</description> <name>text</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The string to use when binding the result to the page, + request, session or application scope. If not specified, the result + gets outputted to the writer (i.e. typically directly to the JSP).</description> <name>var</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The scope to use when exporting the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application.</description> <name>scope</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page.</description> <name>htmlEscape</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set JavaScript escaping for this tag, as boolean value. Default is false.</description> <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> - + <name>hasBindErrors</name> + <tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class> + <body-content>JSP</body-content> <variable> <name-given>errors</name-given> <variable-class>org.springframework.validation.Errors</variable-class> </variable> - <attribute> + <description>The name of the bean in the request, that needs to be + inspected for errors. If errors are available for this bean, they + will be bound under the 'errors' key.</description> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page.</description> <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> - + <name>nestedPath</name> + <tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class> + <body-content>JSP</body-content> <variable> <name-given>nestedPath</name-given> <variable-class>java.lang.String</variable-class> </variable> - <attribute> + <description>Set the path that this tag should apply. E.g. 'customer' + to allow bind paths like 'address.street' rather than + 'customer.address.street'.</description> <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> - + <name>bind</name> + <tag-class>org.springframework.web.servlet.tags.BindTag</tag-class> + <body-content>JSP</body-content> <variable> <name-given>status</name-given> <variable-class>org.springframework.web.servlet.support.BindStatus</variable-class> </variable> - <attribute> + <description>The path to the bean or bean property to bind status + information for. For instance account.name, company.address.zipCode + or just employee. The status object will exported to the page scope, + specifically for this bean or bean property</description> <name>path</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set whether to ignore a nested path, if any. Default is to not ignore.</description> <name>ignoreNestedPath</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>Set HTML escaping for this tag, as boolean value. Overrides + the default HTML escaping setting for the current page.</description> <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). + (i.e. by HtmlEscapeTag or a 'defaultHtmlEscape' context-param in web.xml). </description> - + <name>transform</name> + <tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class> + <body-content>JSP</body-content> <attribute> + <description>The value to transform. This is the actual object you want + to have transformed (for instance a Date). Using the PropertyEditor that + is currently in use by the 'spring:bind' tag.</description> <name>value</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The string to use when binding the result to the page, + request, session or application scope. If not specified, the result gets + outputted to the writer (i.e. typically directly to the JSP).</description> <name>var</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> + <description>The scope to use when exported the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application.</description> <name>scope</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> + <description>Set HTML escaping for this tag, as boolean value. Overrides + the default HTML escaping setting for the current page.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + <tag> + <description>URL tag based on the JSTL c:url tag. This variant is fully + backwards compatible with the standard tag. Enhancements include support + for URL template parameters.</description> + <name>url</name> + <tag-class>org.springframework.web.servlet.tags.UrlTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>The URL to build. This value can include template place holders + that are replaced with the URL encoded value of the named parameter. Parameters + must be defined using the param tag inside the body of this tag.</description> + <name>value</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Specifies a remote application context path. The default is the + current application context path.</description> + <name>context</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The name of the variable to export the URL value to.</description> + <name>var</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> <attribute> + <description>The scope for the var. 'application', 'session', 'request' and + 'page' scopes are supported. Defaults to page scope. This attribute has no + effect unless the var attribute is also defined.</description> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Set HTML escaping for this tag, as a boolean value. Overrides the + default HTML escaping setting for the current page.</description> <name>htmlEscape</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> + <description>Set JavaScript escaping for this tag, as a boolean value. + Default is false.</description> + <name>javaScriptEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <tag> + <description>Parameter tag based on the JSTL c:param tag. The sole purpose is to + support params inside the spring:url tag.</description> + <name>param</name> + <tag-class>org.springframework.web.servlet.tags.ParamTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>The name of the parameter.</description> + <name>name</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The value of the parameter.</description> + <name>value</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + <tag> + <description>Evaluates a Spring expression (SpEL) and either prints the result or assigns it to a variable.</description> + <name>eval</name> + <tag-class>org.springframework.web.servlet.tags.EvalTag</tag-class> + <body-content>JSP</body-content> + <attribute> + <description>The expression to evaluate.</description> + <name>expression</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The name of the variable to export the evaluation result to.</description> + <name>var</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>The scope for the var. 'application', 'session', 'request' and + 'page' scopes are supported. Defaults to page scope. This attribute has no + effect unless the var attribute is also defined.</description> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Set HTML escaping for this tag, as a boolean value. Overrides the + default HTML escaping setting for the current page.</description> + <name>htmlEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + <attribute> + <description>Set JavaScript escaping for this tag, as a boolean value. Default is false.</description> + <name>javaScriptEscape</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + </attribute> </tag> </taglib> diff --git a/bigbluebutton-web/web-app/css/errors.css b/bigbluebutton-web/web-app/css/errors.css new file mode 100755 index 0000000000000000000000000000000000000000..bdb58bcca873196cb73e89ea78a51b88757d50db --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/web-app/css/main.css b/bigbluebutton-web/web-app/css/main.css old mode 100644 new mode 100755 index 6dab029ca59aa97dd770d446126c223c00484c63..a55945d1597e10ef321855d4734f89017553effb --- a/bigbluebutton-web/web-app/css/main.css +++ b/bigbluebutton-web/web-app/css/main.css @@ -1,276 +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; - /*padding: 0; SELECT NOT DISPLAYED CORRECTLY IN FIREFOX */ + 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 { - padding: 5px; + 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; } -body { - background: #fff; - color: #333; - font: 13px verdana, arial, helvetica, sans-serif; +/* 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; } -a:link, a:visited, a:hover { - color: #666; - font-weight: bold; - text-decoration: none; -} +.nav ul { + overflow: hidden; + padding-left: 0; + zoom: 1; +} -h1 { - color: #006dba; - font-weight: normal; - font-size: 18px; - margin: .8em 0 .3em 0; +.nav li { + display: block; + float: left; + list-style-type: none; + margin-right: 0.5em; + padding: 0; } -ul { - padding-left: 15px; +.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; } -ul.none {list-style-type: none} +.fieldcontain label, +.fieldcontain .property-label { + color: #666666; + text-align: right; + width: 25%; +} -ol.decimal {list-style-type: decimal} +.fieldcontain .property-label { + float: left; +} + +.fieldcontain .property-value { + display: block; + margin-left: 27%; +} -p.doublespace {line-height: 200%} +label { + cursor: pointer; + display: inline-block; + margin: 0 0.25em 0 0; +} input, select, textarea { - background-color: #fcfcfc; - border: 1px solid #ccc; - font: 13px verdana, arial, helvetica, sans-serif; - margin: 2px 0; - padding: 2px 4px; + background-color: #fcfcfc; + border: 1px solid #cccccc; + font-size: 1em; + padding: 0.2em 0.4em; } + select { - padding: 2px 2px 2px 0; + 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 { - border: 1px solid #b2d1ff; + 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; } -.body { - float: left; - margin: 0 15px 10px 15px; +.ie6 ul.one-to-many, .ie7 ul.one-to-many { + display: inline; + zoom: 1; } -/* NAVIGATION MENU */ +ul.one-to-many li.add { + list-style-type: none; +} -.nav { - background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; - border: 1px solid #ccc; - border-style: solid none solid none; - margin-top: 5px; - padding: 7px 12px; +/* 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; } -.menuButton { - font-size: 12px; - padding: 0 5px; +fieldset.embedded legend { + margin: 0 1em; } -.menuButton a { - color: #333; - padding: 4px 6px; + +/* MESSAGES AND ERRORS */ + +.errors, +.message { + font-size: 0.8em; + line-height: 2; + margin: 1em 2em; + padding: 0.25em; } -.menuButton a.home { - background: url(../images/skin/house.png) center left no-repeat; - color: #333; - padding-left: 25px; + +.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; } -.menuButton a.list { - background: url(../images/skin/database_table.png) center left no-repeat; - color: #333; - padding-left: 25px; + +.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; } -.menuButton a.create { - background: url(../images/skin/database_add.png) center left no-repeat; - color: #333; - padding-left: 25px; + +.errors ul, +.message { + padding: 0; } -/* MESSAGES AND ERRORS */ +.errors li { + list-style: none; + background: transparent url(../images/skin/exclamation.png) 0.5em 50% no-repeat; + text-indent: 2.2em; +} .message { - //background: #f3f8fc url(../images/skin/information.png) 12px 50% no-repeat; - background: yellow url(../images/skin/checkmark.png) 12px 50% no-repeat; - //border: 5px solid #b2d1ff; - border: 5px solid green; - //color: #006dba; - color: green; - margin: 10px 0 5px 0; - padding: 15px 5px 15px 50px + background: transparent url(../images/skin/information.png) 0.5em 50% no-repeat; + text-indent: 2.2em; } -div.errors { - background: #fff3f3; - border: 1px solid red; - color: #cc0000; - margin: 10px 0 5px 0; - padding: 5px 0 5px 0; -} -div.errors ul { - list-style: none; - padding: 0; +/* form fields with errors */ + +.error input, .error select, .error textarea { + background: #fff3f3; + border-color: #ffaaaa; + color: #cc0000; } -div.errors li { - background: url(../images/skin/exclamation.png) 8px 0% no-repeat; - line-height: 16px; - padding-left: 30px; + +.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; } -td.errors select { - border: 1px solid red; +/* 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; } -td.errors input { - border: 1px solid red; + +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: 1px solid #ccc; - width: 100% + border-top: 1px solid #DFDFDF; + border-collapse: collapse; + width: 100%; + margin-bottom: 1em; } + tr { - border: 0; + border: 0; +} + +tr>td:first-child, tr>th:first-child { + padding-left: 1.25em; } -td, th { - font: 13px verdana, arial, helvetica, sans-serif; - line-height: 12px; - padding: 5px 6px; - text-align: left; - vertical-align: top; + +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: #fff url(../images/skin/shadow.jpg); - color: #666; - font-size: 13px; - font-weight: bold; - line-height: 17px; - padding: 2px 6px; -} -th a:link, th a:visited, th a:hover { - color: #333; - display: block; - font-size: 12px; - text-decoration: none; - width: 100%; -} -th.asc a, th.desc a { - background-position: right; - background-repeat: no-repeat; + 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); + background-image: url(../images/skin/sorted_asc.gif); } + th.desc a { - background-image: url(../images/skin/sorted_desc.gif); + background-image: url(../images/skin/sorted_desc.gif); } .odd { - background: #f7f7f7; + background: #f7f7f7; } + .even { - background: #fff; + background: #ffffff; } -/* LIST */ +th:hover, tr:hover { + background: #E1F2B6; +} -.list table { - border-collapse: collapse; +/* 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; } -.list th, .list td { - border-left: 1px solid #ddd; + +.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; } -.list th:hover, .list tr:hover { - background: #b2d1ff; + +.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); } -/* PAGINATION */ +.no-borderradius .pagination a:hover, .no-borderradius .pagination a:focus, +.no-borderradius .pagination .currentStep { + background-color: transparent; + color: #444444; + text-decoration: underline; +} + +/* ACTION BUTTONS */ -.paginateButtons { - background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; - border: 1px solid #ccc; - border-top: 0; - color: #666; - font-size: 12px; - overflow: hidden; - padding: 10px 3px; +.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; } -.paginateButtons a { - background: #fff; - border: 1px solid #ccc; - border-color: #ccc #aaa #aaa #ccc; - color: #666; - margin: 0 3px; - padding: 2px 6px; + +.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; } -.paginateButtons span { - padding: 2px 3px; + +.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; } -/* DIALOG */ +.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; +} -.dialog table { - padding: 5px 0; +.buttons .delete, .buttons .edit, .buttons .save { + background-position: 0.7em center; + background-repeat: no-repeat; + text-indent: 25px; } -.prop { - padding: 5px; +.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; } -.prop .name { - text-align: left; - width: 15%; - white-space: nowrap; + +.buttons .delete { + background-image: url(../images/skin/database_delete.png); } -.prop .value { - text-align: left; - width: 85%; + +.buttons .edit { + background-image: url(../images/skin/database_edit.png); } -/* ACTION BUTTONS */ +.buttons .save { + background-image: url(../images/skin/database_save.png); +} -.buttons { - background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; - border: 1px solid #ccc; - color: #666; - font-size: 12px; - margin-top: 5px; - overflow: hidden; - padding: 0; -} - -.buttons input { - background: #fff; - border: 0; - color: #333; - cursor: pointer; - font-size: 12px; - font-weight: bold; - margin-left: 3px; - overflow: visible; - padding: 2px 6px; -} -.buttons input.delete { - background: transparent url(../images/skin/database_delete.png) 5px 50% no-repeat; - padding-left: 28px; -} -.buttons input.edit { - background: transparent url(../images/skin/database_edit.png) 5px 50% no-repeat; - padding-left: 28px; -} -.buttons input.save { - background: transparent url(../images/skin/database_save.png) 5px 50% no-repeat; - padding-left: 28px; +a.skip { + position: absolute; + left: -9999px; } diff --git a/bigbluebutton-web/web-app/css/mobile.css b/bigbluebutton-web/web-app/css/mobile.css new file mode 100755 index 0000000000000000000000000000000000000000..167f50221e540b35c97c2d0644038c84b4ff0db3 --- /dev/null +++ b/bigbluebutton-web/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/bigbluebutton-web/web-app/css/tree/check/tree.css b/bigbluebutton-web/web-app/css/tree/check/tree.css deleted file mode 100644 index 7430d2e0def69c536d3290746c834425c428c7d1..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/css/tree/check/tree.css +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ - -/* first or middle sibling, no children */ -.ygtvtn {background: url(../../img/default/tn.gif) 0 0 no-repeat; width:16px; height:22px; } - -/* first or middle sibling, collapsable */ -.ygtvtm {background: url(../../img/default/tm.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* first or middle sibling, collapsable, hover */ -.ygtvtmh {background: url(../../img/default/tmh.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* first or middle sibling, expandable */ -.ygtvtp {background: url(../../img/default/tp.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* first or middle sibling, expandable, hover */ -.ygtvtph {background: url(../../img/default/tph.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* last sibling, no children */ -.ygtvln {background: url(../../img/default/ln.gif) 0 0 no-repeat; width:16px; height:22px; } - -/* Last sibling, collapsable */ -.ygtvlm {background: url(../../img/default/lm.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* Last sibling, collapsable, hover */ -.ygtvlmh {background: url(../../img/default/lmh.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* Last sibling, expandable */ -.ygtvlp { background: url(../../img/default/lp.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* Last sibling, expandable, hover */ -.ygtvlph { background: url(../../img/default/lph.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - -/* Loading icon */ -.ygtvloading { background: url(../../img/default/loading.gif) 0 0 no-repeat; width:16px; height:22px; } - -/* the style for the empty cells that are used for rendering the depth - * of the node */ -.ygtvdepthcell { background: url(../../img/default/vline.gif) 0 0 no-repeat; width:16px; height:22px; } - -.ygtvblankdepthcell { width:16px; height:22px; } - -/* the style of the div around each node */ -.ygtvitem { } - -/* the style of the div around each node's collection of children */ -.ygtvchildren { } -* html .ygtvchildren { height:1%; } - -/* the style of the text label in ygTextNode */ -.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { - margin-left:2px; - text-decoration: none; -} - -.ygtvcheck0 { background: url(../../img/check/check0.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } -.ygtvcheck1 { background: url(../../img/check/check1.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } -.ygtvcheck2 { background: url(../../img/check/check2.gif) 0 0 no-repeat; width:16px; height:22px; cursor:pointer } - diff --git a/bigbluebutton-web/web-app/css/tree/default/tree.css b/bigbluebutton-web/web-app/css/tree/default/tree.css deleted file mode 100644 index effce510b0cb860584ad6ed5dd3d373f3438d29f..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/css/tree/default/tree.css +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ - -/* first or middle sibling, no children */ -.ygtvtn { - width:16px; height:22px; - background: url(../../img/default/tn.gif) 0 0 no-repeat; -} - -/* first or middle sibling, collapsable */ -.ygtvtm { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/tm.gif) 0 0 no-repeat; -} - -/* first or middle sibling, collapsable, hover */ -.ygtvtmh { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/tmh.gif) 0 0 no-repeat; -} - -/* first or middle sibling, expandable */ -.ygtvtp { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/tp.gif) 0 0 no-repeat; -} - -/* first or middle sibling, expandable, hover */ -.ygtvtph { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/tph.gif) 0 0 no-repeat; -} - -/* last sibling, no children */ -.ygtvln { - width:16px; height:22px; - background: url(../../img/default/ln.gif) 0 0 no-repeat; -} - -/* Last sibling, collapsable */ -.ygtvlm { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/lm.gif) 0 0 no-repeat; -} - -/* Last sibling, collapsable, hover */ -.ygtvlmh { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/lmh.gif) 0 0 no-repeat; -} - -/* Last sibling, expandable */ -.ygtvlp { - width:16px; height:22px; - cursor:pointer ; - background: url(../../img/default/lp.gif) 0 0 no-repeat; -} - -/* Last sibling, expandable, hover */ -.ygtvlph { - width:17px; height:22px; cursor:pointer ; - background: url(../../img/default/lph.gif) 0 0 no-repeat; -} - -/* Loading icon */ -.ygtvloading { - width:16px; height:22px; - background: url(../../img/default/loading.gif) 0 0 no-repeat; -} - -/* the style for the empty cells that are used for rendering the depth - * of the node */ -.ygtvdepthcell { - width:16px; height:22px; - background: url(../../img/default/vline.gif) 0 0 no-repeat; -} - -.ygtvblankdepthcell { width:16px; height:22px; } - -/* the style of the div around each node */ -.ygtvitem { } - -/* the style of the div around each node's collection of children */ -.ygtvchildren { } -* html .ygtvchildren { height:2%; } - -/* the style of the text label in ygTextNode */ -.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { - margin-left:2px; - text-decoration: none; -} - diff --git a/bigbluebutton-web/web-app/css/tree/folders/tree.css b/bigbluebutton-web/web-app/css/tree/folders/tree.css deleted file mode 100644 index 5f3b26ff59fd82e32a152e6e2514778a73e8e56b..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/css/tree/folders/tree.css +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ - -/* first or middle sibling, no children */ -.ygtvtn { background: url(../../img/folders/tn.gif) 0 0 no-repeat; width:17px; height:22px; } - -/* first or middle sibling, collapsable */ -.ygtvtm { background: url(../../img/folders/tm.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* first or middle sibling, collapsable, hover */ -.ygtvtmh { background: url(../../img/folders/tmh.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* first or middle sibling, expandable */ -.ygtvtp { background: url(../../img/folders/tp.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* first or middle sibling, expandable, hover */ -.ygtvtph { background: url(../../img/folders/tph.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* last sibling, no children */ -.ygtvln { background: url(../../img/folders/ln.gif) 0 0 no-repeat; width:17px; height:22px; } - -/* Last sibling, collapsable */ -.ygtvlm { background: url(../../img/folders/lm.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* Last sibling, collapsable, hover */ -.ygtvlmh { background: url(../../img/folders/lmh.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* Last sibling, expandable */ -.ygtvlp { background: url(../../img/folders/lp.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* Last sibling, expandable, hover */ -.ygtvlph { background: url(../../img/folders/lph.gif) 0 0 no-repeat; width:34px; height:22px; cursor:pointer } - -/* Loading icon */ -.ygtvloading { background: url(../../img/folders/loading.gif) 0 0 no-repeat; width:16px; height:22px; } - -/* the style for the empty cells that are used for rendering the depth - * of the node */ -.ygtvdepthcell { background: url(../../img/folders/vline.gif) 0 0 no-repeat; width:17px; height:22px; } - -.ygtvblankdepthcell { width:17px; height:22px; } - -/* the style of the div around each node */ -.ygtvitem { } - -/* the style of the div around each node's collection of children */ -.ygtvchildren { } -* html .ygtvchildren { height:1%; } - -/* the style of the text label in ygTextNode */ -.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { - margin-left:2px; - text-decoration: none; -} - - diff --git a/bigbluebutton-web/web-app/css/tree/menu/tree.css b/bigbluebutton-web/web-app/css/tree/menu/tree.css deleted file mode 100644 index 1c5600aa27c3b6d77d907b9fabba963fbdb5421c..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/css/tree/menu/tree.css +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ - -/* first or middle sibling, no children */ -.ygtvtn { width:1em; height:20px; } - -/* first or middle sibling, collapsable */ -.ygtvtm { background: url(../../img/menu/collapse.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* first or middle sibling, collapsable, hover */ -.ygtvtmh { background: url(../../img/menu/collapseh.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* first or middle sibling, expandable */ -.ygtvtp { background: url(../../img/menu/expand.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* first or middle sibling, expandable, hover */ -.ygtvtph { background: url(../../img/menu/expandh.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* last sibling, no children */ -.ygtvln { width:1em; height:20px; } - -/* Last sibling, collapsable */ -.ygtvlm { background: url(../../img/menu/collapse.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* Last sibling, collapsable, hover */ -.ygtvlmh { background: url(../../img/menu/collapseh.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* Last sibling, expandable */ -.ygtvlp { background: url(../../img/menu/expand.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* Last sibling, expandable, hover */ -.ygtvlph { background: url(../../img/menu/expandh.gif) 0 6px no-repeat; width:1em; height:22px; cursor:pointer } - -/* Loading icon */ -.ygtvloading { background: url(../../img/menu/loading.gif) 0 6px no-repeat; width:1em; height:22px; } - -/* the style for the empty cells that are used for rendering the depth - * of the node */ -.ygtvdepthcell { width:1em; height:20px; } - -.ygtvblankdepthcell { width:1em; height:20px; } - -/* the style of the div around each node */ -.ygtvitem { border: 0px solid grey; } - -/* the style of the div around each node's collection of children */ -.ygtvchildren { } -* html .ygtvchildren { height:1%; } - -/* the style of the text label in ygTextNode */ -.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { - /* - margin-left:2px; - text-decoration: none; - */ - font-size: 12px; -} - - diff --git a/bigbluebutton-web/web-app/images/apple-touch-icon-retina.png b/bigbluebutton-web/web-app/images/apple-touch-icon-retina.png new file mode 100755 index 0000000000000000000000000000000000000000..5cc83edbe69203eaaf7d64e5b2596de6e01fff29 Binary files /dev/null and b/bigbluebutton-web/web-app/images/apple-touch-icon-retina.png differ diff --git a/bigbluebutton-web/web-app/images/apple-touch-icon.png b/bigbluebutton-web/web-app/images/apple-touch-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..aba337f611dcedbe09b57f2757270a58fed1e656 Binary files /dev/null and b/bigbluebutton-web/web-app/images/apple-touch-icon.png differ diff --git a/bigbluebutton-web/web-app/images/bbb_banner.jpg b/bigbluebutton-web/web-app/images/bbb_banner.jpg deleted file mode 100755 index 384dfb51b7cb0980361eb0fd5f2fd88dd87d54c7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/bbb_banner.jpg and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/favicon.ico b/bigbluebutton-web/web-app/images/favicon.ico old mode 100644 new mode 100755 index 2a399b83be1833fa8a206a7f33d35f8bb745031e..3dfcb9279f60f2396a8f19fb6607ff281800c905 Binary files a/bigbluebutton-web/web-app/images/favicon.ico and b/bigbluebutton-web/web-app/images/favicon.ico differ diff --git a/bigbluebutton-web/web-app/images/grails_logo.jpg b/bigbluebutton-web/web-app/images/grails_logo.jpg deleted file mode 100644 index 8be657c07618753fe240b10f235e6bc86c4a60d0..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/grails_logo.jpg and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/grails_logo.png b/bigbluebutton-web/web-app/images/grails_logo.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/leftnav_btm.png b/bigbluebutton-web/web-app/images/leftnav_btm.png deleted file mode 100644 index 582e1eb924641f669a9a4f82d6d73c2957dc46ae..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/leftnav_btm.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/leftnav_midstretch.png b/bigbluebutton-web/web-app/images/leftnav_midstretch.png deleted file mode 100644 index 3cb8a51559b4bd4ed79fba033b4274b33e5cdd2c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/leftnav_midstretch.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/leftnav_top.png b/bigbluebutton-web/web-app/images/leftnav_top.png deleted file mode 100644 index 6afec7d32f3163446829de0ed38099021fc7b0d6..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/leftnav_top.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/skin/checkmark.png b/bigbluebutton-web/web-app/images/skin/checkmark.png deleted file mode 100644 index 06affa2c9807fb4643cf3f2c31adf80f33dd383c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/skin/checkmark.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/skin/checkmark_vcalendar.png b/bigbluebutton-web/web-app/images/skin/checkmark_vcalendar.png deleted file mode 100644 index 66de573beafd2e3939fec796723a626b2a348e85..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/skin/checkmark_vcalendar.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/skin/database_add.png b/bigbluebutton-web/web-app/images/skin/database_add.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/database_delete.png b/bigbluebutton-web/web-app/images/skin/database_delete.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/database_edit.png b/bigbluebutton-web/web-app/images/skin/database_edit.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/database_save.png b/bigbluebutton-web/web-app/images/skin/database_save.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/database_table.png b/bigbluebutton-web/web-app/images/skin/database_table.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/exclamation.png b/bigbluebutton-web/web-app/images/skin/exclamation.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/house.png b/bigbluebutton-web/web-app/images/skin/house.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/information.png b/bigbluebutton-web/web-app/images/skin/information.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/shadow.jpg b/bigbluebutton-web/web-app/images/skin/shadow.jpg old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/sorted_asc.gif b/bigbluebutton-web/web-app/images/skin/sorted_asc.gif old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/skin/sorted_desc.gif b/bigbluebutton-web/web-app/images/skin/sorted_desc.gif old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/spinner.gif b/bigbluebutton-web/web-app/images/spinner.gif old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/springsource.png b/bigbluebutton-web/web-app/images/springsource.png old mode 100644 new mode 100755 diff --git a/bigbluebutton-web/web-app/images/tree/bullet.gif b/bigbluebutton-web/web-app/images/tree/bullet.gif deleted file mode 100644 index 9d28c2f6aa75cfb4dbdff60fbac60130fe88a5d3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/bullet.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/check0.gif b/bigbluebutton-web/web-app/images/tree/check/check0.gif deleted file mode 100644 index 193028b99361c6527f17a9056037f3d8729fada7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/check0.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/check1.gif b/bigbluebutton-web/web-app/images/tree/check/check1.gif deleted file mode 100644 index 181317599bfd45f03a7a69784b232509171d98e9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/check1.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/check2.gif b/bigbluebutton-web/web-app/images/tree/check/check2.gif deleted file mode 100644 index 7d9ceba3847ffb41864626de755147cf2e0ccc41..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/check2.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/lm.gif b/bigbluebutton-web/web-app/images/tree/check/lm.gif deleted file mode 100644 index e7d0a3ce92eb825a95ca188133567cd4f8f31499..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/lm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/lmh.gif b/bigbluebutton-web/web-app/images/tree/check/lmh.gif deleted file mode 100644 index 3ff6302723f154dfea4f21bfcd754097d491f51b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/lmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/ln.gif b/bigbluebutton-web/web-app/images/tree/check/ln.gif deleted file mode 100644 index b7b3e55cd044af047e571b8e46d99dd4b801ee60..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/ln.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/loading.gif b/bigbluebutton-web/web-app/images/tree/check/loading.gif deleted file mode 100644 index 0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/loading.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/lp.gif b/bigbluebutton-web/web-app/images/tree/check/lp.gif deleted file mode 100644 index b87f003154502f8e9f569fefb12d57a5a1ebb515..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/lp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/lph.gif b/bigbluebutton-web/web-app/images/tree/check/lph.gif deleted file mode 100644 index e3478d8e37dadeba8c9d68c84ad29c3b2843a69b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/lph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/tm.gif b/bigbluebutton-web/web-app/images/tree/check/tm.gif deleted file mode 100644 index e30abad8900c51fd87ac22beaafb50abb77f884a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/tm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/tmh.gif b/bigbluebutton-web/web-app/images/tree/check/tmh.gif deleted file mode 100644 index ad7e5579378d80b7e89b647d7955844984ae3390..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/tmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/tn.gif b/bigbluebutton-web/web-app/images/tree/check/tn.gif deleted file mode 100644 index 4a280397de0ae7564f625d9356204a1cb6a1f399..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/tn.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/tp.gif b/bigbluebutton-web/web-app/images/tree/check/tp.gif deleted file mode 100644 index d6d0ed0aed40f3a5ab43dcea1ed5e0ad67e76304..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/tp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/tph.gif b/bigbluebutton-web/web-app/images/tree/check/tph.gif deleted file mode 100644 index e4d7d991e44f0ebbe5f05ec261eb831d96332a4e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/tph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/check/vline.gif b/bigbluebutton-web/web-app/images/tree/check/vline.gif deleted file mode 100644 index 1fb0de8bb2911a51ff29f91fe7d231c0a5529091..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/check/vline.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/lm.gif b/bigbluebutton-web/web-app/images/tree/default/lm.gif deleted file mode 100644 index e7d0a3ce92eb825a95ca188133567cd4f8f31499..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/lm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/lmh.gif b/bigbluebutton-web/web-app/images/tree/default/lmh.gif deleted file mode 100644 index 3ff6302723f154dfea4f21bfcd754097d491f51b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/lmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/ln.gif b/bigbluebutton-web/web-app/images/tree/default/ln.gif deleted file mode 100644 index b7b3e55cd044af047e571b8e46d99dd4b801ee60..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/ln.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/loading.gif b/bigbluebutton-web/web-app/images/tree/default/loading.gif deleted file mode 100644 index 0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/loading.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/lp.gif b/bigbluebutton-web/web-app/images/tree/default/lp.gif deleted file mode 100644 index b87f003154502f8e9f569fefb12d57a5a1ebb515..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/lp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/lph.gif b/bigbluebutton-web/web-app/images/tree/default/lph.gif deleted file mode 100644 index e3478d8e37dadeba8c9d68c84ad29c3b2843a69b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/lph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/tm.gif b/bigbluebutton-web/web-app/images/tree/default/tm.gif deleted file mode 100644 index e30abad8900c51fd87ac22beaafb50abb77f884a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/tm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/tmh.gif b/bigbluebutton-web/web-app/images/tree/default/tmh.gif deleted file mode 100644 index ad7e5579378d80b7e89b647d7955844984ae3390..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/tmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/tn.gif b/bigbluebutton-web/web-app/images/tree/default/tn.gif deleted file mode 100644 index 4a280397de0ae7564f625d9356204a1cb6a1f399..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/tn.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/tp.gif b/bigbluebutton-web/web-app/images/tree/default/tp.gif deleted file mode 100644 index d6d0ed0aed40f3a5ab43dcea1ed5e0ad67e76304..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/tp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/tph.gif b/bigbluebutton-web/web-app/images/tree/default/tph.gif deleted file mode 100644 index e4d7d991e44f0ebbe5f05ec261eb831d96332a4e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/tph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/default/vline.gif b/bigbluebutton-web/web-app/images/tree/default/vline.gif deleted file mode 100644 index 1fb0de8bb2911a51ff29f91fe7d231c0a5529091..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/default/vline.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/lm.gif b/bigbluebutton-web/web-app/images/tree/folders/lm.gif deleted file mode 100644 index b5623002a654745049da926cd3c0f8f1cded2a43..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/lm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/lmh.gif b/bigbluebutton-web/web-app/images/tree/folders/lmh.gif deleted file mode 100644 index a17fe233c19e96045313e4dede6028b3eed44c41..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/lmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/ln.gif b/bigbluebutton-web/web-app/images/tree/folders/ln.gif deleted file mode 100644 index b7b3e55cd044af047e571b8e46d99dd4b801ee60..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/ln.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/loading.gif b/bigbluebutton-web/web-app/images/tree/folders/loading.gif deleted file mode 100644 index 0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/loading.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/lp.gif b/bigbluebutton-web/web-app/images/tree/folders/lp.gif deleted file mode 100644 index b9f54856706fe8de0c858b4bb4e46b27a8b4719a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/lp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/lph.gif b/bigbluebutton-web/web-app/images/tree/folders/lph.gif deleted file mode 100644 index f663714f4944a2b046d7c413e0aea5240132ec0e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/lph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/tm.gif b/bigbluebutton-web/web-app/images/tree/folders/tm.gif deleted file mode 100644 index 56622cc305a9a8432d94c733c6a8dfe76119230c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/tm.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/tmh.gif b/bigbluebutton-web/web-app/images/tree/folders/tmh.gif deleted file mode 100644 index e42349e406a7e23e8d6620821680628d6e0712e4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/tmh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/tn.gif b/bigbluebutton-web/web-app/images/tree/folders/tn.gif deleted file mode 100644 index 4a280397de0ae7564f625d9356204a1cb6a1f399..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/tn.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/tp.gif b/bigbluebutton-web/web-app/images/tree/folders/tp.gif deleted file mode 100644 index 906e8c46e4717f444fc3818e6f0731341fee65e9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/tp.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/tph.gif b/bigbluebutton-web/web-app/images/tree/folders/tph.gif deleted file mode 100644 index 8aa7c2504b3c037437ce22f0f26a97e20d2e815f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/tph.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/folders/vline.gif b/bigbluebutton-web/web-app/images/tree/folders/vline.gif deleted file mode 100644 index 1fb0de8bb2911a51ff29f91fe7d231c0a5529091..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/folders/vline.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/greybg.png b/bigbluebutton-web/web-app/images/tree/greybg.png deleted file mode 100644 index 1ff7817010b1327f9174c53743480dbec6e5831a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/greybg.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/header.gif b/bigbluebutton-web/web-app/images/tree/header.gif deleted file mode 100644 index 6bb816ce2139fd04128976d48d6b49ea67b86049..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/header.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/logo.gif b/bigbluebutton-web/web-app/images/tree/logo.gif deleted file mode 100644 index 7b00575606c147b260183f61ea2a0f6820080512..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/logo.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/collapse.gif b/bigbluebutton-web/web-app/images/tree/menu/collapse.gif deleted file mode 100644 index 45a475b9ed03607f1567f8f37ac41df2aaacde90..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/collapse.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/collapseh.gif b/bigbluebutton-web/web-app/images/tree/menu/collapseh.gif deleted file mode 100644 index 4f13b3e4e202ca0773b160dc51e55ef99ab0ee9b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/collapseh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/collapseon.gif b/bigbluebutton-web/web-app/images/tree/menu/collapseon.gif deleted file mode 100644 index 0a4dba1bb73884d2658473e04499aa883dc9dd4c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/collapseon.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/dash.gif b/bigbluebutton-web/web-app/images/tree/menu/dash.gif deleted file mode 100644 index 06580b9ed900fa4e2fe020b3886aecb7cd2ed8a9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/dash.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/expand.gif b/bigbluebutton-web/web-app/images/tree/menu/expand.gif deleted file mode 100644 index bdbed54dd2ce7eec8bd9842d5af93269ad28981a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/expand.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/expandh.gif b/bigbluebutton-web/web-app/images/tree/menu/expandh.gif deleted file mode 100644 index 343279ec3abecbb276f4d5f96a9d49e46096bddc..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/expandh.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/expandon.gif b/bigbluebutton-web/web-app/images/tree/menu/expandon.gif deleted file mode 100644 index 9781085968dd84e744c7c34f09213d07aaa12978..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/expandon.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/menu/loading.gif b/bigbluebutton-web/web-app/images/tree/menu/loading.gif deleted file mode 100644 index 0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/menu/loading.gif and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/navHover2.png b/bigbluebutton-web/web-app/images/tree/navHover2.png deleted file mode 100644 index 9097f6305388e96523d950fef0dcb9dc9a08b6c9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/navHover2.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/qbottom.png b/bigbluebutton-web/web-app/images/tree/qbottom.png deleted file mode 100644 index aa792d80e215656fecb4508716d368ed9ad5c9e7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/qbottom.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/qmiddle.png b/bigbluebutton-web/web-app/images/tree/qmiddle.png deleted file mode 100644 index 331fc6b2d6de89d2ac89128f698ad23732f72e90..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/qmiddle.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/images/tree/qtop.png b/bigbluebutton-web/web-app/images/tree/qtop.png deleted file mode 100644 index 07e845ed1554f058d9d04ed0bce74b66b4359329..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-web/web-app/images/tree/qtop.png and /dev/null differ diff --git a/bigbluebutton-web/web-app/index.gsp b/bigbluebutton-web/web-app/index.gsp deleted file mode 100755 index 9f7d8ed93f4edf158bb2a792def526f5bb369960..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/index.gsp +++ /dev/null @@ -1 +0,0 @@ -This page is no longer available, please use the api. diff --git a/bigbluebutton-web/web-app/js/application.js b/bigbluebutton-web/web-app/js/application.js old mode 100644 new mode 100755 index 1bf791a05c20a34e853bcb237a9dcd938fe17ece..b2adb962e2013c0b9bb2f9635dc88f12f64a43bf --- a/bigbluebutton-web/web-app/js/application.js +++ b/bigbluebutton-web/web-app/js/application.js @@ -1,13 +1,9 @@ -var Ajax; -if (Ajax && (Ajax != null)) { - Ajax.Responders.register({ - onCreate: function() { - if($('spinner') && Ajax.activeRequestCount>0) - Effect.Appear('spinner',{duration:0.5,queue:'end'}); - }, - onComplete: function() { - if($('spinner') && Ajax.activeRequestCount==0) - Effect.Fade('spinner',{duration:0.5,queue:'end'}); - } - }); +if (typeof jQuery !== 'undefined') { + (function($) { + $('#spinner').ajaxStart(function() { + $(this).fadeIn(); + }).ajaxStop(function() { + $(this).fadeOut(); + }); + })(jQuery); } diff --git a/bigbluebutton-web/web-app/js/conference.js b/bigbluebutton-web/web-app/js/conference.js deleted file mode 100644 index 2089b4fcea4f93e25193db26025f71728d05ac02..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/conference.js +++ /dev/null @@ -1,4 +0,0 @@ -function warnBeforeConferenceDelete() { - return confirm('Are you sure you want to delete this conference?') -} - \ No newline at end of file diff --git a/bigbluebutton-web/web-app/js/jquery-1.3.1.js b/bigbluebutton-web/web-app/js/jquery-1.3.1.js deleted file mode 100644 index c327fae812b1a9420c4423d62b0be0fdc6ca9564..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/jquery-1.3.1.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.1 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009) - * Revision: 6158 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.makeArray(E))},selector:"",jquery:"1.3.1",size:function(){return this.length},get:function(E){return E===g?o.makeArray(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,find:function(E){if(this.length===1&&!/,/.test(E)){var G=this.pushStack([],"find",E);G.length=0;o.find(E,this[0],G);return G}else{var F=o.map(this,function(H){return o.find(E,H)});return this.pushStack(/[^+>] [^+>]/.test(E)?o.unique(F):F,"find",E)}},clone:function(F){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.cloneNode(true),H=document.createElement("div");H.appendChild(I);return o.clean([H.innerHTML])[0]}else{return this.cloneNode(true)}});var G=E.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(F===true){this.find("*").andSelf().each(function(I){if(this.nodeType==3){return}var H=o.data(this,"events");for(var K in H){for(var J in H[K]){o.event.add(G[I],K,H[K][J],H[K][J].data)}}})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var F=o.expr.match.POS.test(E)?o(E):null;return this.map(function(){var G=this;while(G&&G.ownerDocument){if(F?F.index(G)>-1:o(G).is(E)){return G}G=G.parentNode}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML:null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(K,N,M){if(this[0]){var J=(this[0].ownerDocument||this[0]).createDocumentFragment(),G=o.clean(K,(this[0].ownerDocument||this[0]),J),I=J.firstChild,E=this.length>1?J.cloneNode(true):J;if(I){for(var H=0,F=this.length;H<F;H++){M.call(L(this[H],I),H>0?E.cloneNode(true):J)}}if(G){o.each(G,z)}}return this;function L(O,P){return N&&o.nodeName(O,"table")&&o.nodeName(P,"tr")?(O.getElementsByTagName("tbody")[0]||O.appendChild(O.ownerDocument.createElement("tbody"))):O}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){G=o.trim(G);if(G){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(G,E,I){if(E=="width"||E=="height"){var K,F={position:"absolute",visibility:"hidden",display:"block"},J=E=="width"?["Left","Right"]:["Top","Bottom"];function H(){K=E=="width"?G.offsetWidth:G.offsetHeight;var M=0,L=0;o.each(J,function(){M+=parseFloat(o.curCSS(G,"padding"+this,true))||0;L+=parseFloat(o.curCSS(G,"border"+this+"Width",true))||0});K-=Math.round(M+L)}if(o(G).is(":visible")){H()}else{o.swap(G,F,H)}return Math.max(0,K)}return o.curCSS(G,E,I)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,R){if(typeof R==="number"){R+=""}if(!R){return}if(typeof R==="string"){R=R.replace(/(<(\w+)[^>]*?)\/>/g,function(T,U,S){return S.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?T:U+"></"+S+">"});var O=o.trim(R).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+R+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var N=!O.indexOf("<table")&&O.indexOf("<tbody")<0?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&O.indexOf("<tbody")<0?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(R)){L.insertBefore(K.createTextNode(R.match(/^\s*/)[0]),L.firstChild)}R=o.makeArray(L.childNodes)}if(R.nodeType){G.push(R)}else{G=o.merge(G,R)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(){var G=arguments;return this.each(function(){for(var H=0,I=G.length;H<I;H++){o(G[H])[F](this)}})}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(">*",this).remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var Q=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,K=0,G=Object.prototype.toString;var F=function(X,T,aa,ab){aa=aa||[];T=T||document;if(T.nodeType!==1&&T.nodeType!==9){return[]}if(!X||typeof X!=="string"){return aa}var Y=[],V,ae,ah,S,ac,U,W=true;Q.lastIndex=0;while((V=Q.exec(X))!==null){Y.push(V[1]);if(V[2]){U=RegExp.rightContext;break}}if(Y.length>1&&L.exec(X)){if(Y.length===2&&H.relative[Y[0]]){ae=I(Y[0]+Y[1],T)}else{ae=H.relative[Y[0]]?[T]:F(Y.shift(),T);while(Y.length){X=Y.shift();if(H.relative[X]){X+=Y.shift()}ae=I(X,ae)}}}else{var ad=ab?{expr:Y.pop(),set:E(ab)}:F.find(Y.pop(),Y.length===1&&T.parentNode?T.parentNode:T,P(T));ae=F.filter(ad.expr,ad.set);if(Y.length>0){ah=E(ae)}else{W=false}while(Y.length){var ag=Y.pop(),af=ag;if(!H.relative[ag]){ag=""}else{af=Y.pop()}if(af==null){af=T}H.relative[ag](ah,af,P(T))}}if(!ah){ah=ae}if(!ah){throw"Syntax error, unrecognized expression: "+(ag||X)}if(G.call(ah)==="[object Array]"){if(!W){aa.push.apply(aa,ah)}else{if(T.nodeType===1){for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&(ah[Z]===true||ah[Z].nodeType===1&&J(T,ah[Z]))){aa.push(ae[Z])}}}else{for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&ah[Z].nodeType===1){aa.push(ae[Z])}}}}}else{E(ah,aa)}if(U){F(U,T,aa,ab)}return aa};F.matches=function(S,T){return F(S,null,null,T)};F.find=function(Z,S,aa){var Y,W;if(!Z){return[]}for(var V=0,U=H.order.length;V<U;V++){var X=H.order[V],W;if((W=H.match[X].exec(Z))){var T=RegExp.leftContext;if(T.substr(T.length-1)!=="\\"){W[1]=(W[1]||"").replace(/\\/g,"");Y=H.find[X](W,S,aa);if(Y!=null){Z=Z.replace(H.match[X],"");break}}}}if(!Y){Y=S.getElementsByTagName("*")}return{set:Y,expr:Z}};F.filter=function(ab,aa,ae,V){var U=ab,ag=[],Y=aa,X,S;while(ab&&aa.length){for(var Z in H.filter){if((X=H.match[Z].exec(ab))!=null){var T=H.filter[Z],af,ad;S=false;if(Y==ag){ag=[]}if(H.preFilter[Z]){X=H.preFilter[Z](X,Y,ae,ag,V);if(!X){S=af=true}else{if(X===true){continue}}}if(X){for(var W=0;(ad=Y[W])!=null;W++){if(ad){af=T(ad,X,W,Y);var ac=V^!!af;if(ae&&af!=null){if(ac){S=true}else{Y[W]=false}}else{if(ac){ag.push(ad);S=true}}}}}if(af!==g){if(!ae){Y=ag}ab=ab.replace(H.match[Z],"");if(!S){return[]}break}}}ab=ab.replace(/\s*,\s*/,"");if(ab==U){if(S==null){throw"Syntax error, unrecognized expression: "+ab}else{break}}U=ab}return Y};var H=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(S){return S.getAttribute("href")}},relative:{"+":function(W,T){for(var U=0,S=W.length;U<S;U++){var V=W[U];if(V){var X=V.previousSibling;while(X&&X.nodeType!==1){X=X.previousSibling}W[U]=typeof T==="string"?X||false:X===T}}if(typeof T==="string"){F.filter(T,W,true)}},">":function(X,T,Y){if(typeof T==="string"&&!/\W/.test(T)){T=Y?T:T.toUpperCase();for(var U=0,S=X.length;U<S;U++){var W=X[U];if(W){var V=W.parentNode;X[U]=V.nodeName===T?V:false}}}else{for(var U=0,S=X.length;U<S;U++){var W=X[U];if(W){X[U]=typeof T==="string"?W.parentNode:W.parentNode===T}}if(typeof T==="string"){F.filter(T,X,true)}}},"":function(V,T,X){var U="done"+(K++),S=R;if(!T.match(/\W/)){var W=T=X?T:T.toUpperCase();S=O}S("parentNode",T,U,V,W,X)},"~":function(V,T,X){var U="done"+(K++),S=R;if(typeof T==="string"&&!T.match(/\W/)){var W=T=X?T:T.toUpperCase();S=O}S("previousSibling",T,U,V,W,X)}},find:{ID:function(T,U,V){if(typeof U.getElementById!=="undefined"&&!V){var S=U.getElementById(T[1]);return S?[S]:[]}},NAME:function(S,T,U){if(typeof T.getElementsByName!=="undefined"&&!U){return T.getElementsByName(S[1])}},TAG:function(S,T){return T.getElementsByTagName(S[1])}},preFilter:{CLASS:function(V,T,U,S,Y){V=" "+V[1].replace(/\\/g,"")+" ";var X;for(var W=0;(X=T[W])!=null;W++){if(X){if(Y^(" "+X.className+" ").indexOf(V)>=0){if(!U){S.push(X)}}else{if(U){T[W]=false}}}}return false},ID:function(S){return S[1].replace(/\\/g,"")},TAG:function(T,S){for(var U=0;S[U]===false;U++){}return S[U]&&P(S[U])?T[1]:T[1].toUpperCase()},CHILD:function(S){if(S[1]=="nth"){var T=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(S[2]=="even"&&"2n"||S[2]=="odd"&&"2n+1"||!/\D/.test(S[2])&&"0n+"+S[2]||S[2]);S[2]=(T[1]+(T[2]||1))-0;S[3]=T[3]-0}S[0]="done"+(K++);return S},ATTR:function(T){var S=T[1].replace(/\\/g,"");if(H.attrMap[S]){T[1]=H.attrMap[S]}if(T[2]==="~="){T[4]=" "+T[4]+" "}return T},PSEUDO:function(W,T,U,S,X){if(W[1]==="not"){if(W[3].match(Q).length>1){W[3]=F(W[3],null,null,T)}else{var V=F.filter(W[3],T,U,true^X);if(!U){S.push.apply(S,V)}return false}}else{if(H.match.POS.test(W[0])){return true}}return W},POS:function(S){S.unshift(true);return S}},filters:{enabled:function(S){return S.disabled===false&&S.type!=="hidden"},disabled:function(S){return S.disabled===true},checked:function(S){return S.checked===true},selected:function(S){S.parentNode.selectedIndex;return S.selected===true},parent:function(S){return !!S.firstChild},empty:function(S){return !S.firstChild},has:function(U,T,S){return !!F(S[3],U).length},header:function(S){return/h\d/i.test(S.nodeName)},text:function(S){return"text"===S.type},radio:function(S){return"radio"===S.type},checkbox:function(S){return"checkbox"===S.type},file:function(S){return"file"===S.type},password:function(S){return"password"===S.type},submit:function(S){return"submit"===S.type},image:function(S){return"image"===S.type},reset:function(S){return"reset"===S.type},button:function(S){return"button"===S.type||S.nodeName.toUpperCase()==="BUTTON"},input:function(S){return/input|select|textarea|button/i.test(S.nodeName)}},setFilters:{first:function(T,S){return S===0},last:function(U,T,S,V){return T===V.length-1},even:function(T,S){return S%2===0},odd:function(T,S){return S%2===1},lt:function(U,T,S){return T<S[3]-0},gt:function(U,T,S){return T>S[3]-0},nth:function(U,T,S){return S[3]-0==T},eq:function(U,T,S){return S[3]-0==T}},filter:{CHILD:function(S,V){var Y=V[1],Z=S.parentNode;var X=V[0];if(Z&&(!Z[X]||!S.nodeIndex)){var W=1;for(var T=Z.firstChild;T;T=T.nextSibling){if(T.nodeType==1){T.nodeIndex=W++}}Z[X]=W-1}if(Y=="first"){return S.nodeIndex==1}else{if(Y=="last"){return S.nodeIndex==Z[X]}else{if(Y=="only"){return Z[X]==1}else{if(Y=="nth"){var ab=false,U=V[2],aa=V[3];if(U==1&&aa==0){return true}if(U==0){if(S.nodeIndex==aa){ab=true}}else{if((S.nodeIndex-aa)%U==0&&(S.nodeIndex-aa)/U>=0){ab=true}}return ab}}}}},PSEUDO:function(Y,U,V,Z){var T=U[1],W=H.filters[T];if(W){return W(Y,V,U,Z)}else{if(T==="contains"){return(Y.textContent||Y.innerText||"").indexOf(U[3])>=0}else{if(T==="not"){var X=U[3];for(var V=0,S=X.length;V<S;V++){if(X[V]===Y){return false}}return true}}}},ID:function(T,S){return T.nodeType===1&&T.getAttribute("id")===S},TAG:function(T,S){return(S==="*"&&T.nodeType===1)||T.nodeName===S},CLASS:function(T,S){return S.test(T.className)},ATTR:function(W,U){var S=H.attrHandle[U[1]]?H.attrHandle[U[1]](W):W[U[1]]||W.getAttribute(U[1]),X=S+"",V=U[2],T=U[4];return S==null?V==="!=":V==="="?X===T:V==="*="?X.indexOf(T)>=0:V==="~="?(" "+X+" ").indexOf(T)>=0:!U[4]?S:V==="!="?X!=T:V==="^="?X.indexOf(T)===0:V==="$="?X.substr(X.length-T.length)===T:V==="|="?X===T||X.substr(0,T.length+1)===T+"-":false},POS:function(W,T,U,X){var S=T[2],V=H.setFilters[S];if(V){return V(W,U,T,X)}}}};var L=H.match.POS;for(var N in H.match){H.match[N]=RegExp(H.match[N].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(T,S){T=Array.prototype.slice.call(T);if(S){S.push.apply(S,T);return S}return T};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(M){E=function(W,V){var T=V||[];if(G.call(W)==="[object Array]"){Array.prototype.push.apply(T,W)}else{if(typeof W.length==="number"){for(var U=0,S=W.length;U<S;U++){T.push(W[U])}}else{for(var U=0;W[U];U++){T.push(W[U])}}}return T}}(function(){var T=document.createElement("form"),U="script"+(new Date).getTime();T.innerHTML="<input name='"+U+"'/>";var S=document.documentElement;S.insertBefore(T,S.firstChild);if(!!document.getElementById(U)){H.find.ID=function(W,X,Y){if(typeof X.getElementById!=="undefined"&&!Y){var V=X.getElementById(W[1]);return V?V.id===W[1]||typeof V.getAttributeNode!=="undefined"&&V.getAttributeNode("id").nodeValue===W[1]?[V]:g:[]}};H.filter.ID=function(X,V){var W=typeof X.getAttributeNode!=="undefined"&&X.getAttributeNode("id");return X.nodeType===1&&W&&W.nodeValue===V}}S.removeChild(T)})();(function(){var S=document.createElement("div");S.appendChild(document.createComment(""));if(S.getElementsByTagName("*").length>0){H.find.TAG=function(T,X){var W=X.getElementsByTagName(T[1]);if(T[1]==="*"){var V=[];for(var U=0;W[U];U++){if(W[U].nodeType===1){V.push(W[U])}}W=V}return W}}S.innerHTML="<a href='#'></a>";if(S.firstChild&&S.firstChild.getAttribute("href")!=="#"){H.attrHandle.href=function(T){return T.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var S=F,T=document.createElement("div");T.innerHTML="<p class='TEST'></p>";if(T.querySelectorAll&&T.querySelectorAll(".TEST").length===0){return}F=function(X,W,U,V){W=W||document;if(!V&&W.nodeType===9&&!P(W)){try{return E(W.querySelectorAll(X),U)}catch(Y){}}return S(X,W,U,V)};F.find=S.find;F.filter=S.filter;F.selectors=S.selectors;F.matches=S.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){H.order.splice(1,0,"CLASS");H.find.CLASS=function(S,T){return T.getElementsByClassName(S[1])}}function O(T,Z,Y,ac,aa,ab){for(var W=0,U=ac.length;W<U;W++){var S=ac[W];if(S){S=S[T];var X=false;while(S&&S.nodeType){var V=S[Y];if(V){X=ac[V];break}if(S.nodeType===1&&!ab){S[Y]=W}if(S.nodeName===Z){X=S;break}S=S[T]}ac[W]=X}}}function R(T,Y,X,ab,Z,aa){for(var V=0,U=ab.length;V<U;V++){var S=ab[V];if(S){S=S[T];var W=false;while(S&&S.nodeType){if(S[X]){W=ab[S[X]];break}if(S.nodeType===1){if(!aa){S[X]=V}if(typeof Y!=="string"){if(S===Y){W=true;break}}else{if(F.filter(Y,[S]).length>0){W=S;break}}}S=S[T]}ab[V]=W}}}var J=document.compareDocumentPosition?function(T,S){return T.compareDocumentPosition(S)&16}:function(T,S){return T!==S&&(T.contains?T.contains(S):true)};var P=function(S){return S.nodeType===9&&S.documentElement.nodeName!=="HTML"||!!S.ownerDocument&&P(S.ownerDocument)};var I=function(S,Z){var V=[],W="",X,U=Z.nodeType?[Z]:Z;while((X=H.match.PSEUDO.exec(S))){W+=X[0];S=S.replace(H.match.PSEUDO,"")}S=H.relative[S]?S+"*":S;for(var Y=0,T=U.length;Y<T;Y++){F(S,U[Y],V)}return F.filter(W,V)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(S){return"hidden"===S.type||o.css(S,"display")==="none"||o.css(S,"visibility")==="hidden"};F.selectors.filters.visible=function(S){return"hidden"!==S.type&&o.css(S,"display")!=="none"&&o.css(S,"visibility")!=="hidden"};F.selectors.filters.animated=function(S){return o.grep(o.timers,function(T){return S===T.elem}).length};o.multiFilter=function(U,S,T){if(T){U=":not("+U+")"}return F.matches(U,S)};o.dir=function(U,T){var S=[],V=U[T];while(V&&V!=document){if(V.nodeType==1){S.push(V)}V=V[T]}return S};o.nth=function(W,S,U,V){S=S||1;var T=0;for(;W;W=W[U]){if(W.nodeType==1&&++T==S){break}}return W};o.sibling=function(U,T){var S=[];for(;U;U=U.nextSibling){if(U.nodeType==1&&U!=T){S.push(U)}}return S};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){G=false}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&typeof l.frameElement==="undefined"){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width="1px";L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L)})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}this[H].style.display=o.data(this[H],"olddisplay",K)}}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)==1){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n)}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(H,F){var E=H?"Left":"Top",G=H?"Right":"Bottom";o.fn["inner"+F]=function(){return this[F.toLowerCase()]()+j(this,"padding"+E)+j(this,"padding"+G)};o.fn["outer"+F]=function(J){return this["inner"+F]()+j(this,"border"+E+"Width")+j(this,"border"+G+"Width")+(J?j(this,"margin"+E)+j(this,"margin"+G):0)};var I=F.toLowerCase();o.fn[I]=function(J){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+F]||document.body["client"+F]:this[0]==document?Math.max(document.documentElement["client"+F],document.body["scroll"+F],document.documentElement["scroll"+F],document.body["offset"+F],document.documentElement["offset"+F]):J===g?(this.length?o.css(this[0],I):null):this.css(I,typeof J==="string"?J:J+"px")}})})(); \ No newline at end of file diff --git a/bigbluebutton-web/web-app/js/prototype/animation.js b/bigbluebutton-web/web-app/js/prototype/animation.js deleted file mode 100644 index c35c2a59359eeb947a3a7f2704f2c57c154b97d5..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/animation.js +++ /dev/null @@ -1,7 +0,0 @@ -/* -Copyright (c) 2006, Yahoo! Inc. All rights reserved. -Code licensed under the BSD License: -http://developer.yahoo.net/yui/license.txt -version: 0.10.0 -*/ -YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={doMethod:function(attribute,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attribute,val,unit){YAHOO.util.Dom.setStyle(this.getEl(),attribute,val+unit);},getAttribute:function(attribute){return parseFloat(YAHOO.util.Dom.getStyle(this.getEl(),attribute));},defaultUnit:'px',defaultUnits:{opacity:' '},init:function(el,attributes,duration,method){var isAnimated=false;var startTime=null;var endTime=null;var actualFrames=0;var defaultValues={};el=YAHOO.util.Dom.get(el);this.attributes=attributes||{};this.duration=duration||1;this.method=method||YAHOO.util.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=YAHOO.util.AnimMgr.fps;this.getEl=function(){return el;};this.setDefault=function(attribute,val){if(val.constructor!=Array&&(val=='auto'||isNaN(val))){switch(attribute){case'width':val=el.clientWidth||el.offsetWidth;break;case'height':val=el.clientHeight||el.offsetHeight;break;case'left':if(YAHOO.util.Dom.getStyle(el,'position')=='absolute'){val=el.offsetLeft;}else{val=0;}break;case'top':if(YAHOO.util.Dom.getStyle(el,'position')=='absolute'){val=el.offsetTop;}else{val=0;}break;default:val=0;}}defaultValues[attribute]=val;};this.getDefault=function(attribute){return defaultValues[attribute];};this.isAnimated=function(){return isAnimated;};this.getStartTime=function(){return startTime;};this.animate=function(){if(this.isAnimated()){return false;}this.onStart.fire();this._onStart.fire();this.totalFrames=(this.useSeconds)?Math.ceil(YAHOO.util.AnimMgr.fps*this.duration):this.duration;YAHOO.util.AnimMgr.registerElement(this);var attributes=this.attributes;var el=this.getEl();var val;for(var attribute in attributes){val=this.getAttribute(attribute);this.setDefault(attribute,val);}isAnimated=true;actualFrames=0;startTime=new Date();};this.stop=function(){if(!this.isAnimated()){return false;}this.currentFrame=0;endTime=new Date();var data={time:endTime,duration:endTime-startTime,frames:actualFrames,fps:actualFrames/this.duration};isAnimated=false;actualFrames=0;this.onComplete.fire(data);};var onTween=function(){var start;var end=null;var val;var unit;var attributes=this['attributes'];for(var attribute in attributes){unit=attributes[attribute]['unit']||this.defaultUnits[attribute]||this.defaultUnit;if(typeof attributes[attribute]['from']!='undefined'){start=attributes[attribute]['from'];}else{start=this.getDefault(attribute);}if(typeof attributes[attribute]['to']!='undefined'){end=attributes[attribute]['to'];}else if(typeof attributes[attribute]['by']!='undefined'){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i<len;++i){end[i]=start[i]+attributes[attribute]['by'][i];}}else{end=start+attributes[attribute]['by'];}}if(end!==null&&typeof end!='undefined'){val=this.doMethod(attribute,start,end);if((attribute=='width'||attribute=='height'||attribute=='opacity')&&val<0){val=0;}this.setAttribute(attribute,val,unit);}}actualFrames+=1;};this._onStart=new YAHOO.util.CustomEvent('_onStart',this);this.onStart=new YAHOO.util.CustomEvent('start',this);this.onTween=new YAHOO.util.CustomEvent('tween',this);this._onTween=new YAHOO.util.CustomEvent('_tween',this);this.onComplete=new YAHOO.util.CustomEvent('complete',this);this._onTween.subscribe(onTween);}};YAHOO.util.AnimMgr=new function(){var thread=null;var queue=[];var tweenCount=0;this.fps=200;this.delay=1;this.registerElement=function(tween){if(tween.isAnimated()){return false;}queue[queue.length]=tween;tweenCount+=1;this.start();};this.start=function(){if(thread===null){thread=setInterval(this.run,this.delay);}};this.stop=function(tween){if(!tween){clearInterval(thread);for(var i=0,len=queue.length;i<len;++i){if(queue[i].isAnimated()){queue[i].stop();}}queue=[];thread=null;tweenCount=0;}else{tween.stop();tweenCount-=1;if(tweenCount<=0){this.stop();}}};this.run=function(){for(var i=0,len=queue.length;i<len;++i){var tween=queue[i];if(!tween||!tween.isAnimated()){continue;}if(tween.currentFrame<tween.totalFrames||tween.totalFrames===null){tween.currentFrame+=1;if(tween.useSeconds){correctFrame(tween);}tween.onTween.fire();tween._onTween.fire();}else{YAHOO.util.AnimMgr.stop(tween);}}};var correctFrame=function(tween){var frames=tween.totalFrames;var frame=tween.currentFrame;var expected=(tween.currentFrame*tween.duration*1000/tween.totalFrames);var elapsed=(new Date()-tween.getStartTime());var tweak=0;if(elapsed<tween.duration*1000){tweak=Math.round((elapsed/expected-1)*tween.currentFrame);}else{tweak=frames-(frame+1);}if(tweak>0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);}tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i<n;++i){tmp[i]=[points[i][0],points[i][1]];}for(var j=1;j<n;++j){for(i=0;i<n-j;++i){tmp[i][0]=(1-t)*tmp[i][0]+t*tmp[parseInt(i+1,10)][0];tmp[i][1]=(1-t)*tmp[i][1]+t*tmp[parseInt(i+1,10)][1];}}return[tmp[0][0],tmp[0][1]];};};YAHOO.util.Easing=new function(){this.easeNone=function(t,b,c,d){return b+c*(t/=d);};this.easeIn=function(t,b,c,d){return b+c*((t/=d)*t*t);};this.easeOut=function(t,b,c,d){var ts=(t/=d)*t;var tc=ts*t;return b+c*(tc+-3*ts+3*t);};this.easeBoth=function(t,b,c,d){var ts=(t/=d)*t;var tc=ts*t;return b+c*(-2*tc+3*ts);};this.backIn=function(t,b,c,d){var ts=(t/=d)*t;var tc=ts*t;return b+c*(-3.4005*tc*ts+10.2*ts*ts+-6.2*tc+0.4*ts);};this.backOut=function(t,b,c,d){var ts=(t/=d)*t;var tc=ts*t;return b+c*(8.292*tc*ts+-21.88*ts*ts+22.08*tc+-12.69*ts+5.1975*t);};this.backBoth=function(t,b,c,d){var ts=(t/=d)*t;var tc=ts*t;return b+c*(0.402*tc*ts+-2.1525*ts*ts+-3.2*tc+8*ts+-2.05*t);};};YAHOO.util.Motion=function(el,attributes,duration,method){if(el){this.initMotion(el,attributes,duration,method);}};YAHOO.util.Motion.prototype=new YAHOO.util.Anim();YAHOO.util.Motion.prototype.defaultUnits.points='px';YAHOO.util.Motion.prototype.doMethod=function(attribute,start,end){var val=null;if(attribute=='points'){var translatedPoints=this.getTranslatedPoints();var t=this.method(this.currentFrame,0,100,this.totalFrames)/100;if(translatedPoints){val=YAHOO.util.Bezier.getPosition(translatedPoints,t);}}else{val=this.method(this.currentFrame,start,end-start,this.totalFrames);}return val;};YAHOO.util.Motion.prototype.getAttribute=function(attribute){var val=null;if(attribute=='points'){val=[this.getAttribute('left'),this.getAttribute('top')];if(isNaN(val[0])){val[0]=0;}if(isNaN(val[1])){val[1]=0;}}else{val=parseFloat(YAHOO.util.Dom.getStyle(this.getEl(),attribute));}return val;};YAHOO.util.Motion.prototype.setAttribute=function(attribute,val,unit){if(attribute=='points'){YAHOO.util.Dom.setStyle(this.getEl(),'left',val[0]+unit);YAHOO.util.Dom.setStyle(this.getEl(),'top',val[1]+unit);}else{YAHOO.util.Dom.setStyle(this.getEl(),attribute,val+unit);}};YAHOO.util.Motion.prototype.initMotion=function(el,attributes,duration,method){YAHOO.util.Anim.call(this,el,attributes,duration,method);attributes=attributes||{};attributes.points=attributes.points||{};attributes.points.control=attributes.points.control||[];this.attributes=attributes;var start;var end=null;var translatedPoints=null;this.getTranslatedPoints=function(){return translatedPoints;};var translateValues=function(val,self){var pageXY=YAHOO.util.Dom.getXY(self.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var onStart=function(){start=this.getAttribute('points');var attributes=this.attributes;var control=attributes['points']['control']||[];if(control.length>0&&control[0].constructor!=Array){control=[control];}if(YAHOO.util.Dom.getStyle(this.getEl(),'position')=='static'){YAHOO.util.Dom.setStyle(this.getEl(),'position','relative');}if(typeof attributes['points']['from']!='undefined'){YAHOO.util.Dom.setXY(this.getEl(),attributes['points']['from']);start=this.getAttribute('points');}else if((start[0]===0||start[1]===0)){YAHOO.util.Dom.setXY(this.getEl(),YAHOO.util.Dom.getXY(this.getEl()));start=this.getAttribute('points');}var i,len;if(typeof attributes['points']['to']!='undefined'){end=translateValues(attributes['points']['to'],this);for(i=0,len=control.length;i<len;++i){control[i]=translateValues(control[i],this);}}else if(typeof attributes['points']['by']!='undefined'){end=[start[0]+attributes['points']['by'][0],start[1]+attributes['points']['by'][1]];for(i=0,len=control.length;i<len;++i){control[i]=[start[0]+control[i][0],start[1]+control[i][1]];}}if(end){translatedPoints=[start];if(control.length>0){translatedPoints=translatedPoints.concat(control);}translatedPoints[translatedPoints.length]=end;}};this._onStart.subscribe(onStart);};YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Anim.call(this,el,attributes,duration,method);}};YAHOO.util.Scroll.prototype=new YAHOO.util.Anim();YAHOO.util.Scroll.prototype.defaultUnits.scroll=' ';YAHOO.util.Scroll.prototype.doMethod=function(attribute,start,end){var val=null;if(attribute=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=this.method(this.currentFrame,start,end-start,this.totalFrames);}return val;};YAHOO.util.Scroll.prototype.getAttribute=function(attribute){var val=null;var el=this.getEl();if(attribute=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=parseFloat(YAHOO.util.Dom.getStyle(el,attribute));}return val;};YAHOO.util.Scroll.prototype.setAttribute=function(attribute,val,unit){var el=this.getEl();if(attribute=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{YAHOO.util.Dom.setStyle(el,attribute,val+unit);}}; diff --git a/bigbluebutton-web/web-app/js/prototype/builder.js b/bigbluebutton-web/web-app/js/prototype/builder.js deleted file mode 100644 index 953b4a53221321d9c9a2049dca7947eef41894e9..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/builder.js +++ /dev/null @@ -1,136 +0,0 @@ -// script.aculo.us builder.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -var Builder = { - NODEMAP: { - AREA: 'map', - CAPTION: 'table', - COL: 'table', - COLGROUP: 'table', - LEGEND: 'fieldset', - OPTGROUP: 'select', - OPTION: 'select', - PARAM: 'object', - TBODY: 'table', - TD: 'table', - TFOOT: 'table', - TH: 'table', - THEAD: 'table', - TR: 'table' - }, - // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, - // due to a Firefox bug - node: function(elementName) { - elementName = elementName.toUpperCase(); - - // try innerHTML approach - var parentTag = this.NODEMAP[elementName] || 'div'; - var parentElement = document.createElement(parentTag); - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" + elementName + "></" + elementName + ">"; - } catch(e) {} - var element = parentElement.firstChild || null; - - // see if browser added wrapping tags - if(element && (element.tagName.toUpperCase() != elementName)) - element = element.getElementsByTagName(elementName)[0]; - - // fallback to createElement approach - if(!element) element = document.createElement(elementName); - - // abort if nothing could be created - if(!element) return; - - // attributes (or text) - if(arguments[1]) - if(this._isStringOrNumber(arguments[1]) || - (arguments[1] instanceof Array) || - arguments[1].tagName) { - this._children(element, arguments[1]); - } else { - var attrs = this._attributes(arguments[1]); - if(attrs.length) { - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" +elementName + " " + - attrs + "></" + elementName + ">"; - } catch(e) {} - element = parentElement.firstChild || null; - // workaround firefox 1.0.X bug - if(!element) { - element = document.createElement(elementName); - for(attr in arguments[1]) - element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; - } - if(element.tagName.toUpperCase() != elementName) - element = parentElement.getElementsByTagName(elementName)[0]; - } - } - - // text, or array of children - if(arguments[2]) - this._children(element, arguments[2]); - - return element; - }, - _text: function(text) { - return document.createTextNode(text); - }, - - ATTR_MAP: { - 'className': 'class', - 'htmlFor': 'for' - }, - - _attributes: function(attributes) { - var attrs = []; - for(attribute in attributes) - attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + - '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); - return attrs.join(" "); - }, - _children: function(element, children) { - if(children.tagName) { - element.appendChild(children); - return; - } - if(typeof children=='object') { // array can hold nodes and text - children.flatten().each( function(e) { - if(typeof e=='object') - element.appendChild(e) - else - if(Builder._isStringOrNumber(e)) - element.appendChild(Builder._text(e)); - }); - } else - if(Builder._isStringOrNumber(children)) - element.appendChild(Builder._text(children)); - }, - _isStringOrNumber: function(param) { - return(typeof param=='string' || typeof param=='number'); - }, - build: function(html) { - var element = this.node('div'); - $(element).update(html.strip()); - return element.down(); - }, - dump: function(scope) { - if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope - - var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + - "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + - "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ - "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ - "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ - "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); - - tags.each( function(tag){ - scope[tag] = function() { - return Builder.node.apply(Builder, [tag].concat($A(arguments))); - } - }); - } -} diff --git a/bigbluebutton-web/web-app/js/prototype/controls.js b/bigbluebutton-web/web-app/js/prototype/controls.js deleted file mode 100644 index 0088d18bb259d5e2b36b066f3117a09f7fa280b7..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/controls.js +++ /dev/null @@ -1,965 +0,0 @@ -// script.aculo.us controls.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) -// Contributors: -// Richard Livsey -// Rahul Bhargava -// Rob Wills -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// Autocompleter.Base handles all the autocompletion functionality -// that's independent of the data source for autocompletion. This -// includes drawing the autocompletion menu, observing keyboard -// and mouse events, and similar. -// -// Specific autocompleters need to provide, at the very least, -// a getUpdatedChoices function that will be invoked every time -// the text inside the monitored textbox changes. This method -// should get the text for which to provide autocompletion by -// invoking this.getToken(), NOT by directly accessing -// this.element.value. This is to allow incremental tokenized -// autocompletion. Specific auto-completion logic (AJAX, etc) -// belongs in getUpdatedChoices. -// -// Tokenized incremental autocompletion is enabled automatically -// when an autocompleter is instantiated with the 'tokens' option -// in the options parameter, e.g.: -// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); -// will incrementally autocomplete with a comma as the token. -// Additionally, ',' in the above example can be replaced with -// a token array, e.g. { tokens: [',', '\n'] } which -// enables autocompletion on multiple tokens. This is most -// useful when one of the tokens is \n (a newline), as it -// allows smart autocompletion after linebreaks. - -if(typeof Effect == 'undefined') - throw("controls.js requires including script.aculo.us' effects.js library"); - -var Autocompleter = { } -Autocompleter.Base = Class.create({ - baseInitialize: function(element, update, options) { - element = $(element) - this.element = element; - this.update = $(update); - this.hasFocus = false; - this.changed = false; - this.active = false; - this.index = 0; - this.entryCount = 0; - this.oldElementValue = this.element.value; - - if(this.setOptions) - this.setOptions(options); - else - this.options = options || { }; - - this.options.paramName = this.options.paramName || this.element.name; - this.options.tokens = this.options.tokens || []; - this.options.frequency = this.options.frequency || 0.4; - this.options.minChars = this.options.minChars || 1; - this.options.onShow = this.options.onShow || - function(element, update){ - if(!update.style.position || update.style.position=='absolute') { - update.style.position = 'absolute'; - Position.clone(element, update, { - setHeight: false, - offsetTop: element.offsetHeight - }); - } - Effect.Appear(update,{duration:0.15}); - }; - this.options.onHide = this.options.onHide || - function(element, update){ new Effect.Fade(update,{duration:0.15}) }; - - if(typeof(this.options.tokens) == 'string') - this.options.tokens = new Array(this.options.tokens); - // Force carriage returns as token delimiters anyway - if (!this.options.tokens.include('\n')) - this.options.tokens.push('\n'); - - this.observer = null; - - this.element.setAttribute('autocomplete','off'); - - Element.hide(this.update); - - Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); - Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this)); - }, - - show: function() { - if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); - if(!this.iefix && - (Prototype.Browser.IE) && - (Element.getStyle(this.update, 'position')=='absolute')) { - new Insertion.After(this.update, - '<iframe id="' + this.update.id + '_iefix" '+ - 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + - 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>'); - this.iefix = $(this.update.id+'_iefix'); - } - if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); - }, - - fixIEOverlapping: function() { - Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); - this.iefix.style.zIndex = 1; - this.update.style.zIndex = 2; - Element.show(this.iefix); - }, - - hide: function() { - this.stopIndicator(); - if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); - if(this.iefix) Element.hide(this.iefix); - }, - - startIndicator: function() { - if(this.options.indicator) Element.show(this.options.indicator); - }, - - stopIndicator: function() { - if(this.options.indicator) Element.hide(this.options.indicator); - }, - - onKeyPress: function(event) { - if(this.active) - switch(event.keyCode) { - case Event.KEY_TAB: - case Event.KEY_RETURN: - this.selectEntry(); - Event.stop(event); - case Event.KEY_ESC: - this.hide(); - this.active = false; - Event.stop(event); - return; - case Event.KEY_LEFT: - case Event.KEY_RIGHT: - return; - case Event.KEY_UP: - this.markPrevious(); - this.render(); - if(Prototype.Browser.WebKit) Event.stop(event); - return; - case Event.KEY_DOWN: - this.markNext(); - this.render(); - if(Prototype.Browser.WebKit) Event.stop(event); - return; - } - else - if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || - (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; - - this.changed = true; - this.hasFocus = true; - - if(this.observer) clearTimeout(this.observer); - this.observer = - setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); - }, - - activate: function() { - this.changed = false; - this.hasFocus = true; - this.getUpdatedChoices(); - }, - - onHover: function(event) { - var element = Event.findElement(event, 'LI'); - if(this.index != element.autocompleteIndex) - { - this.index = element.autocompleteIndex; - this.render(); - } - Event.stop(event); - }, - - onClick: function(event) { - var element = Event.findElement(event, 'LI'); - this.index = element.autocompleteIndex; - this.selectEntry(); - this.hide(); - }, - - onBlur: function(event) { - // needed to make click events working - setTimeout(this.hide.bind(this), 250); - this.hasFocus = false; - this.active = false; - }, - - render: function() { - if(this.entryCount > 0) { - for (var i = 0; i < this.entryCount; i++) - this.index==i ? - Element.addClassName(this.getEntry(i),"selected") : - Element.removeClassName(this.getEntry(i),"selected"); - if(this.hasFocus) { - this.show(); - this.active = true; - } - } else { - this.active = false; - this.hide(); - } - }, - - markPrevious: function() { - if(this.index > 0) this.index-- - else this.index = this.entryCount-1; - this.getEntry(this.index).scrollIntoView(true); - }, - - markNext: function() { - if(this.index < this.entryCount-1) this.index++ - else this.index = 0; - this.getEntry(this.index).scrollIntoView(false); - }, - - getEntry: function(index) { - return this.update.firstChild.childNodes[index]; - }, - - getCurrentEntry: function() { - return this.getEntry(this.index); - }, - - selectEntry: function() { - this.active = false; - this.updateElement(this.getCurrentEntry()); - }, - - updateElement: function(selectedElement) { - if (this.options.updateElement) { - this.options.updateElement(selectedElement); - return; - } - var value = ''; - if (this.options.select) { - var nodes = $(selectedElement).select('.' + this.options.select) || []; - if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); - } else - value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); - - var bounds = this.getTokenBounds(); - if (bounds[0] != -1) { - var newValue = this.element.value.substr(0, bounds[0]); - var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); - if (whitespace) - newValue += whitespace[0]; - this.element.value = newValue + value + this.element.value.substr(bounds[1]); - } else { - this.element.value = value; - } - this.oldElementValue = this.element.value; - this.element.focus(); - - if (this.options.afterUpdateElement) - this.options.afterUpdateElement(this.element, selectedElement); - }, - - updateChoices: function(choices) { - if(!this.changed && this.hasFocus) { - this.update.innerHTML = choices; - Element.cleanWhitespace(this.update); - Element.cleanWhitespace(this.update.down()); - - if(this.update.firstChild && this.update.down().childNodes) { - this.entryCount = - this.update.down().childNodes.length; - for (var i = 0; i < this.entryCount; i++) { - var entry = this.getEntry(i); - entry.autocompleteIndex = i; - this.addObservers(entry); - } - } else { - this.entryCount = 0; - } - - this.stopIndicator(); - this.index = 0; - - if(this.entryCount==1 && this.options.autoSelect) { - this.selectEntry(); - this.hide(); - } else { - this.render(); - } - } - }, - - addObservers: function(element) { - Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); - Event.observe(element, "click", this.onClick.bindAsEventListener(this)); - }, - - onObserverEvent: function() { - this.changed = false; - this.tokenBounds = null; - if(this.getToken().length>=this.options.minChars) { - this.getUpdatedChoices(); - } else { - this.active = false; - this.hide(); - } - this.oldElementValue = this.element.value; - }, - - getToken: function() { - var bounds = this.getTokenBounds(); - return this.element.value.substring(bounds[0], bounds[1]).strip(); - }, - - getTokenBounds: function() { - if (null != this.tokenBounds) return this.tokenBounds; - var value = this.element.value; - if (value.strip().empty()) return [-1, 0]; - var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); - var offset = (diff == this.oldElementValue.length ? 1 : 0); - var prevTokenPos = -1, nextTokenPos = value.length; - var tp; - for (var index = 0, l = this.options.tokens.length; index < l; ++index) { - tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); - if (tp > prevTokenPos) prevTokenPos = tp; - tp = value.indexOf(this.options.tokens[index], diff + offset); - if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; - } - return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); - } -}); - -Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { - var boundary = Math.min(newS.length, oldS.length); - for (var index = 0; index < boundary; ++index) - if (newS[index] != oldS[index]) - return index; - return boundary; -}; - -Ajax.Autocompleter = Class.create(Autocompleter.Base, { - initialize: function(element, update, url, options) { - this.baseInitialize(element, update, options); - this.options.asynchronous = true; - this.options.onComplete = this.onComplete.bind(this); - this.options.defaultParams = this.options.parameters || null; - this.url = url; - }, - - getUpdatedChoices: function() { - this.startIndicator(); - - var entry = encodeURIComponent(this.options.paramName) + '=' + - encodeURIComponent(this.getToken()); - - this.options.parameters = this.options.callback ? - this.options.callback(this.element, entry) : entry; - - if(this.options.defaultParams) - this.options.parameters += '&' + this.options.defaultParams; - - new Ajax.Request(this.url, this.options); - }, - - onComplete: function(request) { - this.updateChoices(request.responseText); - } -}); - -// The local array autocompleter. Used when you'd prefer to -// inject an array of autocompletion options into the page, rather -// than sending out Ajax queries, which can be quite slow sometimes. -// -// The constructor takes four parameters. The first two are, as usual, -// the id of the monitored textbox, and id of the autocompletion menu. -// The third is the array you want to autocomplete from, and the fourth -// is the options block. -// -// Extra local autocompletion options: -// - choices - How many autocompletion choices to offer -// -// - partialSearch - If false, the autocompleter will match entered -// text only at the beginning of strings in the -// autocomplete array. Defaults to true, which will -// match text at the beginning of any *word* in the -// strings in the autocomplete array. If you want to -// search anywhere in the string, additionally set -// the option fullSearch to true (default: off). -// -// - fullSsearch - Search anywhere in autocomplete array strings. -// -// - partialChars - How many characters to enter before triggering -// a partial match (unlike minChars, which defines -// how many characters are required to do any match -// at all). Defaults to 2. -// -// - ignoreCase - Whether to ignore case when autocompleting. -// Defaults to true. -// -// It's possible to pass in a custom function as the 'selector' -// option, if you prefer to write your own autocompletion logic. -// In that case, the other options above will not apply unless -// you support them. - -Autocompleter.Local = Class.create(Autocompleter.Base, { - initialize: function(element, update, array, options) { - this.baseInitialize(element, update, options); - this.options.array = array; - }, - - getUpdatedChoices: function() { - this.updateChoices(this.options.selector(this)); - }, - - setOptions: function(options) { - this.options = Object.extend({ - choices: 10, - partialSearch: true, - partialChars: 2, - ignoreCase: true, - fullSearch: false, - selector: function(instance) { - var ret = []; // Beginning matches - var partial = []; // Inside matches - var entry = instance.getToken(); - var count = 0; - - for (var i = 0; i < instance.options.array.length && - ret.length < instance.options.choices ; i++) { - - var elem = instance.options.array[i]; - var foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase()) : - elem.indexOf(entry); - - while (foundPos != -1) { - if (foundPos == 0 && elem.length != entry.length) { - ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + - elem.substr(entry.length) + "</li>"); - break; - } else if (entry.length >= instance.options.partialChars && - instance.options.partialSearch && foundPos != -1) { - if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { - partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" + - elem.substr(foundPos, entry.length) + "</strong>" + elem.substr( - foundPos + entry.length) + "</li>"); - break; - } - } - - foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : - elem.indexOf(entry, foundPos + 1); - - } - } - if (partial.length) - ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) - return "<ul>" + ret.join('') + "</ul>"; - } - }, options || { }); - } -}); - -// AJAX in-place editor and collection editor -// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007). - -// Use this if you notice weird scrolling problems on some browsers, -// the DOM might be a bit confused when this gets called so do this -// waits 1 ms (with setTimeout) until it does the activation -Field.scrollFreeActivate = function(field) { - setTimeout(function() { - Field.activate(field); - }, 1); -} - -Ajax.InPlaceEditor = Class.create({ - initialize: function(element, url, options) { - this.url = url; - this.element = element = $(element); - this.prepareOptions(); - this._controls = { }; - arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! - Object.extend(this.options, options || { }); - if (!this.options.formId && this.element.id) { - this.options.formId = this.element.id + '-inplaceeditor'; - if ($(this.options.formId)) - this.options.formId = ''; - } - if (this.options.externalControl) - this.options.externalControl = $(this.options.externalControl); - if (!this.options.externalControl) - this.options.externalControlOnly = false; - this._originalBackground = this.element.getStyle('background-color') || 'transparent'; - this.element.title = this.options.clickToEditText; - this._boundCancelHandler = this.handleFormCancellation.bind(this); - this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); - this._boundFailureHandler = this.handleAJAXFailure.bind(this); - this._boundSubmitHandler = this.handleFormSubmission.bind(this); - this._boundWrapperHandler = this.wrapUp.bind(this); - this.registerListeners(); - }, - checkForEscapeOrReturn: function(e) { - if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; - if (Event.KEY_ESC == e.keyCode) - this.handleFormCancellation(e); - else if (Event.KEY_RETURN == e.keyCode) - this.handleFormSubmission(e); - }, - createControl: function(mode, handler, extraClasses) { - var control = this.options[mode + 'Control']; - var text = this.options[mode + 'Text']; - if ('button' == control) { - var btn = document.createElement('input'); - btn.type = 'submit'; - btn.value = text; - btn.className = 'editor_' + mode + '_button'; - if ('cancel' == mode) - btn.onclick = this._boundCancelHandler; - this._form.appendChild(btn); - this._controls[mode] = btn; - } else if ('link' == control) { - var link = document.createElement('a'); - link.href = '#'; - link.appendChild(document.createTextNode(text)); - link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; - link.className = 'editor_' + mode + '_link'; - if (extraClasses) - link.className += ' ' + extraClasses; - this._form.appendChild(link); - this._controls[mode] = link; - } - }, - createEditField: function() { - var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); - var fld; - if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { - fld = document.createElement('input'); - fld.type = 'text'; - var size = this.options.size || this.options.cols || 0; - if (0 < size) fld.size = size; - } else { - fld = document.createElement('textarea'); - fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); - fld.cols = this.options.cols || 40; - } - fld.name = this.options.paramName; - fld.value = text; // No HTML breaks conversion anymore - fld.className = 'editor_field'; - if (this.options.submitOnBlur) - fld.onblur = this._boundSubmitHandler; - this._controls.editor = fld; - if (this.options.loadTextURL) - this.loadExternalText(); - this._form.appendChild(this._controls.editor); - }, - createForm: function() { - var ipe = this; - function addText(mode, condition) { - var text = ipe.options['text' + mode + 'Controls']; - if (!text || condition === false) return; - ipe._form.appendChild(document.createTextNode(text)); - }; - this._form = $(document.createElement('form')); - this._form.id = this.options.formId; - this._form.addClassName(this.options.formClassName); - this._form.onsubmit = this._boundSubmitHandler; - this.createEditField(); - if ('textarea' == this._controls.editor.tagName.toLowerCase()) - this._form.appendChild(document.createElement('br')); - if (this.options.onFormCustomization) - this.options.onFormCustomization(this, this._form); - addText('Before', this.options.okControl || this.options.cancelControl); - this.createControl('ok', this._boundSubmitHandler); - addText('Between', this.options.okControl && this.options.cancelControl); - this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); - addText('After', this.options.okControl || this.options.cancelControl); - }, - destroy: function() { - if (this._oldInnerHTML) - this.element.innerHTML = this._oldInnerHTML; - this.leaveEditMode(); - this.unregisterListeners(); - }, - enterEditMode: function(e) { - if (this._saving || this._editing) return; - this._editing = true; - this.triggerCallback('onEnterEditMode'); - if (this.options.externalControl) - this.options.externalControl.hide(); - this.element.hide(); - this.createForm(); - this.element.parentNode.insertBefore(this._form, this.element); - if (!this.options.loadTextURL) - this.postProcessEditField(); - if (e) Event.stop(e); - }, - enterHover: function(e) { - if (this.options.hoverClassName) - this.element.addClassName(this.options.hoverClassName); - if (this._saving) return; - this.triggerCallback('onEnterHover'); - }, - getText: function() { - return this.element.innerHTML; - }, - handleAJAXFailure: function(transport) { - this.triggerCallback('onFailure', transport); - if (this._oldInnerHTML) { - this.element.innerHTML = this._oldInnerHTML; - this._oldInnerHTML = null; - } - }, - handleFormCancellation: function(e) { - this.wrapUp(); - if (e) Event.stop(e); - }, - handleFormSubmission: function(e) { - var form = this._form; - var value = $F(this._controls.editor); - this.prepareSubmission(); - var params = this.options.callback(form, value) || ''; - if (Object.isString(params)) - params = params.toQueryParams(); - params.editorId = this.element.id; - if (this.options.htmlResponse) { - var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); - Object.extend(options, { - parameters: params, - onComplete: this._boundWrapperHandler, - onFailure: this._boundFailureHandler - }); - new Ajax.Updater({ success: this.element }, this.url, options); - } else { - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: params, - onComplete: this._boundWrapperHandler, - onFailure: this._boundFailureHandler - }); - new Ajax.Request(this.url, options); - } - if (e) Event.stop(e); - }, - leaveEditMode: function() { - this.element.removeClassName(this.options.savingClassName); - this.removeForm(); - this.leaveHover(); - this.element.style.backgroundColor = this._originalBackground; - this.element.show(); - if (this.options.externalControl) - this.options.externalControl.show(); - this._saving = false; - this._editing = false; - this._oldInnerHTML = null; - this.triggerCallback('onLeaveEditMode'); - }, - leaveHover: function(e) { - if (this.options.hoverClassName) - this.element.removeClassName(this.options.hoverClassName); - if (this._saving) return; - this.triggerCallback('onLeaveHover'); - }, - loadExternalText: function() { - this._form.addClassName(this.options.loadingClassName); - this._controls.editor.disabled = true; - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - this._form.removeClassName(this.options.loadingClassName); - var text = transport.responseText; - if (this.options.stripLoadedTextTags) - text = text.stripTags(); - this._controls.editor.value = text; - this._controls.editor.disabled = false; - this.postProcessEditField(); - }.bind(this), - onFailure: this._boundFailureHandler - }); - new Ajax.Request(this.options.loadTextURL, options); - }, - postProcessEditField: function() { - var fpc = this.options.fieldPostCreation; - if (fpc) - $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); - }, - prepareOptions: function() { - this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); - Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); - [this._extraDefaultOptions].flatten().compact().each(function(defs) { - Object.extend(this.options, defs); - }.bind(this)); - }, - prepareSubmission: function() { - this._saving = true; - this.removeForm(); - this.leaveHover(); - this.showSaving(); - }, - registerListeners: function() { - this._listeners = { }; - var listener; - $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { - listener = this[pair.value].bind(this); - this._listeners[pair.key] = listener; - if (!this.options.externalControlOnly) - this.element.observe(pair.key, listener); - if (this.options.externalControl) - this.options.externalControl.observe(pair.key, listener); - }.bind(this)); - }, - removeForm: function() { - if (!this._form) return; - this._form.remove(); - this._form = null; - this._controls = { }; - }, - showSaving: function() { - this._oldInnerHTML = this.element.innerHTML; - this.element.innerHTML = this.options.savingText; - this.element.addClassName(this.options.savingClassName); - this.element.style.backgroundColor = this._originalBackground; - this.element.show(); - }, - triggerCallback: function(cbName, arg) { - if ('function' == typeof this.options[cbName]) { - this.options[cbName](this, arg); - } - }, - unregisterListeners: function() { - $H(this._listeners).each(function(pair) { - if (!this.options.externalControlOnly) - this.element.stopObserving(pair.key, pair.value); - if (this.options.externalControl) - this.options.externalControl.stopObserving(pair.key, pair.value); - }.bind(this)); - }, - wrapUp: function(transport) { - this.leaveEditMode(); - // Can't use triggerCallback due to backward compatibility: requires - // binding + direct element - this._boundComplete(transport, this.element); - } -}); - -Object.extend(Ajax.InPlaceEditor.prototype, { - dispose: Ajax.InPlaceEditor.prototype.destroy -}); - -Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { - initialize: function($super, element, url, options) { - this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; - $super(element, url, options); - }, - - createEditField: function() { - var list = document.createElement('select'); - list.name = this.options.paramName; - list.size = 1; - this._controls.editor = list; - this._collection = this.options.collection || []; - if (this.options.loadCollectionURL) - this.loadCollection(); - else - this.checkForExternalText(); - this._form.appendChild(this._controls.editor); - }, - - loadCollection: function() { - this._form.addClassName(this.options.loadingClassName); - this.showLoadingText(this.options.loadingCollectionText); - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - var js = transport.responseText.strip(); - if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check - throw 'Server returned an invalid collection representation.'; - this._collection = eval(js); - this.checkForExternalText(); - }.bind(this), - onFailure: this.onFailure - }); - new Ajax.Request(this.options.loadCollectionURL, options); - }, - - showLoadingText: function(text) { - this._controls.editor.disabled = true; - var tempOption = this._controls.editor.firstChild; - if (!tempOption) { - tempOption = document.createElement('option'); - tempOption.value = ''; - this._controls.editor.appendChild(tempOption); - tempOption.selected = true; - } - tempOption.update((text || '').stripScripts().stripTags()); - }, - - checkForExternalText: function() { - this._text = this.getText(); - if (this.options.loadTextURL) - this.loadExternalText(); - else - this.buildOptionList(); - }, - - loadExternalText: function() { - this.showLoadingText(this.options.loadingText); - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - this._text = transport.responseText.strip(); - this.buildOptionList(); - }.bind(this), - onFailure: this.onFailure - }); - new Ajax.Request(this.options.loadTextURL, options); - }, - - buildOptionList: function() { - this._form.removeClassName(this.options.loadingClassName); - this._collection = this._collection.map(function(entry) { - return 2 === entry.length ? entry : [entry, entry].flatten(); - }); - var marker = ('value' in this.options) ? this.options.value : this._text; - var textFound = this._collection.any(function(entry) { - return entry[0] == marker; - }.bind(this)); - this._controls.editor.update(''); - var option; - this._collection.each(function(entry, index) { - option = document.createElement('option'); - option.value = entry[0]; - option.selected = textFound ? entry[0] == marker : 0 == index; - option.appendChild(document.createTextNode(entry[1])); - this._controls.editor.appendChild(option); - }.bind(this)); - this._controls.editor.disabled = false; - Field.scrollFreeActivate(this._controls.editor); - } -}); - -//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** -//**** This only exists for a while, in order to let **** -//**** users adapt to the new API. Read up on the new **** -//**** API and convert your code to it ASAP! **** - -Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { - if (!options) return; - function fallback(name, expr) { - if (name in options || expr === undefined) return; - options[name] = expr; - }; - fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : - options.cancelLink == options.cancelButton == false ? false : undefined))); - fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : - options.okLink == options.okButton == false ? false : undefined))); - fallback('highlightColor', options.highlightcolor); - fallback('highlightEndColor', options.highlightendcolor); -}; - -Object.extend(Ajax.InPlaceEditor, { - DefaultOptions: { - ajaxOptions: { }, - autoRows: 3, // Use when multi-line w/ rows == 1 - cancelControl: 'link', // 'link'|'button'|false - cancelText: 'cancel', - clickToEditText: 'Click to edit', - externalControl: null, // id|elt - externalControlOnly: false, - fieldPostCreation: 'activate', // 'activate'|'focus'|false - formClassName: 'inplaceeditor-form', - formId: null, // id|elt - highlightColor: '#ffff99', - highlightEndColor: '#ffffff', - hoverClassName: '', - htmlResponse: true, - loadingClassName: 'inplaceeditor-loading', - loadingText: 'Loading...', - okControl: 'button', // 'link'|'button'|false - okText: 'ok', - paramName: 'value', - rows: 1, // If 1 and multi-line, uses autoRows - savingClassName: 'inplaceeditor-saving', - savingText: 'Saving...', - size: 0, - stripLoadedTextTags: false, - submitOnBlur: false, - textAfterControls: '', - textBeforeControls: '', - textBetweenControls: '' - }, - DefaultCallbacks: { - callback: function(form) { - return Form.serialize(form); - }, - onComplete: function(transport, element) { - // For backward compatibility, this one is bound to the IPE, and passes - // the element directly. It was too often customized, so we don't break it. - new Effect.Highlight(element, { - startcolor: this.options.highlightColor, keepBackgroundImage: true }); - }, - onEnterEditMode: null, - onEnterHover: function(ipe) { - ipe.element.style.backgroundColor = ipe.options.highlightColor; - if (ipe._effect) - ipe._effect.cancel(); - }, - onFailure: function(transport, ipe) { - alert('Error communication with the server: ' + transport.responseText.stripTags()); - }, - onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. - onLeaveEditMode: null, - onLeaveHover: function(ipe) { - ipe._effect = new Effect.Highlight(ipe.element, { - startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, - restorecolor: ipe._originalBackground, keepBackgroundImage: true - }); - } - }, - Listeners: { - click: 'enterEditMode', - keydown: 'checkForEscapeOrReturn', - mouseover: 'enterHover', - mouseout: 'leaveHover' - } -}); - -Ajax.InPlaceCollectionEditor.DefaultOptions = { - loadingCollectionText: 'Loading options...' -}; - -// Delayed observer, like Form.Element.Observer, -// but waits for delay after last key input -// Ideal for live-search fields - -Form.Element.DelayedObserver = Class.create({ - initialize: function(element, delay, callback) { - this.delay = delay || 0.5; - this.element = $(element); - this.callback = callback; - this.timer = null; - this.lastValue = $F(this.element); - Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); - }, - delayedListener: function(event) { - if(this.lastValue == $F(this.element)) return; - if(this.timer) clearTimeout(this.timer); - this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); - this.lastValue = $F(this.element); - }, - onTimerEvent: function() { - this.timer = null; - this.callback(this.element, $F(this.element)); - } -}); diff --git a/bigbluebutton-web/web-app/js/prototype/dragdrop.js b/bigbluebutton-web/web-app/js/prototype/dragdrop.js deleted file mode 100644 index 14ebc6f5c3031db5d58e5d16126b7c767fd82b7e..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/dragdrop.js +++ /dev/null @@ -1,974 +0,0 @@ -// script.aculo.us dragdrop.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if(Object.isUndefined(Effect)) - throw("dragdrop.js requires including script.aculo.us' effects.js library"); - -var Droppables = { - drops: [], - - remove: function(element) { - this.drops = this.drops.reject(function(d) { return d.element==$(element) }); - }, - - add: function(element) { - element = $(element); - var options = Object.extend({ - greedy: true, - hoverclass: null, - tree: false - }, arguments[1] || { }); - - // cache containers - if(options.containment) { - options._containers = []; - var containment = options.containment; - if(Object.isArray(containment)) { - containment.each( function(c) { options._containers.push($(c)) }); - } else { - options._containers.push($(containment)); - } - } - - if(options.accept) options.accept = [options.accept].flatten(); - - Element.makePositioned(element); // fix IE - options.element = element; - - this.drops.push(options); - }, - - findDeepestChild: function(drops) { - deepest = drops[0]; - - for (i = 1; i < drops.length; ++i) - if (Element.isParent(drops[i].element, deepest.element)) - deepest = drops[i]; - - return deepest; - }, - - isContained: function(element, drop) { - var containmentNode; - if(drop.tree) { - containmentNode = element.treeNode; - } else { - containmentNode = element.parentNode; - } - return drop._containers.detect(function(c) { return containmentNode == c }); - }, - - isAffected: function(point, element, drop) { - return ( - (drop.element!=element) && - ((!drop._containers) || - this.isContained(element, drop)) && - ((!drop.accept) || - (Element.classNames(element).detect( - function(v) { return drop.accept.include(v) } ) )) && - Position.within(drop.element, point[0], point[1]) ); - }, - - deactivate: function(drop) { - if(drop.hoverclass) - Element.removeClassName(drop.element, drop.hoverclass); - this.last_active = null; - }, - - activate: function(drop) { - if(drop.hoverclass) - Element.addClassName(drop.element, drop.hoverclass); - this.last_active = drop; - }, - - show: function(point, element) { - if(!this.drops.length) return; - var drop, affected = []; - - this.drops.each( function(drop) { - if(Droppables.isAffected(point, element, drop)) - affected.push(drop); - }); - - if(affected.length>0) - drop = Droppables.findDeepestChild(affected); - - if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); - if (drop) { - Position.within(drop.element, point[0], point[1]); - if(drop.onHover) - drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); - - if (drop != this.last_active) Droppables.activate(drop); - } - }, - - fire: function(event, element) { - if(!this.last_active) return; - Position.prepare(); - - if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) - if (this.last_active.onDrop) { - this.last_active.onDrop(element, this.last_active.element, event); - return true; - } - }, - - reset: function() { - if(this.last_active) - this.deactivate(this.last_active); - } -} - -var Draggables = { - drags: [], - observers: [], - - register: function(draggable) { - if(this.drags.length == 0) { - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.updateDrag.bindAsEventListener(this); - this.eventKeypress = this.keyPress.bindAsEventListener(this); - - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - Event.observe(document, "keypress", this.eventKeypress); - } - this.drags.push(draggable); - }, - - unregister: function(draggable) { - this.drags = this.drags.reject(function(d) { return d==draggable }); - if(this.drags.length == 0) { - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - Event.stopObserving(document, "keypress", this.eventKeypress); - } - }, - - activate: function(draggable) { - if(draggable.options.delay) { - this._timeout = setTimeout(function() { - Draggables._timeout = null; - window.focus(); - Draggables.activeDraggable = draggable; - }.bind(this), draggable.options.delay); - } else { - window.focus(); // allows keypress events if window isn't currently focused, fails for Safari - this.activeDraggable = draggable; - } - }, - - deactivate: function() { - this.activeDraggable = null; - }, - - updateDrag: function(event) { - if(!this.activeDraggable) return; - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - // Mozilla-based browsers fire successive mousemove events with - // the same coordinates, prevent needless redrawing (moz bug?) - if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; - this._lastPointer = pointer; - - this.activeDraggable.updateDrag(event, pointer); - }, - - endDrag: function(event) { - if(this._timeout) { - clearTimeout(this._timeout); - this._timeout = null; - } - if(!this.activeDraggable) return; - this._lastPointer = null; - this.activeDraggable.endDrag(event); - this.activeDraggable = null; - }, - - keyPress: function(event) { - if(this.activeDraggable) - this.activeDraggable.keyPress(event); - }, - - addObserver: function(observer) { - this.observers.push(observer); - this._cacheObserverCallbacks(); - }, - - removeObserver: function(element) { // element instead of observer fixes mem leaks - this.observers = this.observers.reject( function(o) { return o.element==element }); - this._cacheObserverCallbacks(); - }, - - notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' - if(this[eventName+'Count'] > 0) - this.observers.each( function(o) { - if(o[eventName]) o[eventName](eventName, draggable, event); - }); - if(draggable.options[eventName]) draggable.options[eventName](draggable, event); - }, - - _cacheObserverCallbacks: function() { - ['onStart','onEnd','onDrag'].each( function(eventName) { - Draggables[eventName+'Count'] = Draggables.observers.select( - function(o) { return o[eventName]; } - ).length; - }); - } -} - -/*--------------------------------------------------------------------------*/ - -var Draggable = Class.create({ - initialize: function(element) { - var defaults = { - handle: false, - reverteffect: function(element, top_offset, left_offset) { - var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; - new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, - queue: {scope:'_draggable', position:'end'} - }); - }, - endeffect: function(element) { - var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; - new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, - queue: {scope:'_draggable', position:'end'}, - afterFinish: function(){ - Draggable._dragging[element] = false - } - }); - }, - zindex: 1000, - revert: false, - quiet: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } - delay: 0 - }; - - if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) - Object.extend(defaults, { - starteffect: function(element) { - element._opacity = Element.getOpacity(element); - Draggable._dragging[element] = true; - new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); - } - }); - - var options = Object.extend(defaults, arguments[1] || { }); - - this.element = $(element); - - if(options.handle && Object.isString(options.handle)) - this.handle = this.element.down('.'+options.handle, 0); - - if(!this.handle) this.handle = $(options.handle); - if(!this.handle) this.handle = this.element; - - if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { - options.scroll = $(options.scroll); - this._isScrollChild = Element.childOf(this.element, options.scroll); - } - - Element.makePositioned(this.element); // fix IE - - this.options = options; - this.dragging = false; - - this.eventMouseDown = this.initDrag.bindAsEventListener(this); - Event.observe(this.handle, "mousedown", this.eventMouseDown); - - Draggables.register(this); - }, - - destroy: function() { - Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); - Draggables.unregister(this); - }, - - currentDelta: function() { - return([ - parseInt(Element.getStyle(this.element,'left') || '0'), - parseInt(Element.getStyle(this.element,'top') || '0')]); - }, - - initDrag: function(event) { - if(!Object.isUndefined(Draggable._dragging[this.element]) && - Draggable._dragging[this.element]) return; - if(Event.isLeftClick(event)) { - // abort on form elements, fixes a Firefox issue - var src = Event.element(event); - if((tag_name = src.tagName.toUpperCase()) && ( - tag_name=='INPUT' || - tag_name=='SELECT' || - tag_name=='OPTION' || - tag_name=='BUTTON' || - tag_name=='TEXTAREA')) return; - - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); - this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); - - Draggables.activate(this); - Event.stop(event); - } - }, - - startDrag: function(event) { - this.dragging = true; - if(!this.delta) - this.delta = this.currentDelta(); - - if(this.options.zindex) { - this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); - this.element.style.zIndex = this.options.zindex; - } - - if(this.options.ghosting) { - this._clone = this.element.cloneNode(true); - this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); - if (!this.element._originallyAbsolute) - Position.absolutize(this.element); - this.element.parentNode.insertBefore(this._clone, this.element); - } - - if(this.options.scroll) { - if (this.options.scroll == window) { - var where = this._getWindowScroll(this.options.scroll); - this.originalScrollLeft = where.left; - this.originalScrollTop = where.top; - } else { - this.originalScrollLeft = this.options.scroll.scrollLeft; - this.originalScrollTop = this.options.scroll.scrollTop; - } - } - - Draggables.notify('onStart', this, event); - - if(this.options.starteffect) this.options.starteffect(this.element); - }, - - updateDrag: function(event, pointer) { - if(!this.dragging) this.startDrag(event); - - if(!this.options.quiet){ - Position.prepare(); - Droppables.show(pointer, this.element); - } - - Draggables.notify('onDrag', this, event); - - this.draw(pointer); - if(this.options.change) this.options.change(this); - - if(this.options.scroll) { - this.stopScrolling(); - - var p; - if (this.options.scroll == window) { - with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } - } else { - p = Position.page(this.options.scroll); - p[0] += this.options.scroll.scrollLeft + Position.deltaX; - p[1] += this.options.scroll.scrollTop + Position.deltaY; - p.push(p[0]+this.options.scroll.offsetWidth); - p.push(p[1]+this.options.scroll.offsetHeight); - } - var speed = [0,0]; - if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); - if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); - if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); - if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); - this.startScrolling(speed); - } - - // fix AppleWebKit rendering - if(Prototype.Browser.WebKit) window.scrollBy(0,0); - - Event.stop(event); - }, - - finishDrag: function(event, success) { - this.dragging = false; - - if(this.options.quiet){ - Position.prepare(); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - Droppables.show(pointer, this.element); - } - - if(this.options.ghosting) { - if (!this.element._originallyAbsolute) - Position.relativize(this.element); - delete this.element._originallyAbsolute; - Element.remove(this._clone); - this._clone = null; - } - - var dropped = false; - if(success) { - dropped = Droppables.fire(event, this.element); - if (!dropped) dropped = false; - } - if(dropped && this.options.onDropped) this.options.onDropped(this.element); - Draggables.notify('onEnd', this, event); - - var revert = this.options.revert; - if(revert && Object.isFunction(revert)) revert = revert(this.element); - - var d = this.currentDelta(); - if(revert && this.options.reverteffect) { - if (dropped == 0 || revert != 'failure') - this.options.reverteffect(this.element, - d[1]-this.delta[1], d[0]-this.delta[0]); - } else { - this.delta = d; - } - - if(this.options.zindex) - this.element.style.zIndex = this.originalZ; - - if(this.options.endeffect) - this.options.endeffect(this.element); - - Draggables.deactivate(this); - Droppables.reset(); - }, - - keyPress: function(event) { - if(event.keyCode!=Event.KEY_ESC) return; - this.finishDrag(event, false); - Event.stop(event); - }, - - endDrag: function(event) { - if(!this.dragging) return; - this.stopScrolling(); - this.finishDrag(event, true); - Event.stop(event); - }, - - draw: function(point) { - var pos = Position.cumulativeOffset(this.element); - if(this.options.ghosting) { - var r = Position.realOffset(this.element); - pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; - } - - var d = this.currentDelta(); - pos[0] -= d[0]; pos[1] -= d[1]; - - if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { - pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; - pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; - } - - var p = [0,1].map(function(i){ - return (point[i]-pos[i]-this.offset[i]) - }.bind(this)); - - if(this.options.snap) { - if(Object.isFunction(this.options.snap)) { - p = this.options.snap(p[0],p[1],this); - } else { - if(Object.isArray(this.options.snap)) { - p = p.map( function(v, i) { - return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)) - } else { - p = p.map( function(v) { - return (v/this.options.snap).round()*this.options.snap }.bind(this)) - } - }} - - var style = this.element.style; - if((!this.options.constraint) || (this.options.constraint=='horizontal')) - style.left = p[0] + "px"; - if((!this.options.constraint) || (this.options.constraint=='vertical')) - style.top = p[1] + "px"; - - if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering - }, - - stopScrolling: function() { - if(this.scrollInterval) { - clearInterval(this.scrollInterval); - this.scrollInterval = null; - Draggables._lastScrollPointer = null; - } - }, - - startScrolling: function(speed) { - if(!(speed[0] || speed[1])) return; - this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; - this.lastScrolled = new Date(); - this.scrollInterval = setInterval(this.scroll.bind(this), 10); - }, - - scroll: function() { - var current = new Date(); - var delta = current - this.lastScrolled; - this.lastScrolled = current; - if(this.options.scroll == window) { - with (this._getWindowScroll(this.options.scroll)) { - if (this.scrollSpeed[0] || this.scrollSpeed[1]) { - var d = delta / 1000; - this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); - } - } - } else { - this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; - this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; - } - - Position.prepare(); - Droppables.show(Draggables._lastPointer, this.element); - Draggables.notify('onDrag', this); - if (this._isScrollChild) { - Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); - Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; - Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; - if (Draggables._lastScrollPointer[0] < 0) - Draggables._lastScrollPointer[0] = 0; - if (Draggables._lastScrollPointer[1] < 0) - Draggables._lastScrollPointer[1] = 0; - this.draw(Draggables._lastScrollPointer); - } - - if(this.options.change) this.options.change(this); - }, - - _getWindowScroll: function(w) { - var T, L, W, H; - with (w.document) { - if (w.document.documentElement && documentElement.scrollTop) { - T = documentElement.scrollTop; - L = documentElement.scrollLeft; - } else if (w.document.body) { - T = body.scrollTop; - L = body.scrollLeft; - } - if (w.innerWidth) { - W = w.innerWidth; - H = w.innerHeight; - } else if (w.document.documentElement && documentElement.clientWidth) { - W = documentElement.clientWidth; - H = documentElement.clientHeight; - } else { - W = body.offsetWidth; - H = body.offsetHeight - } - } - return { top: T, left: L, width: W, height: H }; - } -}); - -Draggable._dragging = { }; - -/*--------------------------------------------------------------------------*/ - -var SortableObserver = Class.create({ - initialize: function(element, observer) { - this.element = $(element); - this.observer = observer; - this.lastValue = Sortable.serialize(this.element); - }, - - onStart: function() { - this.lastValue = Sortable.serialize(this.element); - }, - - onEnd: function() { - Sortable.unmark(); - if(this.lastValue != Sortable.serialize(this.element)) - this.observer(this.element) - } -}); - -var Sortable = { - SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, - - sortables: { }, - - _findRootElement: function(element) { - while (element.tagName.toUpperCase() != "BODY") { - if(element.id && Sortable.sortables[element.id]) return element; - element = element.parentNode; - } - }, - - options: function(element) { - element = Sortable._findRootElement($(element)); - if(!element) return; - return Sortable.sortables[element.id]; - }, - - destroy: function(element){ - var s = Sortable.options(element); - - if(s) { - Draggables.removeObserver(s.element); - s.droppables.each(function(d){ Droppables.remove(d) }); - s.draggables.invoke('destroy'); - - delete Sortable.sortables[s.element.id]; - } - }, - - create: function(element) { - element = $(element); - var options = Object.extend({ - element: element, - tag: 'li', // assumes li children, override with tag: 'tagname' - dropOnEmpty: false, - tree: false, - treeTag: 'ul', - overlap: 'vertical', // one of 'vertical', 'horizontal' - constraint: 'vertical', // one of 'vertical', 'horizontal', false - containment: element, // also takes array of elements (or id's); or false - handle: false, // or a CSS class - only: false, - delay: 0, - hoverclass: null, - ghosting: false, - quiet: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - format: this.SERIALIZE_RULE, - - // these take arrays of elements or ids and can be - // used for better initialization performance - elements: false, - handles: false, - - onChange: Prototype.emptyFunction, - onUpdate: Prototype.emptyFunction - }, arguments[1] || { }); - - // clear any old sortable with same element - this.destroy(element); - - // build options for the draggables - var options_for_draggable = { - revert: true, - quiet: options.quiet, - scroll: options.scroll, - scrollSpeed: options.scrollSpeed, - scrollSensitivity: options.scrollSensitivity, - delay: options.delay, - ghosting: options.ghosting, - constraint: options.constraint, - handle: options.handle }; - - if(options.starteffect) - options_for_draggable.starteffect = options.starteffect; - - if(options.reverteffect) - options_for_draggable.reverteffect = options.reverteffect; - else - if(options.ghosting) options_for_draggable.reverteffect = function(element) { - element.style.top = 0; - element.style.left = 0; - }; - - if(options.endeffect) - options_for_draggable.endeffect = options.endeffect; - - if(options.zindex) - options_for_draggable.zindex = options.zindex; - - // build options for the droppables - var options_for_droppable = { - overlap: options.overlap, - containment: options.containment, - tree: options.tree, - hoverclass: options.hoverclass, - onHover: Sortable.onHover - } - - var options_for_tree = { - onHover: Sortable.onEmptyHover, - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass - } - - // fix for gecko engine - Element.cleanWhitespace(element); - - options.draggables = []; - options.droppables = []; - - // drop on empty handling - if(options.dropOnEmpty || options.tree) { - Droppables.add(element, options_for_tree); - options.droppables.push(element); - } - - (options.elements || this.findElements(element, options) || []).each( function(e,i) { - var handle = options.handles ? $(options.handles[i]) : - (options.handle ? $(e).select('.' + options.handle)[0] : e); - options.draggables.push( - new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); - Droppables.add(e, options_for_droppable); - if(options.tree) e.treeNode = element; - options.droppables.push(e); - }); - - if(options.tree) { - (Sortable.findTreeElements(element, options) || []).each( function(e) { - Droppables.add(e, options_for_tree); - e.treeNode = element; - options.droppables.push(e); - }); - } - - // keep reference - this.sortables[element.id] = options; - - // for onupdate - Draggables.addObserver(new SortableObserver(element, options.onUpdate)); - - }, - - // return all suitable-for-sortable elements in a guaranteed order - findElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.tag); - }, - - findTreeElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.treeTag); - }, - - onHover: function(element, dropon, overlap) { - if(Element.isParent(dropon, element)) return; - - if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { - return; - } else if(overlap>0.5) { - Sortable.mark(dropon, 'before'); - if(dropon.previousSibling != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, dropon); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } else { - Sortable.mark(dropon, 'after'); - var nextElement = dropon.nextSibling || null; - if(nextElement != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, nextElement); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } - }, - - onEmptyHover: function(element, dropon, overlap) { - var oldParentNode = element.parentNode; - var droponOptions = Sortable.options(dropon); - - if(!Element.isParent(dropon, element)) { - var index; - - var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); - var child = null; - - if(children) { - var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); - - for (index = 0; index < children.length; index += 1) { - if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { - offset -= Element.offsetSize (children[index], droponOptions.overlap); - } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { - child = index + 1 < children.length ? children[index + 1] : null; - break; - } else { - child = children[index]; - break; - } - } - } - - dropon.insertBefore(element, child); - - Sortable.options(oldParentNode).onChange(element); - droponOptions.onChange(element); - } - }, - - unmark: function() { - if(Sortable._marker) Sortable._marker.hide(); - }, - - mark: function(dropon, position) { - // mark on ghosting only - var sortable = Sortable.options(dropon.parentNode); - if(sortable && !sortable.ghosting) return; - - if(!Sortable._marker) { - Sortable._marker = - ($('dropmarker') || Element.extend(document.createElement('DIV'))). - hide().addClassName('dropmarker').setStyle({position:'absolute'}); - document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); - } - var offsets = Position.cumulativeOffset(dropon); - Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); - - if(position=='after') - if(sortable.overlap == 'horizontal') - Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); - else - Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); - - Sortable._marker.show(); - }, - - _tree: function(element, options, parent) { - var children = Sortable.findElements(element, options) || []; - - for (var i = 0; i < children.length; ++i) { - var match = children[i].id.match(options.format); - - if (!match) continue; - - var child = { - id: encodeURIComponent(match ? match[1] : null), - element: element, - parent: parent, - children: [], - position: parent.children.length, - container: $(children[i]).down(options.treeTag) - } - - /* Get the element containing the children and recurse over it */ - if (child.container) - this._tree(child.container, options, child) - - parent.children.push (child); - } - - return parent; - }, - - tree: function(element) { - element = $(element); - var sortableOptions = this.options(element); - var options = Object.extend({ - tag: sortableOptions.tag, - treeTag: sortableOptions.treeTag, - only: sortableOptions.only, - name: element.id, - format: sortableOptions.format - }, arguments[1] || { }); - - var root = { - id: null, - parent: null, - children: [], - container: element, - position: 0 - } - - return Sortable._tree(element, options, root); - }, - - /* Construct a [i] index for a particular node */ - _constructIndex: function(node) { - var index = ''; - do { - if (node.id) index = '[' + node.position + ']' + index; - } while ((node = node.parent) != null); - return index; - }, - - sequence: function(element) { - element = $(element); - var options = Object.extend(this.options(element), arguments[1] || { }); - - return $(this.findElements(element, options) || []).map( function(item) { - return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; - }); - }, - - setSequence: function(element, new_sequence) { - element = $(element); - var options = Object.extend(this.options(element), arguments[2] || { }); - - var nodeMap = { }; - this.findElements(element, options).each( function(n) { - if (n.id.match(options.format)) - nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; - n.parentNode.removeChild(n); - }); - - new_sequence.each(function(ident) { - var n = nodeMap[ident]; - if (n) { - n[1].appendChild(n[0]); - delete nodeMap[ident]; - } - }); - }, - - serialize: function(element) { - element = $(element); - var options = Object.extend(Sortable.options(element), arguments[1] || { }); - var name = encodeURIComponent( - (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); - - if (options.tree) { - return Sortable.tree(element, arguments[1]).children.map( function (item) { - return [name + Sortable._constructIndex(item) + "[id]=" + - encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); - }).flatten().join('&'); - } else { - return Sortable.sequence(element, arguments[1]).map( function(item) { - return name + "[]=" + encodeURIComponent(item); - }).join('&'); - } - } -} - -// Returns true if child is contained within element -Element.isParent = function(child, element) { - if (!child.parentNode || child == element) return false; - if (child.parentNode == element) return true; - return Element.isParent(child.parentNode, element); -} - -Element.findChildren = function(element, only, recursive, tagName) { - if(!element.hasChildNodes()) return null; - tagName = tagName.toUpperCase(); - if(only) only = [only].flatten(); - var elements = []; - $A(element.childNodes).each( function(e) { - if(e.tagName && e.tagName.toUpperCase()==tagName && - (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) - elements.push(e); - if(recursive) { - var grandchildren = Element.findChildren(e, only, recursive, tagName); - if(grandchildren) elements.push(grandchildren); - } - }); - - return (elements.length>0 ? elements.flatten() : []); -} - -Element.offsetSize = function (element, type) { - return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; -} diff --git a/bigbluebutton-web/web-app/js/prototype/effects.js b/bigbluebutton-web/web-app/js/prototype/effects.js deleted file mode 100644 index 27c29016aa7db9cc8076669dad598f8fc805b3bb..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/effects.js +++ /dev/null @@ -1,1122 +0,0 @@ -// script.aculo.us effects.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -// Justin Palmer (http://encytemedia.com/) -// Mark Pilgrim (http://diveintomark.org/) -// Martin Bialasinki -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -String.prototype.parseColor = function() { - var color = '#'; - if (this.slice(0,4) == 'rgb(') { - var cols = this.slice(4,this.length-1).split(','); - var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); - } else { - if (this.slice(0,1) == '#') { - if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); - if (this.length==7) color = this.toLowerCase(); - } - } - return (color.length==7 ? color : (arguments[0] || this)); -}; - -/*--------------------------------------------------------------------------*/ - -Element.collectTextNodes = function(element) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); - }).flatten().join(''); -}; - -Element.collectTextNodesIgnoreClass = function(element, className) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? - Element.collectTextNodesIgnoreClass(node, className) : '')); - }).flatten().join(''); -}; - -Element.setContentZoom = function(element, percent) { - element = $(element); - element.setStyle({fontSize: (percent/100) + 'em'}); - if (Prototype.Browser.WebKit) window.scrollBy(0,0); - return element; -}; - -Element.getInlineOpacity = function(element){ - return $(element).style.opacity || ''; -}; - -Element.forceRerendering = function(element) { - try { - element = $(element); - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch(e) { } -}; - -/*--------------------------------------------------------------------------*/ - -var Effect = { - _elementDoesNotExistError: { - name: 'ElementDoesNotExistError', - message: 'The specified DOM element does not exist, but is required for this effect to operate' - }, - Transitions: { - linear: Prototype.K, - sinoidal: function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; - }, - reverse: function(pos) { - return 1-pos; - }, - flicker: function(pos) { - var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; - return pos > 1 ? 1 : pos; - }, - wobble: function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; - }, - pulse: function(pos, pulses) { - pulses = pulses || 5; - return ( - ((pos % (1/pulses)) * pulses).round() == 0 ? - ((pos * pulses * 2) - (pos * pulses * 2).floor()) : - 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) - ); - }, - spring: function(pos) { - return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); - }, - none: function(pos) { - return 0; - }, - full: function(pos) { - return 1; - } - }, - DefaultOptions: { - duration: 1.0, // seconds - fps: 100, // 100= assume 66fps max. - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' - }, - tagifyText: function(element) { - var tagifyStyle = 'position:relative'; - if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; - - element = $(element); - $A(element.childNodes).each( function(child) { - if (child.nodeType==3) { - child.nodeValue.toArray().each( function(character) { - element.insertBefore( - new Element('span', {style: tagifyStyle}).update( - character == ' ' ? String.fromCharCode(160) : character), - child); - }); - Element.remove(child); - } - }); - }, - multiple: function(element, effect) { - var elements; - if (((typeof element == 'object') || - Object.isFunction(element)) && - (element.length)) - elements = element; - else - elements = $(element).childNodes; - - var options = Object.extend({ - speed: 0.1, - delay: 0.0 - }, arguments[2] || { }); - var masterDelay = options.delay; - - $A(elements).each( function(element, index) { - new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); - }); - }, - PAIRS: { - 'slide': ['SlideDown','SlideUp'], - 'blind': ['BlindDown','BlindUp'], - 'appear': ['Appear','Fade'] - }, - toggle: function(element, effect) { - element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ - queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || { }); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); - } -}; - -Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(Enumerable, { - initialize: function() { - this.effects = []; - this.interval = null; - }, - _each: function(iterator) { - this.effects._each(iterator); - }, - add: function(effect) { - var timestamp = new Date().getTime(); - - var position = Object.isString(effect.options.queue) ? - effect.options.queue : effect.options.queue.position; - - switch(position) { - case 'front': - // move unstarted effects after this effect - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - }); - break; - case 'with-last': - timestamp = this.effects.pluck('startOn').max() || timestamp; - break; - case 'end': - // start effect after last queued effect has finished - timestamp = this.effects.pluck('finishOn').max() || timestamp; - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - - if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) - this.effects.push(effect); - - if (!this.interval) - this.interval = setInterval(this.loop.bind(this), 15); - }, - remove: function(effect) { - this.effects = this.effects.reject(function(e) { return e==effect }); - if (this.effects.length == 0) { - clearInterval(this.interval); - this.interval = null; - } - }, - loop: function() { - var timePos = new Date().getTime(); - for(var i=0, len=this.effects.length;i<len;i++) - this.effects[i] && this.effects[i].loop(timePos); - } -}); - -Effect.Queues = { - instances: $H(), - get: function(queueName) { - if (!Object.isString(queueName)) return queueName; - - return this.instances.get(queueName) || - this.instances.set(queueName, new Effect.ScopedQueue()); - } -}; -Effect.Queue = Effect.Queues.get('global'); - -Effect.Base = Class.create({ - position: null, - start: function(options) { - function codeForEvent(options,eventName){ - return ( - (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + - (options[eventName] ? 'this.options.'+eventName+'(this);' : '') - ); - } - if (options && options.transition === false) options.transition = Effect.Transitions.linear; - this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); - this.currentFrame = 0; - this.state = 'idle'; - this.startOn = this.options.delay*1000; - this.finishOn = this.startOn+(this.options.duration*1000); - this.fromToDelta = this.options.to-this.options.from; - this.totalTime = this.finishOn-this.startOn; - this.totalFrames = this.options.fps*this.options.duration; - - eval('this.render = function(pos){ '+ - 'if (this.state=="idle"){this.state="running";'+ - codeForEvent(this.options,'beforeSetup')+ - (this.setup ? 'this.setup();':'')+ - codeForEvent(this.options,'afterSetup')+ - '};if (this.state=="running"){'+ - 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+ - 'this.position=pos;'+ - codeForEvent(this.options,'beforeUpdate')+ - (this.update ? 'this.update(pos);':'')+ - codeForEvent(this.options,'afterUpdate')+ - '}}'); - - this.event('beforeStart'); - if (!this.options.sync) - Effect.Queues.get(Object.isString(this.options.queue) ? - 'global' : this.options.queue.scope).add(this); - }, - loop: function(timePos) { - if (timePos >= this.startOn) { - if (timePos >= this.finishOn) { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - if (this.finish) this.finish(); - this.event('afterFinish'); - return; - } - var pos = (timePos - this.startOn) / this.totalTime, - frame = (pos * this.totalFrames).round(); - if (frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - cancel: function() { - if (!this.options.sync) - Effect.Queues.get(Object.isString(this.options.queue) ? - 'global' : this.options.queue.scope).remove(this); - this.state = 'finished'; - }, - event: function(eventName) { - if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); - if (this.options[eventName]) this.options[eventName](this); - }, - inspect: function() { - var data = $H(); - for(property in this) - if (!Object.isFunction(this[property])) data.set(property, this[property]); - return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>'; - } -}); - -Effect.Parallel = Class.create(Effect.Base, { - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - this.effects.invoke('render', position); - }, - finish: function(position) { - this.effects.each( function(effect) { - effect.render(1.0); - effect.cancel(); - effect.event('beforeFinish'); - if (effect.finish) effect.finish(position); - effect.event('afterFinish'); - }); - } -}); - -Effect.Tween = Class.create(Effect.Base, { - initialize: function(object, from, to) { - object = Object.isString(object) ? $(object) : object; - var args = $A(arguments), method = args.last(), - options = args.length == 5 ? args[3] : null; - this.method = Object.isFunction(method) ? method.bind(object) : - Object.isFunction(object[method]) ? object[method].bind(object) : - function(value) { object[method] = value }; - this.start(Object.extend({ from: from, to: to }, options || { })); - }, - update: function(position) { - this.method(position); - } -}); - -Effect.Event = Class.create(Effect.Base, { - initialize: function() { - this.start(Object.extend({ duration: 0 }, arguments[0] || { })); - }, - update: Prototype.emptyFunction -}); - -Effect.Opacity = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - // make this work on IE on elements without 'layout' - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - var options = Object.extend({ - from: this.element.getOpacity() || 0.0, - to: 1.0 - }, arguments[1] || { }); - this.start(options); - }, - update: function(position) { - this.element.setOpacity(position); - } -}); - -Effect.Move = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - x: 0, - y: 0, - mode: 'relative' - }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - this.element.makePositioned(); - this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); - this.originalTop = parseFloat(this.element.getStyle('top') || '0'); - if (this.options.mode == 'absolute') { - this.options.x = this.options.x - this.originalLeft; - this.options.y = this.options.y - this.originalTop; - } - }, - update: function(position) { - this.element.setStyle({ - left: (this.options.x * position + this.originalLeft).round() + 'px', - top: (this.options.y * position + this.originalTop).round() + 'px' - }); - } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { - return new Effect.Move(element, - Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); -}; - -Effect.Scale = Class.create(Effect.Base, { - initialize: function(element, percent) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or { } with provided values - scaleFrom: 100.0, - scaleTo: percent - }, arguments[2] || { }); - this.start(options); - }, - setup: function() { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = this.element.getStyle('position'); - - this.originalStyle = { }; - ['top','left','width','height','fontSize'].each( function(k) { - this.originalStyle[k] = this.element.style[k]; - }.bind(this)); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = this.element.getStyle('font-size') || '100%'; - ['em','px','%','pt'].each( function(fontSizeType) { - if (fontSize.indexOf(fontSizeType)>0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }.bind(this)); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - this.dims = null; - if (this.options.scaleMode=='box') - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - if (/^content/.test(this.options.scaleMode)) - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - if (!this.dims) - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - }, - update: function(position) { - var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if (this.options.scaleContent && this.fontSize) - this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); - this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); - }, - finish: function(position) { - if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); - }, - setDimensions: function(height, width) { - var d = { }; - if (this.options.scaleX) d.width = width.round() + 'px'; - if (this.options.scaleY) d.height = height.round() + 'px'; - if (this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if (this.elementPositioning == 'absolute') { - if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; - if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; - } else { - if (this.options.scaleY) d.top = -topd + 'px'; - if (this.options.scaleX) d.left = -leftd + 'px'; - } - } - this.element.setStyle(d); - } -}); - -Effect.Highlight = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - // Prevent executing on elements not in the layout flow - if (this.element.getStyle('display')=='none') { this.cancel(); return; } - // Disable background image during the effect - this.oldStyle = { }; - if (!this.options.keepBackgroundImage) { - this.oldStyle.backgroundImage = this.element.getStyle('background-image'); - this.element.setStyle({backgroundImage: 'none'}); - } - if (!this.options.endcolor) - this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); - if (!this.options.restorecolor) - this.options.restorecolor = this.element.getStyle('background-color'); - // init color calculations - this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); - this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); - }, - update: function(position) { - this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ - return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); - }, - finish: function() { - this.element.setStyle(Object.extend(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -Effect.ScrollTo = function(element) { - var options = arguments[1] || { }, - scrollOffsets = document.viewport.getScrollOffsets(), - elementOffsets = $(element).cumulativeOffset(), - max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); - - if (options.offset) elementOffsets[1] += options.offset; - - return new Effect.Tween(null, - scrollOffsets.top, - elementOffsets[1] > max ? max : elementOffsets[1], - options, - function(p){ scrollTo(scrollOffsets.left, p.round()) } - ); -}; - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - var options = Object.extend({ - from: element.getOpacity() || 1.0, - to: 0.0, - afterFinishInternal: function(effect) { - if (effect.options.to!=0) return; - effect.element.hide().setStyle({opacity: oldOpacity}); - } - }, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Appear = function(element) { - element = $(element); - var options = Object.extend({ - from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), - to: 1.0, - // force Safari to render floated elements properly - afterFinishInternal: function(effect) { - effect.element.forceRerendering(); - }, - beforeSetup: function(effect) { - effect.element.setOpacity(effect.options.from).show(); - }}, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Puff = function(element) { - element = $(element); - var oldStyle = { - opacity: element.getInlineOpacity(), - position: element.getStyle('position'), - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height - }; - return new Effect.Parallel( - [ new Effect.Scale(element, 200, - { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, - beforeSetupInternal: function(effect) { - Position.absolutize(effect.effects[0].element) - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().setStyle(oldStyle); } - }, arguments[1] || { }) - ); -}; - -Effect.BlindUp = function(element) { - element = $(element); - element.makeClipping(); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - restoreAfterFinish: true, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }, arguments[1] || { }) - ); -}; - -Effect.BlindDown = function(element) { - element = $(element); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping(); - } - }, arguments[1] || { })); -}; - -Effect.SwitchOff = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - return new Effect.Appear(element, Object.extend({ - duration: 0.4, - from: 0, - transition: Effect.Transitions.flicker, - afterFinishInternal: function(effect) { - new Effect.Scale(effect.element, 1, { - duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); - } - }) - } - }, arguments[1] || { })); -}; - -Effect.DropOut = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left'), - opacity: element.getInlineOpacity() }; - return new Effect.Parallel( - [ new Effect.Move(element, {x: 0, y: 100, sync: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 }) ], - Object.extend( - { duration: 0.5, - beforeSetup: function(effect) { - effect.effects[0].element.makePositioned(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); - } - }, arguments[1] || { })); -}; - -Effect.Shake = function(element) { - element = $(element); - var options = Object.extend({ - distance: 20, - duration: 0.5 - }, arguments[1] || {}); - var distance = parseFloat(options.distance); - var split = parseFloat(options.duration) / 10.0; - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left') }; - return new Effect.Move(element, - { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { - effect.element.undoPositioned().setStyle(oldStyle); - }}) }}) }}) }}) }}) }}); -}; - -Effect.SlideDown = function(element) { - element = $(element).cleanWhitespace(); - // SlideDown need to have the content of the element wrapped in a container element with fixed height! - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: window.opera ? 0 : 1, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || { }) - ); -}; - -Effect.SlideUp = function(element) { - element = $(element).cleanWhitespace(); - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, window.opera ? 0 : 1, - Object.extend({ scaleContent: false, - scaleX: false, - scaleMode: 'box', - scaleFrom: 100, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); - } - }, arguments[1] || { }) - ); -}; - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { - return new Effect.Scale(element, window.opera ? 1 : 0, { - restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }); -}; - -Effect.Grow = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.full - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.width; - initialMoveY = moveY = 0; - moveX = -dims.width; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.height; - moveY = -dims.height; - break; - case 'bottom-right': - initialMoveX = dims.width; - initialMoveY = dims.height; - moveX = -dims.width; - moveY = -dims.height; - break; - case 'center': - initialMoveX = dims.width / 2; - initialMoveY = dims.height / 2; - moveX = -dims.width / 2; - moveY = -dims.height / 2; - break; - } - - return new Effect.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetup: function(effect) { - effect.element.hide().makeClipping().makePositioned(); - }, - afterFinishInternal: function(effect) { - new Effect.Parallel( - [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), - new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), - new Effect.Scale(effect.element, 100, { - scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, - sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) - ], Object.extend({ - beforeSetup: function(effect) { - effect.effects[0].element.setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); - } - }, options) - ) - } - }); -}; - -Effect.Shrink = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.none - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.width; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.height; - break; - case 'bottom-right': - moveX = dims.width; - moveY = dims.height; - break; - case 'center': - moveX = dims.width / 2; - moveY = dims.height / 2; - break; - } - - return new Effect.Parallel( - [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), - new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), - new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) - ], Object.extend({ - beforeStartInternal: function(effect) { - effect.effects[0].element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } - }, options) - ); -}; - -Effect.Pulsate = function(element) { - element = $(element); - var options = arguments[1] || { }; - var oldOpacity = element.getInlineOpacity(); - var transition = options.transition || Effect.Transitions.sinoidal; - var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; - reverser.bind(transition); - return new Effect.Opacity(element, - Object.extend(Object.extend({ duration: 2.0, from: 0, - afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } - }, options), {transition: reverser})); -}; - -Effect.Fold = function(element) { - element = $(element); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height }; - element.makeClipping(); - return new Effect.Scale(element, 5, Object.extend({ - scaleContent: false, - scaleX: false, - afterFinishInternal: function(effect) { - new Effect.Scale(element, 1, { - scaleContent: false, - scaleY: false, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().setStyle(oldStyle); - } }); - }}, arguments[1] || { })); -}; - -Effect.Morph = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - style: { } - }, arguments[1] || { }); - - if (!Object.isString(options.style)) this.style = $H(options.style); - else { - if (options.style.include(':')) - this.style = options.style.parseStyle(); - else { - this.element.addClassName(options.style); - this.style = $H(this.element.getStyles()); - this.element.removeClassName(options.style); - var css = this.element.getStyles(); - this.style = this.style.reject(function(style) { - return style.value == css[style.key]; - }); - options.afterFinishInternal = function(effect) { - effect.element.addClassName(effect.options.style); - effect.transforms.each(function(transform) { - effect.element.style[transform.style] = ''; - }); - } - } - } - this.start(options); - }, - - setup: function(){ - function parseColor(color){ - if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; - color = color.parseColor(); - return $R(0,2).map(function(i){ - return parseInt( color.slice(i*2+1,i*2+3), 16 ) - }); - } - this.transforms = this.style.map(function(pair){ - var property = pair[0], value = pair[1], unit = null; - - if (value.parseColor('#zzzzzz') != '#zzzzzz') { - value = value.parseColor(); - unit = 'color'; - } else if (property == 'opacity') { - value = parseFloat(value); - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - } else if (Element.CSS_LENGTH.test(value)) { - var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); - value = parseFloat(components[1]); - unit = (components.length == 3) ? components[2] : null; - } - - var originalValue = this.element.getStyle(property); - return { - style: property.camelize(), - originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), - targetValue: unit=='color' ? parseColor(value) : value, - unit: unit - }; - }.bind(this)).reject(function(transform){ - return ( - (transform.originalValue == transform.targetValue) || - ( - transform.unit != 'color' && - (isNaN(transform.originalValue) || isNaN(transform.targetValue)) - ) - ) - }); - }, - update: function(position) { - var style = { }, transform, i = this.transforms.length; - while(i--) - style[(transform = this.transforms[i]).style] = - transform.unit=='color' ? '#'+ - (Math.round(transform.originalValue[0]+ - (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + - (Math.round(transform.originalValue[1]+ - (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + - (Math.round(transform.originalValue[2]+ - (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : - (transform.originalValue + - (transform.targetValue - transform.originalValue) * position).toFixed(3) + - (transform.unit === null ? '' : transform.unit); - this.element.setStyle(style, true); - } -}); - -Effect.Transform = Class.create({ - initialize: function(tracks){ - this.tracks = []; - this.options = arguments[1] || { }; - this.addTracks(tracks); - }, - addTracks: function(tracks){ - tracks.each(function(track){ - track = $H(track); - var data = track.values().first(); - this.tracks.push($H({ - ids: track.keys().first(), - effect: Effect.Morph, - options: { style: data } - })); - }.bind(this)); - return this; - }, - play: function(){ - return new Effect.Parallel( - this.tracks.map(function(track){ - var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); - var elements = [$(ids) || $$(ids)].flatten(); - return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); - }).flatten(), - this.options - ); - } -}); - -Element.CSS_PROPERTIES = $w( - 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + - 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + - 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + - 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + - 'fontSize fontWeight height left letterSpacing lineHeight ' + - 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ - 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + - 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + - 'right textIndent top width wordSpacing zIndex'); - -Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; - -String.__parseStyleElement = document.createElement('div'); -String.prototype.parseStyle = function(){ - var style, styleRules = $H(); - if (Prototype.Browser.WebKit) - style = new Element('div',{style:this}).style; - else { - String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>'; - style = String.__parseStyleElement.childNodes[0].style; - } - - Element.CSS_PROPERTIES.each(function(property){ - if (style[property]) styleRules.set(property, style[property]); - }); - - if (Prototype.Browser.IE && this.include('opacity')) - styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); - - return styleRules; -}; - -if (document.defaultView && document.defaultView.getComputedStyle) { - Element.getStyles = function(element) { - var css = document.defaultView.getComputedStyle($(element), null); - return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { - styles[property] = css[property]; - return styles; - }); - }; -} else { - Element.getStyles = function(element) { - element = $(element); - var css = element.currentStyle, styles; - styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) { - hash.set(property, css[property]); - return hash; - }); - if (!styles.opacity) styles.set('opacity', element.getOpacity()); - return styles; - }; -}; - -Effect.Methods = { - morph: function(element, style) { - element = $(element); - new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); - return element; - }, - visualEffect: function(element, effect, options) { - element = $(element) - var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); - new Effect[klass](element, options); - return element; - }, - highlight: function(element, options) { - element = $(element); - new Effect.Highlight(element, options); - return element; - } -}; - -$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ - 'pulsate shake puff squish switchOff dropOut').each( - function(effect) { - Effect.Methods[effect] = function(element, options){ - element = $(element); - Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); - return element; - } - } -); - -$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( - function(f) { Effect.Methods[f] = Element[f]; } -); - -Element.addMethods(Effect.Methods); diff --git a/bigbluebutton-web/web-app/js/prototype/prototype.js b/bigbluebutton-web/web-app/js/prototype/prototype.js deleted file mode 100644 index 5c73462946b96cd5f44fa74aae64895b99e14eb6..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/prototype.js +++ /dev/null @@ -1,4184 +0,0 @@ -/* Prototype JavaScript framework, version 1.6.0 - * (c) 2005-2007 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.6.0', - - Browser: { - IE: !!(window.attachEvent && !window.opera), - Opera: !!window.opera, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, - - BrowserFeatures: { - XPath: !!document.evaluate, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div').__proto__ && - document.createElement('div').__proto__ !== - document.createElement('form').__proto__ - }, - - ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', - JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - - emptyFunction: function() { }, - K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) - Prototype.BrowserFeatures.SpecificElementExtensions = false; - -if (Prototype.Browser.WebKit) - Prototype.BrowserFeatures.XPath = false; - -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - var subclass = function() { }; - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - - return klass; - } -}; - -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); - - if (!Object.keys({ toString: true }).length) - properties.push("toString", "valueOf"); - - for (var i = 0, length = properties.length; i < length; i++) { - var property = properties[i], value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value, value = Object.extend((function(m) { - return function() { return ancestor[m].apply(this, arguments) }; - })(property).wrap(method), { - valueOf: function() { return method }, - toString: function() { return method.toString() } - }); - } - this.prototype[property] = value; - } - - return this; - } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (object === undefined) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (value !== undefined) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toQueryString: function(object) { - return $H(object).toQueryString(); - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return object && object.nodeType == 1; - }, - - isArray: function(object) { - return object && object.constructor === Array; - }, - - isHash: function(object) { - return object instanceof Hash; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && arguments[0] === undefined) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Function.prototype.defer = Function.prototype.delay.curry(0.01); - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - execute: function() { - this.callback(this); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.execute(); - } finally { - this.currentlyExecuting = false; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = count === undefined ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = truncation === undefined ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, - - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, - - toQueryParams: function(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - }, - - toArray: function() { - return this.split(''); - }, - - succ: function() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, - - times: function(count) { - return count < 1 ? '' : new Array(count + 1).join(this); - }, - - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, - - dasherize: function() { - return this.gsub(/_/,'-'); - }, - - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, - - toJSON: function() { - return this.inspect(true); - }, - - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { - var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, - - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, - - include: function(pattern) { - return this.indexOf(pattern) > -1; - }, - - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, - - endsWith: function(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, - - empty: function() { - return this == ''; - }, - - blank: function() { - return /^\s*$/.test(this); - }, - - interpolate: function(object, pattern) { - return new Template(this, pattern).evaluate(object); - } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - }, - unescapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -with (String.prototype.escapeHTML) div.appendChild(text); - -var Template = Class.create({ - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr); - if (match == null) return before; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }.bind(this)); - } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = { - each: function(iterator, context) { - var index = 0; - iterator = iterator.bind(context); - try { - this._each(function(value) { - iterator(value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - }, - - eachSlice: function(number, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var index = -number, slices = [], array = this.toArray(); - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - }, - - all: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function(iterator, context) { - iterator = iterator.bind(context); - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(filter, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(filter); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator(value, index)); - }); - return results; - }, - - include: function(object) { - if (Object.isFunction(this.indexOf)) - if (this.indexOf(object) != -1) return true; - - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inGroupsOf: function(number, fillWith) { - fillWith = fillWith === undefined ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - }, - - inject: function(memo, iterator, context) { - iterator = iterator.bind(context); - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator, context) { - iterator = iterator.bind(context); - return this.map(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.map(); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - size: function() { - return this.toArray().length; - }, - - inspect: function() { - return '#<Enumerable:' + this.toArray().inspect() + '>'; - } -}; - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - var length = iterable.length, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; -} - -if (Prototype.Browser.WebKit) { - function $A(iterable) { - if (!iterable) return []; - if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && - iterable.toArray) return iterable.toArray(); - var length = iterable.length, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; - } -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (value !== undefined) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { - if (!Object.isString(string)) return []; - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); - for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); - } else { - array.push(arguments[i]); - } - } - return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; - } -}); - -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); -function $H(object) { - return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { - if (function() { - var i = 0, Test = function(value) { this.key = value }; - Test.prototype.key = 'foo'; - for (var property in new Test('bar')) i++; - return i > 1; - }()) { - function each(iterator) { - var cache = []; - for (var key in this._object) { - var value = this._object[key]; - if (cache.include(key)) continue; - cache.push(key); - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - } - } else { - function each(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - } - } - - function toQueryPair(key, value) { - if (Object.isUndefined(value)) return key; - return key + '=' + encodeURIComponent(String.interpret(value)); - } - - return { - initialize: function(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - }, - - _each: each, - - set: function(key, value) { - return this._object[key] = value; - }, - - get: function(key) { - return this._object[key]; - }, - - unset: function(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - }, - - toObject: function() { - return Object.clone(this._object); - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(object) { - return this.clone().update(object); - }, - - update: function(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return values.map(toQueryPair.curry(key)).join('&'); - } - return toQueryPair(key, values); - }).join('&'); - }, - - inspect: function() { - return '#<Hash:{' + this.map(function(pair) { - return pair.map(Object.inspect).join(': '); - }).join(', ') + '}>'; - }, - - toJSON: function() { - return Object.toJSON(this.toObject()); - }, - - clone: function() { - return new Hash(this); - } - } -})()); - -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; -Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { Ajax.activeRequestCount++ }, - onComplete: function() { Ajax.activeRequestCount-- } -}); - -Ajax.Base = Class.create({ - initialize: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - } -}); - -Ajax.Request = Class.create(Ajax.Base, { - _complete: false, - - initialize: function($super, url, options) { - $super(options); - this.transport = Ajax.getTransport(); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Object.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - // user-defined headers - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - // avoid memory leak in MSIE: clean up - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) { return null } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Response = Class.create({ - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this._getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = xml === undefined ? null : xml; - this.responseJSON = this._getResponseJSON(); - } - }, - - status: 0, - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - _getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - if (!json) return null; - json = decodeURIComponent(escape(json)); - try { - return json.evalJSON(this.request.options.sanitizeJSON); - } catch (e) { - this.request.dispatchException(e); - } - }, - - _getResponseJSON: function() { - var options = this.request.options; - if (!options.evalJSON || (options.evalJSON != 'force' && - !(this.getHeader('Content-type') || '').include('application/json'))) - return null; - try { - return this.transport.responseText.evalJSON(options.sanitizeJSON); - } catch (e) { - this.request.dispatchException(e); - } - } -}); - -Ajax.Updater = Class.create(Ajax.Request, { - initialize: function($super, container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - options = options || { }; - var onComplete = options.onComplete; - options.onComplete = (function(response, param) { - this.updateContent(response.responseText); - if (Object.isFunction(onComplete)) onComplete(response, param); - }).bind(this); - - $super(url, options); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - - if (this.success()) { - if (this.onComplete) this.onComplete.bind(this).defer(); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { - initialize: function($super, container, url, options) { - $super(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(response) { - if (this.options.decay) { - this.decay = (response.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = response.responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(Element.extend(query.snapshotItem(i))); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding - Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }); -} - -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); -}).call(window); - -Element.cache = { }; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - hide: function(element) { - $(element).style.display = 'none'; - return element; - }, - - show: function(element) { - $(element).style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, t, range; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - t = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - t.insert(element, content); - continue; - } - - content = Object.toHTML(content); - - range = element.ownerDocument.createRange(); - t.initializeRange(element, range); - t.insert(element, range.createContextualFragment(content.stripScripts())); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return wrapper; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); - }, - - descendants: function(element) { - return $A($(element).getElementsByTagName('*')).each(Element.extend); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); - }, - - nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); - return expression ? Selector.findElement(ancestors, expression, index) : - ancestors[index || 0]; - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - var descendants = element.descendants(); - return expression ? Selector.findElement(descendants, expression, index) : - descendants[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return expression ? Selector.findElement(previousSiblings, expression, index) : - previousSiblings[index || 0]; - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return expression ? Selector.findElement(nextSiblings, expression, index) : - nextSiblings[index || 0]; - }, - - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); - }, - - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; - if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = value === undefined ? true : value; - - for (var attr in attributes) { - var name = t.names[attr] || attr, value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return $(element).getDimensions().height; - }, - - getWidth: function(element) { - return $(element).getDimensions().width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!element.hasClassName(className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - - if (element.compareDocumentPosition) - return (element.compareDocumentPosition(ancestor) & 8) === 8; - - if (element.sourceIndex && !Prototype.Browser.Opera) { - var e = element.sourceIndex, a = ancestor.sourceIndex, - nextAncestor = ancestor.nextSibling; - if (!nextAncestor) { - do { ancestor = ancestor.parentNode; } - while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); - } - if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex); - } - - while (element = element.parentNode) - if (element == ancestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = element.cumulativeOffset(); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = $(element).getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = Element.getStyle(element, 'overflow') || 'auto'; - if (element._overflow !== 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || element.tagName == 'BODY') { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - // find page position of source - source = $(source); - var p = source.viewportOffset(); - - // find coordinate system to use - element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Element.Methods.identify.counter = 1; - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - - -if (!document.createRange || Prototype.Browser.Opera) { - Element.Methods.insert = function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = { bottom: insertions }; - - var t = Element._insertionTranslations, content, position, pos, tagName; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - pos = t[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - pos.insert(element, content); - continue; - } - - content = Object.toHTML(content); - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - if (t.tags[tagName]) { - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - if (position == 'top' || position == 'after') fragments.reverse(); - fragments.each(pos.insert.curry(element)); - } - else element.insertAdjacentHTML(pos.adjacency, content.stripScripts()); - - content.evalScripts.bind(content).defer(); - } - - return element; - }; -} - -if (Prototype.Browser.Opera) { - Element.Methods._getStyle = Element.Methods.getStyle; - Element.Methods.getStyle = function(element, style) { - switch(style) { - case 'left': - case 'top': - case 'right': - case 'bottom': - if (Element._getStyle(element, 'position') == 'static') return null; - default: return Element._getStyle(element, style); - } - }; - Element.Methods._readAttribute = Element.Methods.readAttribute; - Element.Methods.readAttribute = function(element, attribute) { - if (attribute == 'title') return element.title; - return Element._readAttribute(element, attribute); - }; -} - -else if (Prototype.Browser.IE) { - $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position != 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - var currentStyle = element.currentStyle; - if ((currentStyle && !currentStyle.hasLayout) || - (!currentStyle && element.style.zoom == 'normal')) - element.style.zoom = 1; - - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - var attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - }; - - Element._attributeTranslations.write = { - names: Object.clone(Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr, - src: v._getAttr, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Position.cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if (document.createElement('div').outerHTML) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: { - adjacency: 'beforeBegin', - insert: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - initializeRange: function(element, range) { - range.setStartBefore(element); - } - }, - top: { - adjacency: 'afterBegin', - insert: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - initializeRange: function(element, range) { - range.selectNodeContents(element); - range.collapse(true); - } - }, - bottom: { - adjacency: 'beforeEnd', - insert: function(element, node) { - element.appendChild(node); - } - }, - after: { - adjacency: 'afterEnd', - insert: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - initializeRange: function(element, range) { - range.setStartAfter(element); - } - }, - tags: { - TABLE: ['<table>', '</table>', 1], - TBODY: ['<table><tbody>', '</tbody></table>', 2], - TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3], - TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4], - SELECT: ['<select>', '</select>', 1] - } -}; - -(function() { - this.bottom.initializeRange = this.top.initializeRange; - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD - }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return node && node.specified; - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div').__proto__) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div').__proto__; - Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) - return Prototype.K; - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName, property, value; - - // extend methods for specific tags - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - // extend methods for all tags (Safari doesn't need this) - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - window[klass] = { }; - window[klass].prototype = document.createElement(tagName).__proto__; - return window[klass]; - } - - if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - -document.viewport = { - getDimensions: function() { - var dimensions = { }; - $w('width height').each(function(d) { - var D = d.capitalize(); - dimensions[d] = self['inner' + D] || - (document.documentElement['client' + D] || document.body['client' + D]); - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; -/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); - this.compileMatcher(); - }, - - compileMatcher: function() { - // Selectors with namespaced attributes can't use the XPath version - if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression)) - return this.compileXPathMatcher(); - - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; - }, - - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; - - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } - - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - if (this.xpath) return document._getElementsByXPath(this.xpath, root); - return this.matcher(root); - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#<Selector:" + this.expression.inspect() + ">"; - } -}); - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: "[@#{1}]", - attr: function(m) { - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", - 'checked': "[@checked]", - 'disabled': "[@disabled]", - 'enabled': "[not(@disabled)]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, m, v; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/, - attrPresence: /^\[([\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return Selector.operators[matches[2]](nodeValue, matches[3]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._counted = true; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._counted) { - n._counted = true; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, children = [], child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - tagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() == tagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._counted) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._counted) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled) results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv.startsWith(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } - }, - - matchElements: function(elements, expression) { - var matches = new Selector(expression).findElements(), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._counted) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - var exprs = expressions.join(','), expressions = []; - exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} -var Form = { - reset: function(form) { - $(form).reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (options.hash === undefined) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Object.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Object.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.blur(); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (value === undefined) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (value === undefined) return element.value; - else element.value = value; - }, - - select: function(element, index) { - if (index === undefined) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, value, single = !Object.isArray(index); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - value = this.optionValue(opt); - if (single) { - if (value == index) { - opt.selected = true; - return; - } - } - else opt.selected = index.include(value); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { - initialize: function($super, element, frequency, callback) { - $super(callback, frequency); - this.element = $(element); - this.lastValue = this.getValue(); - }, - - execute: function() { - var value = this.getValue(); - if (Object.isString(this.lastValue) && Object.isString(value) ? - this.lastValue != value : String(this.lastValue) != String(value)) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback, this); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = (function() { - var isButton; - - if (Prototype.Browser.IE) { - var buttonMap = { 0: 1, 1: 4, 2: 2 }; - isButton = function(event, code) { - return event.button == buttonMap[code]; - }; - - } else if (Prototype.Browser.WebKit) { - isButton = function(event, code) { - switch (code) { - case 0: return event.which == 1 && !event.metaKey; - case 1: return event.which == 1 && event.metaKey; - default: return false; - } - }; - - } else { - isButton = function(event, code) { - return event.which ? (event.which === code + 1) : (event.button === code); - }; - } - - return { - isLeftClick: function(event) { return isButton(event, 0) }, - isMiddleClick: function(event) { return isButton(event, 1) }, - isRightClick: function(event) { return isButton(event, 2) }, - - element: function(event) { - var node = Event.extend(event).target; - return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - return element.match(expression) ? element : element.up(expression); - }, - - pointer: function(event) { - return { - x: event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)), - y: event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - event.stopped = true; - } - }; -})(); - -Event.extend = (function() { - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); - - return function(event) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - return Object.extend(event, methods); - }; - - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; - Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._eventID) return element._eventID; - arguments.callee.id = arguments.callee.id || 1; - return element._eventID = ++arguments.callee.id; - } - - function getDOMEventName(eventName) { - if (eventName && eventName.include(':')) return "dataavailable"; - return eventName; - } - - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } - - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } - - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; - - var wrapper = function(event) { - if (!Event || !Event.extend || - (event.eventName && event.eventName != eventName)) - return false; - - Event.extend(event); - handler.call(element, event) - }; - - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } - - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } - - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } - - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); - } else { - element.attachEvent("on" + name, wrapper); - } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - if (document.createEvent) { - var event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - var event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return event; - } - }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); - -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize() -}); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ - - var timer, fired = false; - - function fireContentLoadedEvent() { - if (fired) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); - fired = true; - } - - if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - - } else { - document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>"); - $("__onDOMContentLoaded").onreadystatechange = function() { - if (this.readyState == "complete") { - this.onreadystatechange = null; - fireContentLoadedEvent(); - } - }; - } -})(); -/*------------------------------- DEPRECATED -------------------------------*/ - -Hash.toQueryString = Object.toQueryString; - -var Toggle = { display: Element.toggle }; - -Element.Methods.childOf = Element.Methods.descendantOf; - -var Insertion = { - Before: function(element, content) { - return Element.insert(element, {before:content}); - }, - - Top: function(element, content) { - return Element.insert(element, {top:content}); - }, - - Bottom: function(element, content) { - return Element.insert(element, {bottom:content}); - }, - - After: function(element, content) { - return Element.insert(element, {after:content}); - } -}; - -var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); - -// This should be moved to script.aculo.us; notice the deprecated methods -// further below, that map to the newer Element methods. -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = Element.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = Element.cumulativeScrollOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = Element.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - // Deprecation layer -- use newer Element methods now (1.5.2). - - cumulativeOffset: Element.Methods.cumulativeOffset, - - positionedOffset: Element.Methods.positionedOffset, - - absolutize: function(element) { - Position.prepare(); - return Element.absolutize(element); - }, - - relativize: function(element) { - Position.prepare(); - return Element.relativize(element); - }, - - realOffset: Element.Methods.cumulativeScrollOffset, - - offsetParent: Element.Methods.getOffsetParent, - - page: Element.Methods.viewportOffset, - - clone: function(source, target, options) { - options = options || { }; - return Element.clonePosition(target, source, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ - function iter(name) { - return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; - } - - instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? - function(element, className) { - className = className.toString().strip(); - var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); - return cond ? document._getElementsByXPath('.//*' + cond, element) : []; - } : function(element, className) { - className = className.toString().strip(); - var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); - if (!classNames && !className) return elements; - - var nodes = $(element).getElementsByTagName('*'); - className = ' ' + className + ' '; - - for (var i = 0, child, cn; child = nodes[i]; i++) { - if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || - (classNames && classNames.all(function(name) { - return !name.toString().blank() && cn.include(' ' + name + ' '); - })))) - elements.push(Element.extend(child)); - } - return elements; - }; - - return function(className, parentElement) { - return $(parentElement || document.body).getElementsByClassName(className); - }; -}(Element.Methods); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set($A(this).concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set($A(this).without(classNameToRemove).join(' ')); - }, - - toString: function() { - return $A(this).join(' '); - } -}; - -Object.extend(Element.ClassNames.prototype, Enumerable); - -/*--------------------------------------------------------------------------*/ - -Element.addMethods(); \ No newline at end of file diff --git a/bigbluebutton-web/web-app/js/prototype/rico.js b/bigbluebutton-web/web-app/js/prototype/rico.js deleted file mode 100644 index f0b6fb58469449e34d3952b8daa64c24bbdc35e1..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/rico.js +++ /dev/null @@ -1,2691 +0,0 @@ -/** - * - * Copyright 2005 Sabre Airline Solutions - * - * 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. - **/ - - -//-------------------- rico.js -var Rico = { - Version: '1.1-beta2' -} - -Rico.ArrayExtensions = new Array(); - -if (Object.prototype.extend) { - // in prototype.js... - Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend; -} - -if (Array.prototype.push) { - // in prototype.js... - Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push; -} - -if (!Array.prototype.remove) { - Array.prototype.remove = function(dx) { - if( isNaN(dx) || dx > this.length ) - return false; - for( var i=0,n=0; i<this.length; i++ ) - if( i != dx ) - this[n++]=this[i]; - this.length-=1; - }; - Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.remove; -} - -if (!Array.prototype.removeItem) { - Array.prototype.removeItem = function(item) { - for ( var i = 0 ; i < this.length ; i++ ) - if ( this[i] == item ) { - this.remove(i); - break; - } - }; - Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.removeItem; -} - -if (!Array.prototype.indices) { - Array.prototype.indices = function() { - var indexArray = new Array(); - for ( index in this ) { - var ignoreThis = false; - for ( var i = 0 ; i < Rico.ArrayExtensions.length ; i++ ) { - if ( this[index] == Rico.ArrayExtensions[i] ) { - ignoreThis = true; - break; - } - } - if ( !ignoreThis ) - indexArray[ indexArray.length ] = index; - } - return indexArray; - } - Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.indices; -} - -// Create the loadXML method and xml getter for Mozilla -if ( window.DOMParser && - window.XMLSerializer && - window.Node && Node.prototype && Node.prototype.__defineGetter__ ) { - - if (!Document.prototype.loadXML) { - Document.prototype.loadXML = function (s) { - var doc2 = (new DOMParser()).parseFromString(s, "text/xml"); - while (this.hasChildNodes()) - this.removeChild(this.lastChild); - - for (var i = 0; i < doc2.childNodes.length; i++) { - this.appendChild(this.importNode(doc2.childNodes[i], true)); - } - }; - } - - Document.prototype.__defineGetter__( "xml", - function () { - return (new XMLSerializer()).serializeToString(this); - } - ); -} - -document.getElementsByTagAndClassName = function(tagName, className) { - if ( tagName == null ) - tagName = '*'; - - var children = document.getElementsByTagName(tagName) || document.all; - var elements = new Array(); - - if ( className == null ) - return children; - - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var classNames = child.className.split(' '); - for (var j = 0; j < classNames.length; j++) { - if (classNames[j] == className) { - elements.push(child); - break; - } - } - } - - return elements; -} - - -//-------------------- ricoAccordion.js - -Rico.Accordion = Class.create(); - -Rico.Accordion.prototype = { - - initialize: function(container, options) { - this.container = $(container); - this.lastExpandedTab = null; - this.accordionTabs = new Array(); - this.setOptions(options); - this._attachBehaviors(); - - this.container.style.borderBottom = '1px solid ' + this.options.borderColor; - - // set the initial visual state... - for ( var i=1 ; i < this.accordionTabs.length ; i++ ) - { - this.accordionTabs[i].collapse(); - this.accordionTabs[i].content.style.display = 'none'; - } - this.lastExpandedTab = this.accordionTabs[0]; - this.lastExpandedTab.content.style.height = this.options.panelHeight + "px"; - this.lastExpandedTab.showExpanded(); - this.lastExpandedTab.titleBar.style.fontWeight = this.options.expandedFontWeight; - }, - - setOptions: function(options) { - this.options = { - expandedBg : '#63699c', - hoverBg : '#63699c', - collapsedBg : '#6b79a5', - expandedTextColor : '#ffffff', - expandedFontWeight : 'bold', - hoverTextColor : '#ffffff', - collapsedTextColor : '#ced7ef', - collapsedFontWeight : 'normal', - hoverTextColor : '#ffffff', - borderColor : '#1f669b', - panelHeight : 200, - onHideTab : null, - onShowTab : null - }.extend(options || {}); - }, - - showTabByIndex: function( anIndex, animate ) { - var doAnimate = arguments.length == 1 ? true : animate; - this.showTab( this.accordionTabs[anIndex], doAnimate ); - }, - - showTab: function( accordionTab, animate ) { - - var doAnimate = arguments.length == 1 ? true : animate; - - if ( this.options.onHideTab ) - this.options.onHideTab(this.lastExpandedTab); - - this.lastExpandedTab.showCollapsed(); - var accordion = this; - var lastExpandedTab = this.lastExpandedTab; - - this.lastExpandedTab.content.style.height = (this.options.panelHeight - 1) + 'px'; - accordionTab.content.style.display = ''; - - accordionTab.titleBar.style.fontWeight = this.options.expandedFontWeight; - - if ( doAnimate ) { - new Effect.AccordionSize( this.lastExpandedTab.content, - accordionTab.content, - 1, - this.options.panelHeight, - 100, 10, - { complete: function() {accordion.showTabDone(lastExpandedTab)} } ); - this.lastExpandedTab = accordionTab; - } - else { - this.lastExpandedTab.content.style.height = "1px"; - accordionTab.content.style.height = this.options.panelHeight + "px"; - this.lastExpandedTab = accordionTab; - this.showTabDone(lastExpandedTab); - } - }, - - showTabDone: function(collapsedTab) { - collapsedTab.content.style.display = 'none'; - this.lastExpandedTab.showExpanded(); - if ( this.options.onShowTab ) - this.options.onShowTab(this.lastExpandedTab); - }, - - _attachBehaviors: function() { - var panels = this._getDirectChildrenByTag(this.container, 'DIV'); - for ( var i = 0 ; i < panels.length ; i++ ) { - - var tabChildren = this._getDirectChildrenByTag(panels[i],'DIV'); - if ( tabChildren.length != 2 ) - continue; // unexpected - - var tabTitleBar = tabChildren[0]; - var tabContentBox = tabChildren[1]; - this.accordionTabs.push( new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox) ); - } - }, - - _getDirectChildrenByTag: function(e, tagName) { - var kids = new Array(); - var allKids = e.childNodes; - for( var i = 0 ; i < allKids.length ; i++ ) - if ( allKids[i] && allKids[i].tagName && allKids[i].tagName == tagName ) - kids.push(allKids[i]); - return kids; - } - -}; - -Rico.Accordion.Tab = Class.create(); - -Rico.Accordion.Tab.prototype = { - - initialize: function(accordion, titleBar, content) { - this.accordion = accordion; - this.titleBar = titleBar; - this.content = content; - this._attachBehaviors(); - }, - - collapse: function() { - this.showCollapsed(); - this.content.style.height = "1px"; - }, - - showCollapsed: function() { - this.expanded = false; - this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg; - this.titleBar.style.color = this.accordion.options.collapsedTextColor; - this.titleBar.style.fontWeight = this.accordion.options.collapsedFontWeight; - this.content.style.overflow = "hidden"; - }, - - showExpanded: function() { - this.expanded = true; - this.titleBar.style.backgroundColor = this.accordion.options.expandedBg; - this.titleBar.style.color = this.accordion.options.expandedTextColor; - this.content.style.overflow = "visible"; - }, - - titleBarClicked: function(e) { - if ( this.accordion.lastExpandedTab == this ) - return; - this.accordion.showTab(this); - }, - - hover: function(e) { - this.titleBar.style.backgroundColor = this.accordion.options.hoverBg; - this.titleBar.style.color = this.accordion.options.hoverTextColor; - }, - - unhover: function(e) { - if ( this.expanded ) { - this.titleBar.style.backgroundColor = this.accordion.options.expandedBg; - this.titleBar.style.color = this.accordion.options.expandedTextColor; - } - else { - this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg; - this.titleBar.style.color = this.accordion.options.collapsedTextColor; - } - }, - - _attachBehaviors: function() { - this.content.style.border = "1px solid " + this.accordion.options.borderColor; - this.content.style.borderTopWidth = "0px"; - this.content.style.borderBottomWidth = "0px"; - this.content.style.margin = "0px"; - - this.titleBar.onclick = this.titleBarClicked.bindAsEventListener(this); - this.titleBar.onmouseover = this.hover.bindAsEventListener(this); - this.titleBar.onmouseout = this.unhover.bindAsEventListener(this); - } - -}; - - -//-------------------- ricoAjaxEngine.js - -Rico.AjaxEngine = Class.create(); - -Rico.AjaxEngine.prototype = { - - initialize: function() { - this.ajaxElements = new Array(); - this.ajaxObjects = new Array(); - this.requestURLS = new Array(); - }, - - registerAjaxElement: function( anId, anElement ) { - if ( arguments.length == 1 ) - anElement = $(anId); - this.ajaxElements[anId] = anElement; - }, - - registerAjaxObject: function( anId, anObject ) { - this.ajaxObjects[anId] = anObject; - }, - - registerRequest: function (requestLogicalName, requestURL) { - this.requestURLS[requestLogicalName] = requestURL; - }, - - sendRequest: function(requestName) { - var requestURL = this.requestURLS[requestName]; - if ( requestURL == null ) - return; - - var queryString = ""; - - if ( arguments.length > 1 ) { - if(typeof(arguments[1]) == "object" && arguments[1].length != undefined) { - queryString = this._createQueryString(arguments[1], 0); - } - else { - queryString = this._createQueryString(arguments, 1); - } - } - - new Ajax.Request(requestURL, this._requestOptions(queryString)); - }, - - sendRequestWithData: function(requestName, xmlDocument) { - var requestURL = this.requestURLS[requestName]; - if ( requestURL == null ) - return; - - var queryString = ""; - if ( arguments.length > 2 ) { - if(typeof(arguments[2]) == "object" && arguments[2].length != undefined) { - queryString = this._createQueryString(arguments[2], 0); - } - else { - queryString = this._createQueryString(arguments, 2); - } - } - - new Ajax.Request(requestURL + "?" + queryString, this._requestOptions(null,xmlDocument)); - }, - - sendRequestAndUpdate: function(requestName,container,options) { - var requestURL = this.requestURLS[requestName]; - if ( requestURL == null ) - return; - - var queryString = ""; - if ( arguments.length > 3 ) { - if(typeof(arguments[3]) == "object" && arguments[3].length != undefined) { - queryString = this._createQueryString(arguments[3], 0); - } - else { - queryString = this._createQueryString(arguments, 3); - } - } - - var updaterOptions = this._requestOptions(queryString); - updaterOptions.onComplete = null; - updaterOptions.extend(options); - - new Ajax.Updater(container, requestURL, updaterOptions); - }, - - sendRequestWithDataAndUpdate: function(requestName,xmlDocument,container,options) { - var requestURL = this.requestURLS[requestName]; - if ( requestURL == null ) - return; - - var queryString = ""; - if ( arguments.length > 4 ) { - if(typeof(arguments[4]) == "object" && arguments[4].length != undefined) { - queryString = this._createQueryString(arguments[4], 0); - } - else { - queryString = this._createQueryString(arguments, 4); - } - } - - - var updaterOptions = this._requestOptions(queryString,xmlDocument); - updaterOptions.onComplete = null; - updaterOptions.extend(options); - - new Ajax.Updater(container, requestURL + "?" + queryString, updaterOptions); - }, - - // Private -- not part of intended engine API -------------------------------------------------------------------- - - _requestOptions: function(queryString,xmlDoc) { - var self = this; - - var requestHeaders = ['X-Rico-Version', Rico.Version ]; - var sendMethod = "post" - if ( arguments[1] ) - requestHeaders.push( 'Content-type', 'text/xml' ); - else - sendMethod = "get"; - - return { requestHeaders: requestHeaders, - parameters: queryString, - postBody: arguments[1] ? xmlDoc : null, - method: sendMethod, - onComplete: self._onRequestComplete.bind(self) }; - }, - - _createQueryString: function( theArgs, offset ) { - var self = this; - var queryString = "" - for ( var i = offset ; i < theArgs.length ; i++ ) { - if ( i != offset ) - queryString += "&"; - - var anArg = theArgs[i]; - - if ( anArg.name != undefined && anArg.value != undefined ) { - queryString += anArg.name + "=" + escape(anArg.value); - } - else { - var ePos = anArg.indexOf('='); - var argName = anArg.substring( 0, ePos ); - var argValue = anArg.substring( ePos + 1 ); - queryString += argName + "=" + escape(argValue); - } - } - - return queryString; - }, - _onRequestComplete : function(request) { - - //!!TODO: error handling infrastructure?? - if (request.status != 200) - return; - - var response = request.responseXML.getElementsByTagName("ajax-response"); - if (response == null || response.length != 1) - return; - this._processAjaxResponse( response[0].childNodes ); - }, - - _processAjaxResponse: function( xmlResponseElements ) { - for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) { - var responseElement = xmlResponseElements[i]; - - // only process nodes of type element..... - if ( responseElement.nodeType != 1 ) - continue; - - var responseType = responseElement.getAttribute("type"); - var responseId = responseElement.getAttribute("id"); - - if ( responseType == "object" ) - this._processAjaxObjectUpdate( this.ajaxObjects[ responseId ], responseElement ); - else if ( responseType == "element" ) - this._processAjaxElementUpdate( this.ajaxElements[ responseId ], responseElement ); - else - alert('unrecognized AjaxResponse type : ' + responseType ); - } - }, - - _processAjaxObjectUpdate: function( ajaxObject, responseElement ) { - ajaxObject.ajaxUpdate( responseElement ); - }, - - _processAjaxElementUpdate: function( ajaxElement, responseElement ) { - ajaxElement.innerHTML = RicoUtil.getContentAsString(responseElement); - } - -} - -var ajaxEngine = new Rico.AjaxEngine(); - - -//-------------------- ricoColor.js -Rico.Color = Class.create(); - -Rico.Color.prototype = { - - initialize: function(red, green, blue) { - this.rgb = { r: red, g : green, b : blue }; - }, - - setRed: function(r) { - this.rgb.r = r; - }, - - setGreen: function(g) { - this.rgb.g = g; - }, - - setBlue: function(b) { - this.rgb.b = b; - }, - - setHue: function(h) { - - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.h = h; - - // convert back to RGB... - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); - }, - - setSaturation: function(s) { - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.s = s; - - // convert back to RGB and set values... - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); - }, - - setBrightness: function(b) { - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.b = b; - - // convert back to RGB and set values... - this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b ); - }, - - darken: function(percent) { - var hsb = this.asHSB(); - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0)); - }, - - brighten: function(percent) { - var hsb = this.asHSB(); - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1)); - }, - - blend: function(other) { - this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2); - this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2); - this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2); - }, - - isBright: function() { - var hsb = this.asHSB(); - return this.asHSB().b > 0.5; - }, - - isDark: function() { - return ! this.isBright(); - }, - - asRGB: function() { - return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")"; - }, - - asHex: function() { - return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart(); - }, - - asHSB: function() { - return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b); - }, - - toString: function() { - return this.asHex(); - } - -}; - -Rico.Color.createFromHex = function(hexCode) { - - if ( hexCode.indexOf('#') == 0 ) - hexCode = hexCode.substring(1); - var red = hexCode.substring(0,2); - var green = hexCode.substring(2,4); - var blue = hexCode.substring(4,6); - return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) ); -} - -/** - * Factory method for creating a color from the background of - * an HTML element. - */ -Rico.Color.createColorFromBackground = function(elem) { - - var actualColor = RicoUtil.getElementsComputedStyle($(elem), "backgroundColor", "background-color"); - - if ( actualColor == "transparent" && elem.parent ) - return Rico.Color.createColorFromBackground(elem.parent); - - if ( actualColor == null ) - return new Rico.Color(255,255,255); - - if ( actualColor.indexOf("rgb(") == 0 ) { - var colors = actualColor.substring(4, actualColor.length - 1 ); - var colorArray = colors.split(","); - return new Rico.Color( parseInt( colorArray[0] ), - parseInt( colorArray[1] ), - parseInt( colorArray[2] ) ); - - } - else if ( actualColor.indexOf("#") == 0 ) { - var redPart = parseInt(actualColor.substring(1,3), 16); - var greenPart = parseInt(actualColor.substring(3,5), 16); - var bluePart = parseInt(actualColor.substring(5), 16); - return new Rico.Color( redPart, greenPart, bluePart ); - } - else - return new Rico.Color(255,255,255); -} - -Rico.Color.HSBtoRGB = function(hue, saturation, brightness) { - - var red = 0; - var green = 0; - var blue = 0; - - if (saturation == 0) { - red = parseInt(brightness * 255.0 + 0.5); - green = red; - blue = red; - } - else { - var h = (hue - Math.floor(hue)) * 6.0; - var f = h - Math.floor(h); - var p = brightness * (1.0 - saturation); - var q = brightness * (1.0 - saturation * f); - var t = brightness * (1.0 - (saturation * (1.0 - f))); - - switch (parseInt(h)) { - case 0: - red = (brightness * 255.0 + 0.5); - green = (t * 255.0 + 0.5); - blue = (p * 255.0 + 0.5); - break; - case 1: - red = (q * 255.0 + 0.5); - green = (brightness * 255.0 + 0.5); - blue = (p * 255.0 + 0.5); - break; - case 2: - red = (p * 255.0 + 0.5); - green = (brightness * 255.0 + 0.5); - blue = (t * 255.0 + 0.5); - break; - case 3: - red = (p * 255.0 + 0.5); - green = (q * 255.0 + 0.5); - blue = (brightness * 255.0 + 0.5); - break; - case 4: - red = (t * 255.0 + 0.5); - green = (p * 255.0 + 0.5); - blue = (brightness * 255.0 + 0.5); - break; - case 5: - red = (brightness * 255.0 + 0.5); - green = (p * 255.0 + 0.5); - blue = (q * 255.0 + 0.5); - break; - } - } - - return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) }; -} - -Rico.Color.RGBtoHSB = function(r, g, b) { - - var hue; - var saturaton; - var brightness; - - var cmax = (r > g) ? r : g; - if (b > cmax) - cmax = b; - - var cmin = (r < g) ? r : g; - if (b < cmin) - cmin = b; - - brightness = cmax / 255.0; - if (cmax != 0) - saturation = (cmax - cmin)/cmax; - else - saturation = 0; - - if (saturation == 0) - hue = 0; - else { - var redc = (cmax - r)/(cmax - cmin); - var greenc = (cmax - g)/(cmax - cmin); - var bluec = (cmax - b)/(cmax - cmin); - - if (r == cmax) - hue = bluec - greenc; - else if (g == cmax) - hue = 2.0 + redc - bluec; - else - hue = 4.0 + greenc - redc; - - hue = hue / 6.0; - if (hue < 0) - hue = hue + 1.0; - } - - return { h : hue, s : saturation, b : brightness }; -} - - -//-------------------- ricoCorner.js - -Rico.Corner = { - - round: function(e, options) { - var e = $(e); - this._setOptions(options); - - var color = this.options.color; - if ( this.options.color == "fromElement" ) - color = this._background(e); - - var bgColor = this.options.bgColor; - if ( this.options.bgColor == "fromParent" ) - bgColor = this._background(e.offsetParent); - - this._roundCornersImpl(e, color, bgColor); - }, - - _roundCornersImpl: function(e, color, bgColor) { - if(this.options.border) - this._renderBorder(e,bgColor); - if(this._isTopRounded()) - this._roundTopCorners(e,color,bgColor); - if(this._isBottomRounded()) - this._roundBottomCorners(e,color,bgColor); - }, - - _renderBorder: function(el,bgColor) { - var borderValue = "1px solid " + this._borderColor(bgColor); - var borderL = "border-left: " + borderValue; - var borderR = "border-right: " + borderValue; - var style = "style='" + borderL + ";" + borderR + "'"; - el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>" - }, - - _roundTopCorners: function(el, color, bgColor) { - var corner = this._createCorner(bgColor); - for(var i=0 ; i < this.options.numSlices ; i++ ) - corner.appendChild(this._createCornerSlice(color,bgColor,i,"top")); - el.style.paddingTop = 0; - el.insertBefore(corner,el.firstChild); - }, - - _roundBottomCorners: function(el, color, bgColor) { - var corner = this._createCorner(bgColor); - for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- ) - corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom")); - el.style.paddingBottom = 0; - el.appendChild(corner); - }, - - _createCorner: function(bgColor) { - var corner = document.createElement("div"); - corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor); - return corner; - }, - - _createCornerSlice: function(color,bgColor, n, position) { - var slice = document.createElement("span"); - - var inStyle = slice.style; - inStyle.backgroundColor = color; - inStyle.display = "block"; - inStyle.height = "1px"; - inStyle.overflow = "hidden"; - inStyle.fontSize = "1px"; - - var borderColor = this._borderColor(color,bgColor); - if ( this.options.border && n == 0 ) { - inStyle.borderTopStyle = "solid"; - inStyle.borderTopWidth = "1px"; - inStyle.borderLeftWidth = "0px"; - inStyle.borderRightWidth = "0px"; - inStyle.borderBottomWidth = "0px"; - inStyle.height = "0px"; // assumes css compliant box model - inStyle.borderColor = borderColor; - } - else if(borderColor) { - inStyle.borderColor = borderColor; - inStyle.borderStyle = "solid"; - inStyle.borderWidth = "0px 1px"; - } - - if ( !this.options.compact && (n == (this.options.numSlices-1)) ) - inStyle.height = "2px"; - - this._setMargin(slice, n, position); - this._setBorder(slice, n, position); - - return slice; - }, - - _setOptions: function(options) { - this.options = { - corners : "all", - color : "fromElement", - bgColor : "fromParent", - blend : true, - border : false, - compact : false - }.extend(options || {}); - - this.options.numSlices = this.options.compact ? 2 : 4; - if ( this._isTransparent() ) - this.options.blend = false; - }, - - _whichSideTop: function() { - if ( this._hasString(this.options.corners, "all", "top") ) - return ""; - - if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 ) - return ""; - - if (this.options.corners.indexOf("tl") >= 0) - return "left"; - else if (this.options.corners.indexOf("tr") >= 0) - return "right"; - return ""; - }, - - _whichSideBottom: function() { - if ( this._hasString(this.options.corners, "all", "bottom") ) - return ""; - - if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 ) - return ""; - - if(this.options.corners.indexOf("bl") >=0) - return "left"; - else if(this.options.corners.indexOf("br")>=0) - return "right"; - return ""; - }, - - _borderColor : function(color,bgColor) { - if ( color == "transparent" ) - return bgColor; - else if ( this.options.border ) - return this.options.border; - else if ( this.options.blend ) - return this._blend( bgColor, color ); - else - return ""; - }, - - - _setMargin: function(el, n, corners) { - var marginSize = this._marginSize(n); - var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); - - if ( whichSide == "left" ) { - el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px"; - } - else if ( whichSide == "right" ) { - el.style.marginRight = marginSize + "px"; el.style.marginLeft = "0px"; - } - else { - el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px"; - } - }, - - _setBorder: function(el,n,corners) { - var borderSize = this._borderSize(n); - var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); - - if ( whichSide == "left" ) { - el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px"; - } - else if ( whichSide == "right" ) { - el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth = "0px"; - } - else { - el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px"; - } - }, - - _marginSize: function(n) { - if ( this._isTransparent() ) - return 0; - - var marginSizes = [ 5, 3, 2, 1 ]; - var blendedMarginSizes = [ 3, 2, 1, 0 ]; - var compactMarginSizes = [ 2, 1 ]; - var smBlendedMarginSizes = [ 1, 0 ]; - - if ( this.options.compact && this.options.blend ) - return smBlendedMarginSizes[n]; - else if ( this.options.compact ) - return compactMarginSizes[n]; - else if ( this.options.blend ) - return blendedMarginSizes[n]; - else - return marginSizes[n]; - }, - - _borderSize: function(n) { - var transparentBorderSizes = [ 5, 3, 2, 1 ]; - var blendedBorderSizes = [ 2, 1, 1, 1 ]; - var compactBorderSizes = [ 1, 0 ]; - var actualBorderSizes = [ 0, 2, 0, 0 ]; - - if ( this.options.compact && (this.options.blend || this._isTransparent()) ) - return 1; - else if ( this.options.compact ) - return compactBorderSizes[n]; - else if ( this.options.blend ) - return blendedBorderSizes[n]; - else if ( this.options.border ) - return actualBorderSizes[n]; - else if ( this._isTransparent() ) - return transparentBorderSizes[n]; - return 0; - }, - - _hasString: function(str) { for(var i=1 ; i<arguments.length ; i++) if (str.indexOf(arguments[i]) >= 0) return true; return false; }, - _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; }, - _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } }, - _isTransparent: function() { return this.options.color == "transparent"; }, - _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); }, - _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); }, - _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; } -} - - -//-------------------- ricoDragAndDrop.js -Rico.DragAndDrop = Class.create(); - -Rico.DragAndDrop.prototype = { - - initialize: function() { - this.dropZones = new Array(); - this.draggables = new Array(); - this.currentDragObjects = new Array(); - this.dragElement = null; - this.lastSelectedDraggable = null; - this.currentDragObjectVisible = false; - this.interestedInMotionEvents = false; - }, - - registerDropZone: function(aDropZone) { - this.dropZones[ this.dropZones.length ] = aDropZone; - }, - - deregisterDropZone: function(aDropZone) { - var newDropZones = new Array(); - var j = 0; - for ( var i = 0 ; i < this.dropZones.length ; i++ ) { - if ( this.dropZones[i] != aDropZone ) - newDropZones[j++] = this.dropZones[i]; - } - - this.dropZones = newDropZones; - }, - - clearDropZones: function() { - this.dropZones = new Array(); - }, - - registerDraggable: function( aDraggable ) { - this.draggables[ this.draggables.length ] = aDraggable; - this._addMouseDownHandler( aDraggable ); - }, - - clearSelection: function() { - for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) - this.currentDragObjects[i].deselect(); - this.currentDragObjects = new Array(); - this.lastSelectedDraggable = null; - }, - - hasSelection: function() { - return this.currentDragObjects.length > 0; - }, - - setStartDragFromElement: function( e, mouseDownElement ) { - this.origPos = RicoUtil.toDocumentPosition(mouseDownElement); - this.startx = e.screenX - this.origPos.x - this.starty = e.screenY - this.origPos.y - //this.startComponentX = e.layerX ? e.layerX : e.offsetX; - //this.startComponentY = e.layerY ? e.layerY : e.offsetY; - //this.adjustedForDraggableSize = false; - - this.interestedInMotionEvents = this.hasSelection(); - this._terminateEvent(e); - }, - - updateSelection: function( draggable, extendSelection ) { - if ( ! extendSelection ) - this.clearSelection(); - - if ( draggable.isSelected() ) { - this.currentDragObjects.removeItem(draggable); - draggable.deselect(); - if ( draggable == this.lastSelectedDraggable ) - this.lastSelectedDraggable = null; - } - else { - this.currentDragObjects[ this.currentDragObjects.length ] = draggable; - draggable.select(); - this.lastSelectedDraggable = draggable; - } - }, - - _mouseDownHandler: function(e) { - if ( arguments.length == 0 ) - e = event; - - // if not button 1 ignore it... - var nsEvent = e.which != undefined; - if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1)) - return; - - var eventTarget = e.target ? e.target : e.srcElement; - var draggableObject = eventTarget.draggable; - - var candidate = eventTarget; - while (draggableObject == null && candidate.parentNode) { - candidate = candidate.parentNode; - draggableObject = candidate.draggable; - } - - if ( draggableObject == null ) - return; - - this.updateSelection( draggableObject, e.ctrlKey ); - - // clear the drop zones postion cache... - if ( this.hasSelection() ) - for ( var i = 0 ; i < this.dropZones.length ; i++ ) - this.dropZones[i].clearPositionCache(); - - this.setStartDragFromElement( e, draggableObject.getMouseDownHTMLElement() ); - }, - - - _mouseMoveHandler: function(e) { - var nsEvent = e.which != undefined; - if ( !this.interestedInMotionEvents ) { - this._terminateEvent(e); - return; - } - - if ( ! this.hasSelection() ) - return; - - if ( ! this.currentDragObjectVisible ) - this._startDrag(e); - - if ( !this.activatedDropZones ) - this._activateRegisteredDropZones(); - - //if ( !this.adjustedForDraggableSize ) - // this._adjustForDraggableSize(e); - - this._updateDraggableLocation(e); - this._updateDropZonesHover(e); - - this._terminateEvent(e); - }, - - _makeDraggableObjectVisible: function(e) - { - if ( !this.hasSelection() ) - return; - - var dragElement; - if ( this.currentDragObjects.length > 1 ) - dragElement = this.currentDragObjects[0].getMultiObjectDragGUI(this.currentDragObjects); - else - dragElement = this.currentDragObjects[0].getSingleObjectDragGUI(); - - // go ahead and absolute position it... - if ( RicoUtil.getElementsComputedStyle(dragElement, "position") != "absolute" ) - dragElement.style.position = "absolute"; - - // need to parent him into the document... - if ( dragElement.parentNode == null || dragElement.parentNode.nodeType == 11 ) - document.body.appendChild(dragElement); - - this.dragElement = dragElement; - this._updateDraggableLocation(e); - - this.currentDragObjectVisible = true; - }, - - /** - _adjustForDraggableSize: function(e) { - var dragElementWidth = this.dragElement.offsetWidth; - var dragElementHeight = this.dragElement.offsetHeight; - if ( this.startComponentX > dragElementWidth ) - this.startx -= this.startComponentX - dragElementWidth + 2; - if ( e.offsetY ) { - if ( this.startComponentY > dragElementHeight ) - this.starty -= this.startComponentY - dragElementHeight + 2; - } - this.adjustedForDraggableSize = true; - }, - **/ - - _updateDraggableLocation: function(e) { - var dragObjectStyle = this.dragElement.style; - dragObjectStyle.left = (e.screenX - this.startx) + "px" - dragObjectStyle.top = (e.screenY - this.starty) + "px"; - }, - - _updateDropZonesHover: function(e) { - var n = this.dropZones.length; - for ( var i = 0 ; i < n ; i++ ) { - if ( ! this._mousePointInDropZone( e, this.dropZones[i] ) ) - this.dropZones[i].hideHover(); - } - - for ( var i = 0 ; i < n ; i++ ) { - if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) { - if ( this.dropZones[i].canAccept(this.currentDragObjects) ) - this.dropZones[i].showHover(); - } - } - }, - - _startDrag: function(e) { - for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) - this.currentDragObjects[i].startDrag(); - - this._makeDraggableObjectVisible(e); - }, - - _mouseUpHandler: function(e) { - if ( ! this.hasSelection() ) - return; - - var nsEvent = e.which != undefined; - if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1)) - return; - - this.interestedInMotionEvents = false; - - if ( this.dragElement == null ) { - this._terminateEvent(e); - return; - } - - if ( this._placeDraggableInDropZone(e) ) - this._completeDropOperation(e); - else { - this._terminateEvent(e); - new Effect.Position( this.dragElement, - this.origPos.x, - this.origPos.y, - 200, - 20, - { complete : this._doCancelDragProcessing.bind(this) } ); - } - }, - - _completeDropOperation: function(e) { - if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() ) { - if ( this.dragElement.parentNode != null ) - this.dragElement.parentNode.removeChild(this.dragElement); - } - - this._deactivateRegisteredDropZones(); - this._endDrag(); - this.clearSelection(); - this.dragElement = null; - this.currentDragObjectVisible = false; - this._terminateEvent(e); - }, - - _doCancelDragProcessing: function() { - this._cancelDrag(); - - if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() ) { - if ( this.dragElement.parentNode != null ) { - this.dragElement.parentNode.removeChild(this.dragElement); - } - } - - this._deactivateRegisteredDropZones(); - this.dragElement = null; - this.currentDragObjectVisible = false; - }, - - _placeDraggableInDropZone: function(e) { - var foundDropZone = false; - var n = this.dropZones.length; - for ( var i = 0 ; i < n ; i++ ) { - if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) { - if ( this.dropZones[i].canAccept(this.currentDragObjects) ) { - this.dropZones[i].hideHover(); - this.dropZones[i].accept(this.currentDragObjects); - foundDropZone = true; - break; - } - } - } - - return foundDropZone; - }, - - _cancelDrag: function() { - for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) - this.currentDragObjects[i].cancelDrag(); - }, - - _endDrag: function() { - for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) - this.currentDragObjects[i].endDrag(); - }, - - _mousePointInDropZone: function( e, dropZone ) { - - var absoluteRect = dropZone.getAbsoluteRect(); - - return e.clientX > absoluteRect.left && - e.clientX < absoluteRect.right && - e.clientY > absoluteRect.top && - e.clientY < absoluteRect.bottom; - }, - - _addMouseDownHandler: function( aDraggable ) - { - var htmlElement = aDraggable.getMouseDownHTMLElement(); - if ( htmlElement != null ) { - htmlElement.draggable = aDraggable; - this._addMouseDownEvent( htmlElement ); - } - }, - - _activateRegisteredDropZones: function() { - var n = this.dropZones.length; - for ( var i = 0 ; i < n ; i++ ) { - var dropZone = this.dropZones[i]; - if ( dropZone.canAccept(this.currentDragObjects) ) - dropZone.activate(); - } - - this.activatedDropZones = true; - }, - - _deactivateRegisteredDropZones: function() { - var n = this.dropZones.length; - for ( var i = 0 ; i < n ; i++ ) - this.dropZones[i].deactivate(); - this.activatedDropZones = false; - }, - - _addMouseDownEvent: function( htmlElement ) { - if ( typeof document.implementation != "undefined" && - document.implementation.hasFeature("HTML", "1.0") && - document.implementation.hasFeature("Events", "2.0") && - document.implementation.hasFeature("CSS", "2.0") ) { - htmlElement.addEventListener("mousedown", this._mouseDownHandler.bindAsEventListener(this), false); - } - else { - htmlElement.attachEvent( "onmousedown", this._mouseDownHandler.bindAsEventListener(this) ); - } - }, - - _terminateEvent: function(e) { - if ( e.stopPropagation != undefined ) - e.stopPropagation(); - else if ( e.cancelBubble != undefined ) - e.cancelBubble = true; - - if ( e.preventDefault != undefined ) - e.preventDefault(); - else - e.returnValue = false; - }, - - initializeEventHandlers: function() { - if ( typeof document.implementation != "undefined" && - document.implementation.hasFeature("HTML", "1.0") && - document.implementation.hasFeature("Events", "2.0") && - document.implementation.hasFeature("CSS", "2.0") ) { - document.addEventListener("mouseup", this._mouseUpHandler.bindAsEventListener(this), false); - document.addEventListener("mousemove", this._mouseMoveHandler.bindAsEventListener(this), false); - } - else { - document.attachEvent( "onmouseup", this._mouseUpHandler.bindAsEventListener(this) ); - document.attachEvent( "onmousemove", this._mouseMoveHandler.bindAsEventListener(this) ); - } - } -} - -//var dndMgr = new Rico.DragAndDrop(); -//dndMgr.initializeEventHandlers(); - - -//-------------------- ricoDraggable.js -Rico.Draggable = Class.create(); - -Rico.Draggable.prototype = { - - initialize: function( type, htmlElement ) { - this.type = type; - this.htmlElement = $(htmlElement); - this.selected = false; - }, - - /** - * Returns the HTML element that should have a mouse down event - * added to it in order to initiate a drag operation - * - **/ - getMouseDownHTMLElement: function() { - return this.htmlElement; - }, - - select: function() { - this.selected = true; - - if ( this.showingSelected ) - return; - - var htmlElement = this.getMouseDownHTMLElement(); - - var color = Rico.Color.createColorFromBackground(htmlElement); - color.isBright() ? color.darken(0.033) : color.brighten(0.033); - - this.saveBackground = RicoUtil.getElementsComputedStyle(htmlElement, "backgroundColor", "background-color"); - htmlElement.style.backgroundColor = color.asHex(); - this.showingSelected = true; - }, - - deselect: function() { - this.selected = false; - if ( !this.showingSelected ) - return; - - var htmlElement = this.getMouseDownHTMLElement(); - - htmlElement.style.backgroundColor = this.saveBackground; - this.showingSelected = false; - }, - - isSelected: function() { - return this.selected; - }, - - startDrag: function() { - }, - - cancelDrag: function() { - }, - - endDrag: function() { - }, - - getSingleObjectDragGUI: function() { - return this.htmlElement; - }, - - getMultiObjectDragGUI: function( draggables ) { - return this.htmlElement; - }, - - getDroppedGUI: function() { - return this.htmlElement; - }, - - toString: function() { - return this.type + ":" + this.htmlElement + ":"; - } - -} - - -//-------------------- ricoDropzone.js -Rico.Dropzone = Class.create(); - -Rico.Dropzone.prototype = { - - initialize: function( htmlElement ) { - this.htmlElement = $(htmlElement); - this.absoluteRect = null; - }, - - getHTMLElement: function() { - return this.htmlElement; - }, - - clearPositionCache: function() { - this.absoluteRect = null; - }, - - getAbsoluteRect: function() { - if ( this.absoluteRect == null ) { - var htmlElement = this.getHTMLElement(); - var pos = RicoUtil.toViewportPosition(htmlElement); - - this.absoluteRect = { - top: pos.y, - left: pos.x, - bottom: pos.y + htmlElement.offsetHeight, - right: pos.x + htmlElement.offsetWidth - }; - } - return this.absoluteRect; - }, - - activate: function() { - var htmlElement = this.getHTMLElement(); - if (htmlElement == null || this.showingActive) - return; - - this.showingActive = true; - this.saveBackgroundColor = htmlElement.style.backgroundColor; - - var fallbackColor = "#ffea84"; - var currentColor = Rico.Color.createColorFromBackground(htmlElement); - if ( currentColor == null ) - htmlElement.style.backgroundColor = fallbackColor; - else { - currentColor.isBright() ? currentColor.darken(0.2) : currentColor.brighten(0.2); - htmlElement.style.backgroundColor = currentColor.asHex(); - } - }, - - deactivate: function() { - var htmlElement = this.getHTMLElement(); - if (htmlElement == null || !this.showingActive) - return; - - htmlElement.style.backgroundColor = this.saveBackgroundColor; - this.showingActive = false; - this.saveBackgroundColor = null; - }, - - showHover: function() { - var htmlElement = this.getHTMLElement(); - if ( htmlElement == null || this.showingHover ) - return; - - this.saveBorderWidth = htmlElement.style.borderWidth; - this.saveBorderStyle = htmlElement.style.borderStyle; - this.saveBorderColor = htmlElement.style.borderColor; - - this.showingHover = true; - htmlElement.style.borderWidth = "1px"; - htmlElement.style.borderStyle = "solid"; - //htmlElement.style.borderColor = "#ff9900"; - htmlElement.style.borderColor = "#ffff00"; - }, - - hideHover: function() { - var htmlElement = this.getHTMLElement(); - if ( htmlElement == null || !this.showingHover ) - return; - - htmlElement.style.borderWidth = this.saveBorderWidth; - htmlElement.style.borderStyle = this.saveBorderStyle; - htmlElement.style.borderColor = this.saveBorderColor; - this.showingHover = false; - }, - - canAccept: function(draggableObjects) { - return true; - }, - - accept: function(draggableObjects) { - var htmlElement = this.getHTMLElement(); - if ( htmlElement == null ) - return; - - n = draggableObjects.length; - for ( var i = 0 ; i < n ; i++ ) - { - var theGUI = draggableObjects[i].getDroppedGUI(); - if ( RicoUtil.getElementsComputedStyle( theGUI, "position" ) == "absolute" ) - { - theGUI.style.position = "static"; - theGUI.style.top = ""; - theGUI.style.top = ""; - } - htmlElement.appendChild(theGUI); - } - } -} - - -//-------------------- ricoEffects.js - -/** - * Use the Effect namespace for effects. If using scriptaculous effects - * this will already be defined, otherwise we'll just create an empty - * object for it... - **/ -if ( window.Effect == undefined ) - Effect = {}; - -Effect.SizeAndPosition = Class.create(); -Effect.SizeAndPosition.prototype = { - - initialize: function(element, x, y, w, h, duration, steps, options) { - this.element = $(element); - this.x = x; - this.y = y; - this.w = w; - this.h = h; - this.duration = duration; - this.steps = steps; - this.options = arguments[7] || {}; - - this.sizeAndPosition(); - }, - - sizeAndPosition: function() { - if (this.isFinished()) { - if(this.options.complete) this.options.complete(this); - return; - } - - if (this.timer) - clearTimeout(this.timer); - - var stepDuration = Math.round(this.duration/this.steps) ; - - // Get original values: x,y = top left corner; w,h = width height - var currentX = this.element.offsetLeft; - var currentY = this.element.offsetTop; - var currentW = this.element.offsetWidth; - var currentH = this.element.offsetHeight; - - // If values not set, or zero, we do not modify them, and take original as final as well - this.x = (this.x) ? this.x : currentX; - this.y = (this.y) ? this.y : currentY; - this.w = (this.w) ? this.w : currentW; - this.h = (this.h) ? this.h : currentH; - - // how much do we need to modify our values for each step? - var difX = this.steps > 0 ? (this.x - currentX)/this.steps : 0; - var difY = this.steps > 0 ? (this.y - currentY)/this.steps : 0; - var difW = this.steps > 0 ? (this.w - currentW)/this.steps : 0; - var difH = this.steps > 0 ? (this.h - currentH)/this.steps : 0; - - this.moveBy(difX, difY); - this.resizeBy(difW, difH); - - this.duration -= stepDuration; - this.steps--; - - this.timer = setTimeout(this.sizeAndPosition.bind(this), stepDuration); - }, - - isFinished: function() { - return this.steps <= 0; - }, - - moveBy: function( difX, difY ) { - var currentLeft = this.element.offsetLeft; - var currentTop = this.element.offsetTop; - var intDifX = parseInt(difX); - var intDifY = parseInt(difY); - - var style = this.element.style; - if ( intDifX != 0 ) - style.left = (currentLeft + intDifX) + "px"; - if ( intDifY != 0 ) - style.top = (currentTop + intDifY) + "px"; - }, - - resizeBy: function( difW, difH ) { - var currentWidth = this.element.offsetWidth; - var currentHeight = this.element.offsetHeight; - var intDifW = parseInt(difW); - var intDifH = parseInt(difH); - - var style = this.element.style; - if ( intDifW != 0 ) - style.width = (currentWidth + intDifW) + "px"; - if ( intDifH != 0 ) - style.height = (currentHeight + intDifH) + "px"; - } -} - -Effect.Size = Class.create(); -Effect.Size.prototype = { - - initialize: function(element, w, h, duration, steps, options) { - new Effect.SizeAndPosition(element, null, null, w, h, duration, steps, options); - } -} - -Effect.Position = Class.create(); -Effect.Position.prototype = { - - initialize: function(element, x, y, duration, steps, options) { - new Effect.SizeAndPosition(element, x, y, null, null, duration, steps, options); - } -} - -Effect.Round = Class.create(); -Effect.Round.prototype = { - - initialize: function(tagName, className, options) { - var elements = document.getElementsByTagAndClassName(tagName,className); - for ( var i = 0 ; i < elements.length ; i++ ) - Rico.Corner.round( elements[i], options ); - } -}; - -Effect.FadeTo = Class.create(); -Effect.FadeTo.prototype = { - - initialize: function( element, opacity, duration, steps, options) { - this.element = $(element); - this.opacity = opacity; - this.duration = duration; - this.steps = steps; - this.options = arguments[4] || {}; - this.fadeTo(); - }, - - fadeTo: function() { - if (this.isFinished()) { - if(this.options.complete) this.options.complete(this); - return; - } - - if (this.timer) - clearTimeout(this.timer); - - var stepDuration = Math.round(this.duration/this.steps) ; - var currentOpacity = this.getElementOpacity(); - var delta = this.steps > 0 ? (this.opacity - currentOpacity)/this.steps : 0; - - this.changeOpacityBy(delta); - this.duration -= stepDuration; - this.steps--; - - this.timer = setTimeout(this.fadeTo.bind(this), stepDuration); - }, - - changeOpacityBy: function(v) { - var currentOpacity = this.getElementOpacity(); - var newOpacity = Math.max(0, Math.min(currentOpacity+v, 1)); - this.element.ricoOpacity = newOpacity; - - this.element.style.filter = "alpha(opacity:"+Math.round(newOpacity*100)+")"; - this.element.style.opacity = newOpacity; /*//*/; - }, - - isFinished: function() { - return this.steps <= 0; - }, - - getElementOpacity: function() { - if ( this.element.ricoOpacity == undefined ) { - var opacity; - if ( this.element.currentStyle ) { - opacity = this.element.currentStyle.opacity; - } - else if ( document.defaultView.getComputedStyle != undefined ) { - var computedStyle = document.defaultView.getComputedStyle; - opacity = computedStyle(this.element, null).getPropertyValue('opacity'); - } - - this.element.ricoOpacity = opacity != undefined ? opacity : 1.0; - } - - return parseFloat(this.element.ricoOpacity); - } -} - -Effect.AccordionSize = Class.create(); - -Effect.AccordionSize.prototype = { - - initialize: function(e1, e2, start, end, duration, steps, options) { - this.e1 = $(e1); - this.e2 = $(e2); - this.start = start; - this.end = end; - this.duration = duration; - this.steps = steps; - this.options = arguments[6] || {}; - - this.accordionSize(); - }, - - accordionSize: function() { - - if (this.isFinished()) { - // just in case there are round errors or such... - this.e1.style.height = this.start + "px"; - this.e2.style.height = this.end + "px"; - - if(this.options.complete) - this.options.complete(this); - return; - } - - if (this.timer) - clearTimeout(this.timer); - - var stepDuration = Math.round(this.duration/this.steps) ; - - var diff = this.steps > 0 ? (parseInt(this.e1.offsetHeight) - this.start)/this.steps : 0; - this.resizeBy(diff); - - this.duration -= stepDuration; - this.steps--; - - this.timer = setTimeout(this.accordionSize.bind(this), stepDuration); - }, - - isFinished: function() { - return this.steps <= 0; - }, - - resizeBy: function(diff) { - var h1Height = this.e1.offsetHeight; - var h2Height = this.e2.offsetHeight; - var intDiff = parseInt(diff); - if ( diff != 0 ) { - this.e1.style.height = (h1Height - intDiff) + "px"; - this.e2.style.height = (h2Height + intDiff) + "px"; - } - } - -}; - - -//-------------------- ricoLiveGrid.js - -// Rico.LiveGridMetaData ----------------------------------------------------- - -Rico.LiveGridMetaData = Class.create(); - -Rico.LiveGridMetaData.prototype = { - - initialize: function( pageSize, totalRows, columnCount, options ) { - this.pageSize = pageSize; - this.totalRows = totalRows; - this.setOptions(options); - this.scrollArrowHeight = 16; - this.columnCount = columnCount; - }, - - setOptions: function(options) { - this.options = { - largeBufferSize : 7.0, // 7 pages - nearLimitFactor : 0.2 // 20% of buffer - }.extend(options || {}); - }, - - getPageSize: function() { - return this.pageSize; - }, - - getTotalRows: function() { - return this.totalRows; - }, - - setTotalRows: function(n) { - this.totalRows = n; - }, - - getLargeBufferSize: function() { - return parseInt(this.options.largeBufferSize * this.pageSize); - }, - - getLimitTolerance: function() { - return parseInt(this.getLargeBufferSize() * this.options.nearLimitFactor); - } -}; - -// Rico.LiveGridScroller ----------------------------------------------------- - -Rico.LiveGridScroller = Class.create(); - -Rico.LiveGridScroller.prototype = { - - initialize: function(liveGrid, viewPort) { - this.isIE = navigator.userAgent.toLowerCase().indexOf("msie") >= 0; - this.liveGrid = liveGrid; - this.metaData = liveGrid.metaData; - this.createScrollBar(); - this.scrollTimeout = null; - this.lastScrollPos = 0; - this.viewPort = viewPort; - this.rows = new Array(); - }, - - isUnPlugged: function() { - return this.scrollerDiv.onscroll == null; - }, - - plugin: function() { - this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this); - }, - - unplug: function() { - this.scrollerDiv.onscroll = null; - }, - - sizeIEHeaderHack: function() { - if ( !this.isIE ) return; - var headerTable = $(this.liveGrid.tableId + "_header"); - if ( headerTable ) - headerTable.rows[0].cells[0].style.width = - (headerTable.rows[0].cells[0].offsetWidth + 1) + "px"; - }, - - createScrollBar: function() { - var visibleHeight = this.liveGrid.viewPort.visibleHeight(); - // create the outer div... - this.scrollerDiv = document.createElement("div"); - var scrollerStyle = this.scrollerDiv.style; - scrollerStyle.borderRight = "1px solid #ababab"; // hard coded color!!! - scrollerStyle.position = "relative"; - scrollerStyle.left = this.isIE ? "-6px" : "-3px"; - scrollerStyle.width = "19px"; - scrollerStyle.height = visibleHeight + "px"; - scrollerStyle.overflow = "auto"; - - // create the inner div... - this.heightDiv = document.createElement("div"); - this.heightDiv.style.width = "1px"; - - this.heightDiv.style.height = parseInt(visibleHeight * - this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px" ; - this.scrollerDiv.appendChild(this.heightDiv); - this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this); - - var table = this.liveGrid.table; - table.parentNode.parentNode.insertBefore( this.scrollerDiv, table.parentNode.nextSibling ); - }, - - updateSize: function() { - var table = this.liveGrid.table; - var visibleHeight = this.viewPort.visibleHeight(); - this.heightDiv.style.height = parseInt(visibleHeight * - this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px"; - }, - - rowToPixel: function(rowOffset) { - return (rowOffset / this.metaData.getTotalRows()) * this.heightDiv.offsetHeight - }, - - moveScroll: function(rowOffset) { - this.scrollerDiv.scrollTop = this.rowToPixel(rowOffset); - if ( this.metaData.options.onscroll ) - this.metaData.options.onscroll( this.liveGrid, rowOffset ); - }, - - handleScroll: function() { - if ( this.scrollTimeout ) - clearTimeout( this.scrollTimeout ); - - var contentOffset = parseInt(this.scrollerDiv.scrollTop / this.viewPort.rowHeight); - this.liveGrid.requestContentRefresh(contentOffset); - this.viewPort.scrollTo(this.scrollerDiv.scrollTop); - - if ( this.metaData.options.onscroll ) - this.metaData.options.onscroll( this.liveGrid, contentOffset ); - - this.scrollTimeout = setTimeout( this.scrollIdle.bind(this), 1200 ); - }, - - scrollIdle: function() { - if ( this.metaData.options.onscrollidle ) - this.metaData.options.onscrollidle(); - } -}; - -// Rico.LiveGridBuffer ----------------------------------------------------- - -Rico.LiveGridBuffer = Class.create(); - -Rico.LiveGridBuffer.prototype = { - - initialize: function(metaData, viewPort) { - this.startPos = 0; - this.size = 0; - this.metaData = metaData; - this.rows = new Array(); - this.updateInProgress = false; - this.viewPort = viewPort; - this.maxBufferSize = metaData.getLargeBufferSize() * 2; - this.maxFetchSize = metaData.getLargeBufferSize(); - this.lastOffset = 0; - }, - - getBlankRow: function() { - if (!this.blankRow ) { - this.blankRow = new Array(); - for ( var i=0; i < this.metaData.columnCount ; i++ ) - this.blankRow[i] = " "; - } - return this.blankRow; - }, - - loadRows: function(ajaxResponse) { - var rowsElement = ajaxResponse.getElementsByTagName('rows')[0]; - this.updateUI = rowsElement.getAttribute("update_ui") == "true" - var newRows = new Array() - var trs = rowsElement.getElementsByTagName("tr"); - for ( var i=0 ; i < trs.length; i++ ) { - var row = newRows[i] = new Array(); - var cells = trs[i].getElementsByTagName("td"); - for ( var j=0; j < cells.length ; j++ ) { - var cell = cells[j]; - var convertSpaces = cell.getAttribute("convert_spaces") == "true"; - var cellContent = RicoUtil.getContentAsString(cell); - row[j] = convertSpaces ? this.convertSpaces(cellContent) : cellContent; - if (!row[j]) - row[j] = ' '; - } - } - return newRows; - }, - - update: function(ajaxResponse, start) { - var newRows = this.loadRows(ajaxResponse); - if (this.rows.length == 0) { // initial load - this.rows = newRows; - this.size = this.rows.length; - this.startPos = start; - return; - } - if (start > this.startPos) { //appending - if (this.startPos + this.rows.length < start) { - this.rows = newRows; - this.startPos = start;// - } else { - this.rows = this.rows.concat( newRows.slice(0, newRows.length)); - if (this.rows.length > this.maxBufferSize) { - var fullSize = this.rows.length; - this.rows = this.rows.slice(this.rows.length - this.maxBufferSize, this.rows.length) - this.startPos = this.startPos + (fullSize - this.rows.length); - } - } - } else { //prepending - if (start + newRows.length < this.startPos) { - this.rows = newRows; - } else { - this.rows = newRows.slice(0, this.startPos).concat(this.rows); - if (this.rows.length > this.maxBufferSize) - this.rows = this.rows.slice(0, this.maxBufferSize) - } - this.startPos = start; - } - this.size = this.rows.length; - }, - - clear: function() { - this.rows = new Array(); - this.startPos = 0; - this.size = 0; - }, - - isOverlapping: function(start, size) { - return ((start < this.endPos()) && (this.startPos < start + size)) || (this.endPos() == 0) - }, - - isInRange: function(position) { - return (position >= this.startPos) && (position + this.metaData.getPageSize() <= this.endPos()); - //&& this.size() != 0; - }, - - isNearingTopLimit: function(position) { - return position - this.startPos < this.metaData.getLimitTolerance(); - }, - - endPos: function() { - return this.startPos + this.rows.length; - }, - - isNearingBottomLimit: function(position) { - return this.endPos() - (position + this.metaData.getPageSize()) < this.metaData.getLimitTolerance(); - }, - - isAtTop: function() { - return this.startPos == 0; - }, - - isAtBottom: function() { - return this.endPos() == this.metaData.getTotalRows(); - }, - - isNearingLimit: function(position) { - return ( !this.isAtTop() && this.isNearingTopLimit(position)) || - ( !this.isAtBottom() && this.isNearingBottomLimit(position) ) - }, - - getFetchSize: function(offset) { - var adjustedOffset = this.getFetchOffset(offset); - var adjustedSize = 0; - if (adjustedOffset >= this.startPos) { //apending - var endFetchOffset = this.maxFetchSize + adjustedOffset; - if (endFetchOffset > this.metaData.totalRows) - endFetchOffset = this.metaData.totalRows; - adjustedSize = endFetchOffset - adjustedOffset; - } else {//prepending - var adjustedSize = this.startPos - adjustedOffset; - if (adjustedSize > this.maxFetchSize) - adjustedSize = this.maxFetchSize; - } - return adjustedSize; - }, - - getFetchOffset: function(offset) { - var adjustedOffset = offset; - if (offset > this.startPos) //apending - adjustedOffset = (offset > this.endPos()) ? offset : this.endPos(); - else { //prepending - if (offset + this.maxFetchSize >= this.startPos) { - var adjustedOffset = this.startPos - this.maxFetchSize; - if (adjustedOffset < 0) - adjustedOffset = 0; - } - } - this.lastOffset = adjustedOffset; - return adjustedOffset; - }, - - getRows: function(start, count) { - var begPos = start - this.startPos - var endPos = begPos + count - - // er? need more data... - if ( endPos > this.size ) - endPos = this.size - - var results = new Array() - var index = 0; - for ( var i=begPos ; i < endPos; i++ ) { - results[index++] = this.rows[i] - } - return results - }, - - convertSpaces: function(s) { - return s.split(" ").join(" "); - } - -}; - - -//Rico.GridViewPort -------------------------------------------------- -Rico.GridViewPort = Class.create(); - -Rico.GridViewPort.prototype = { - - initialize: function(table, rowHeight, visibleRows, buffer, liveGrid) { - this.lastDisplayedStartPos = 0; - this.div = table.parentNode; - this.table = table - this.rowHeight = rowHeight; - this.div.style.height = this.rowHeight * visibleRows; - this.div.style.overflow = "hidden"; - this.buffer = buffer; - this.liveGrid = liveGrid; - this.visibleRows = visibleRows + 1; - this.lastPixelOffset = 0; - this.startPos = 0; - }, - - populateRow: function(htmlRow, row) { - for (var j=0; j < row.length; j++) { - htmlRow.cells[j].innerHTML = row[j] - } - }, - - bufferChanged: function() { - this.refreshContents( parseInt(this.lastPixelOffset / this.rowHeight)); - }, - - clearRows: function() { - if (!this.isBlank) { - for (var i=0; i < this.visibleRows; i++) - this.populateRow(this.table.rows[i], this.buffer.getBlankRow()); - this.isBlank = true; - } - }, - - clearContents: function() { - this.clearRows(); - this.scrollTo(0); - this.startPos = 0; - this.lastStartPos = -1; - }, - - refreshContents: function(startPos) { - if (startPos == this.lastRowPos && !this.isPartialBlank && !this.isBlank) { - return; - } - if ((startPos + this.visibleRows < this.buffer.startPos) - || (this.buffer.startPos + this.buffer.size < startPos) - || (this.buffer.size == 0)) { - this.clearRows(); - return; - } - this.isBlank = false; - var viewPrecedesBuffer = this.buffer.startPos > startPos - var contentStartPos = viewPrecedesBuffer ? this.buffer.startPos: startPos; - - var contentEndPos = (this.buffer.startPos + this.buffer.size < startPos + this.visibleRows) - ? this.buffer.startPos + this.buffer.size - : startPos + this.visibleRows; - var rowSize = contentEndPos - contentStartPos; - var rows = this.buffer.getRows(contentStartPos, rowSize ); - var blankSize = this.visibleRows - rowSize; - var blankOffset = viewPrecedesBuffer ? 0: rowSize; - var contentOffset = viewPrecedesBuffer ? blankSize: 0; - - for (var i=0; i < rows.length; i++) {//initialize what we have - this.populateRow(this.table.rows[i + contentOffset], rows[i]); - } - for (var i=0; i < blankSize; i++) {// blank out the rest - this.populateRow(this.table.rows[i + blankOffset], this.buffer.getBlankRow()); - } - this.isPartialBlank = blankSize > 0; - this.lastRowPos = startPos; - }, - - scrollTo: function(pixelOffset) { - if (this.lastPixelOffset == pixelOffset) - return; - - this.refreshContents(parseInt(pixelOffset / this.rowHeight)) - this.div.scrollTop = pixelOffset % this.rowHeight - - this.lastPixelOffset = pixelOffset; - }, - - visibleHeight: function() { - return parseInt(this.div.style.height); - } - -}; - - -Rico.LiveGridRequest = Class.create(); -Rico.LiveGridRequest.prototype = { - initialize: function( requestOffset, options ) { - this.requestOffset = requestOffset; - } -}; - -// Rico.LiveGrid ----------------------------------------------------- - -Rico.LiveGrid = Class.create(); - -Rico.LiveGrid.prototype = { - - initialize: function( tableId, visibleRows, totalRows, url, options ) { - if ( options == null ) - options = {}; - - this.tableId = tableId; - this.table = $(tableId); - var columnCount = this.table.rows[0].cells.length - this.metaData = new Rico.LiveGridMetaData(visibleRows, totalRows, columnCount, options); - this.buffer = new Rico.LiveGridBuffer(this.metaData); - - var rowCount = this.table.rows.length; - this.viewPort = new Rico.GridViewPort(this.table, - this.table.offsetHeight/rowCount, - visibleRows, - this.buffer, this); - this.scroller = new Rico.LiveGridScroller(this,this.viewPort); - - this.additionalParms = options.requestParameters || []; - - options.sortHandler = this.sortHandler.bind(this); - - if ( $(tableId + '_header') ) - this.sort = new Rico.LiveGridSort(tableId + '_header', options) - - this.processingRequest = null; - this.unprocessedRequest = null; - - this.initAjax(url); - if ( options.prefetchBuffer || options.prefetchOffset > 0) { - var offset = 0; - if (options.offset ) { - offset = options.offset; - this.scroller.moveScroll(offset); - this.viewPort.scrollTo(this.scroller.rowToPixel(offset)); - } - if (options.sortCol) { - this.sortCol = options.sortCol; - this.sortDir = options.sortDir; - } - this.requestContentRefresh(offset); - } - }, - - resetContents: function() { - this.scroller.moveScroll(0); - this.buffer.clear(); - this.viewPort.clearContents(); - }, - - sortHandler: function(column) { - this.sortCol = column.name; - this.sortDir = column.currentSort; - - this.resetContents(); - this.requestContentRefresh(0) - }, - - setRequestParams: function() { - this.additionalParms = []; - for ( var i=0 ; i < arguments.length ; i++ ) - this.additionalParms[i] = arguments[i]; - }, - - setTotalRows: function( newTotalRows ) { - this.resetContents(); - this.metaData.setTotalRows(newTotalRows); - this.scroller.updateSize(); - }, - - initAjax: function(url) { - ajaxEngine.registerRequest( this.tableId + '_request', url ); - ajaxEngine.registerAjaxObject( this.tableId + '_updater', this ); - }, - - invokeAjax: function() { - }, - - handleTimedOut: function() { - //server did not respond in 4 seconds... assume that there could have been - //an error or something, and allow requests to be processed again... - this.processingRequest = null; - this.processQueuedRequest(); - }, - - fetchBuffer: function(offset) { - if ( this.buffer.isInRange(offset) && - !this.buffer.isNearingLimit(offset)) { - return; - } - if (this.processingRequest) { - this.unprocessedRequest = new Rico.LiveGridRequest(offset); - return; - } - var bufferStartPos = this.buffer.getFetchOffset(offset); - this.processingRequest = new Rico.LiveGridRequest(offset); - this.processingRequest.bufferOffset = bufferStartPos; - var fetchSize = this.buffer.getFetchSize(offset); - var partialLoaded = false; - var callParms = []; - callParms.push(this.tableId + '_request'); - callParms.push('id=' + this.tableId); - callParms.push('page_size=' + fetchSize); - callParms.push('offset=' + bufferStartPos); - if ( this.sortCol) { - callParms.push('sort_col=' + this.sortCol); - callParms.push('sort_dir=' + this.sortDir); - } - - for( var i=0 ; i < this.additionalParms.length ; i++ ) - callParms.push(this.additionalParms[i]); - ajaxEngine.sendRequest.apply( ajaxEngine, callParms ); - - this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), 20000 ); //todo: make as option - }, - - requestContentRefresh: function(contentOffset) { - this.fetchBuffer(contentOffset); - }, - - ajaxUpdate: function(ajaxResponse) { - try { - clearTimeout( this.timeoutHandler ); - this.buffer.update(ajaxResponse,this.processingRequest.bufferOffset); - this.viewPort.bufferChanged(); - } - catch(err) {} - finally {this.processingRequest = null; } - this.processQueuedRequest(); - }, - - processQueuedRequest: function() { - if (this.unprocessedRequest != null) { - this.requestContentRefresh(this.unprocessedRequest.requestOffset); - this.unprocessedRequest = null - } - } - -}; - - -//-------------------- ricoLiveGridSort.js -Rico.LiveGridSort = Class.create(); - -Rico.LiveGridSort.prototype = { - - initialize: function(headerTableId, options) { - this.headerTableId = headerTableId; - this.headerTable = $(headerTableId); - this.setOptions(options); - this.applySortBehavior(); - - if ( this.options.sortCol ) { - this.setSortUI( this.options.sortCol, this.options.sortDir ); - } - }, - - setSortUI: function( columnName, sortDirection ) { - var cols = this.options.columns; - for ( var i = 0 ; i < cols.length ; i++ ) { - if ( cols[i].name == columnName ) { - this.setColumnSort(i, sortDirection); - break; - } - } - }, - - setOptions: function(options) { - this.options = { - sortAscendImg: 'images/sort_asc.gif', - sortDescendImg: 'images/sort_desc.gif', - imageWidth: 9, - imageHeight: 5, - ajaxSortURLParms: [] - }.extend(options); - - // preload the images... - new Image().src = this.options.sortAscendImg; - new Image().src = this.options.sortDescendImg; - - this.sort = options.sortHandler; - if ( !this.options.columns ) - this.options.columns = this.introspectForColumnInfo(); - else { - // allow client to pass { columns: [ ["a", true], ["b", false] ] } - // and convert to an array of Rico.TableColumn objs... - this.options.columns = this.convertToTableColumns(this.options.columns); - } - }, - - applySortBehavior: function() { - var headerRow = this.headerTable.rows[0]; - var headerCells = headerRow.cells; - for ( var i = 0 ; i < headerCells.length ; i++ ) { - this.addSortBehaviorToColumn( i, headerCells[i] ); - } - }, - - addSortBehaviorToColumn: function( n, cell ) { - if ( this.options.columns[n].isSortable() ) { - cell.id = this.headerTableId + '_' + n; - cell.style.cursor = 'pointer'; - cell.onclick = this.headerCellClicked.bindAsEventListener(this); - cell.innerHTML = cell.innerHTML + '<span id="' + this.headerTableId + '_img_' + n + '">' - + ' </span>'; - } - }, - - // event handler.... - headerCellClicked: function(evt) { - var eventTarget = evt.target ? evt.target : evt.srcElement; - var cellId = eventTarget.id; - var columnNumber = parseInt(cellId.substring( cellId.lastIndexOf('_') + 1 )); - var sortedColumnIndex = this.getSortedColumnIndex(); - if ( sortedColumnIndex != -1 ) { - if ( sortedColumnIndex != columnNumber ) { - this.removeColumnSort(sortedColumnIndex); - this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC); - } - else - this.toggleColumnSort(sortedColumnIndex); - } - else - this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC); - - if (this.options.sortHandler) { - this.options.sortHandler(this.options.columns[columnNumber]); - } - }, - - removeColumnSort: function(n) { - this.options.columns[n].setUnsorted(); - this.setSortImage(n); - }, - - setColumnSort: function(n, direction) { - this.options.columns[n].setSorted(direction); - this.setSortImage(n); - }, - - toggleColumnSort: function(n) { - this.options.columns[n].toggleSort(); - this.setSortImage(n); - }, - - setSortImage: function(n) { - var sortDirection = this.options.columns[n].getSortDirection(); - - var sortImageSpan = $( this.headerTableId + '_img_' + n ); - if ( sortDirection == Rico.TableColumn.UNSORTED ) - sortImageSpan.innerHTML = ' '; - else if ( sortDirection == Rico.TableColumn.SORT_ASC ) - sortImageSpan.innerHTML = ' <img width="' + this.options.imageWidth + '" ' + - 'height="'+ this.options.imageHeight + '" ' + - 'src="' + this.options.sortAscendImg + '"/>'; - else if ( sortDirection == Rico.TableColumn.SORT_DESC ) - sortImageSpan.innerHTML = ' <img width="' + this.options.imageWidth + '" ' + - 'height="'+ this.options.imageHeight + '" ' + - 'src="' + this.options.sortDescendImg + '"/>'; - }, - - getSortedColumnIndex: function() { - var cols = this.options.columns; - for ( var i = 0 ; i < cols.length ; i++ ) { - if ( cols[i].isSorted() ) - return i; - } - - return -1; - }, - - introspectForColumnInfo: function() { - var columns = new Array(); - var headerRow = this.headerTable.rows[0]; - var headerCells = headerRow.cells; - for ( var i = 0 ; i < headerCells.length ; i++ ) - columns.push( new Rico.TableColumn( this.deriveColumnNameFromCell(headerCells[i],i), true ) ); - return columns; - }, - - convertToTableColumns: function(cols) { - var columns = new Array(); - for ( var i = 0 ; i < cols.length ; i++ ) - columns.push( new Rico.TableColumn( cols[i][0], cols[i][1] ) ); - }, - - deriveColumnNameFromCell: function(cell,columnNumber) { - var cellContent = cell.innerText != undefined ? cell.innerText : cell.textContent; - return cellContent ? cellContent.toLowerCase().split(' ').join('_') : "col_" + columnNumber; - } -}; - -Rico.TableColumn = Class.create(); - -Rico.TableColumn.UNSORTED = 0; -Rico.TableColumn.SORT_ASC = "ASC"; -Rico.TableColumn.SORT_DESC = "DESC"; - -Rico.TableColumn.prototype = { - initialize: function(name, sortable) { - this.name = name; - this.sortable = sortable; - this.currentSort = Rico.TableColumn.UNSORTED; - }, - - isSortable: function() { - return this.sortable; - }, - - isSorted: function() { - return this.currentSort != Rico.TableColumn.UNSORTED; - }, - - getSortDirection: function() { - return this.currentSort; - }, - - toggleSort: function() { - if ( this.currentSort == Rico.TableColumn.UNSORTED || this.currentSort == Rico.TableColumn.SORT_DESC ) - this.currentSort = Rico.TableColumn.SORT_ASC; - else if ( this.currentSort == Rico.TableColumn.SORT_ASC ) - this.currentSort = Rico.TableColumn.SORT_DESC; - }, - - setUnsorted: function(direction) { - this.setSorted(Rico.TableColumn.UNSORTED); - }, - - setSorted: function(direction) { - // direction must by one of Rico.TableColumn.UNSORTED, .SORT_ASC, or .SET_DESC... - this.currentSort = direction; - } - -}; - - -//-------------------- ricoUtil.js - -var RicoUtil = { - - getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) { - if ( arguments.length == 2 ) - mozillaEquivalentCSS = cssProperty; - - var el = $(htmlElement); - if ( el.currentStyle ) - return el.currentStyle[cssProperty]; - else - return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS); - }, - - createXmlDocument : function() { - if (document.implementation && document.implementation.createDocument) { - var doc = document.implementation.createDocument("", "", null); - - if (doc.readyState == null) { - doc.readyState = 1; - doc.addEventListener("load", function () { - doc.readyState = 4; - if (typeof doc.onreadystatechange == "function") - doc.onreadystatechange(); - }, false); - } - - return doc; - } - - if (window.ActiveXObject) - return Try.these( - function() { return new ActiveXObject('MSXML2.DomDocument') }, - function() { return new ActiveXObject('Microsoft.DomDocument')}, - function() { return new ActiveXObject('MSXML.DomDocument') }, - function() { return new ActiveXObject('MSXML3.DomDocument') } - ) || false; - - return null; - }, - - getContentAsString: function( parentNode ) { - return parentNode.xml != undefined ? - this._getContentAsStringIE(parentNode) : - this._getContentAsStringMozilla(parentNode); - }, - - _getContentAsStringIE: function(parentNode) { - var contentStr = ""; - for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) - contentStr += parentNode.childNodes[i].xml; - return contentStr; - }, - - _getContentAsStringMozilla: function(parentNode) { - var xmlSerializer = new XMLSerializer(); - var contentStr = ""; - for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) - contentStr += xmlSerializer.serializeToString(parentNode.childNodes[i]); - return contentStr; - }, - - toViewportPosition: function(element) { - return this._toAbsolute(element,true); - }, - - toDocumentPosition: function(element) { - return this._toAbsolute(element,false); - }, - - /** - * Compute the elements position in terms of the window viewport - * so that it can be compared to the position of the mouse (dnd) - * This is additions of all the offsetTop,offsetLeft values up the - * offsetParent hierarchy, ...taking into account any scrollTop, - * scrollLeft values along the way... - * - * IE has a bug reporting a correct offsetLeft of elements within a - * a relatively positioned parent!!! - **/ - _toAbsolute: function(element,accountForDocScroll) { - - if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 ) - return this._toAbsoluteMozilla(element,accountForDocScroll); - - var x = 0; - var y = 0; - var parent = element; - while ( parent ) { - - var borderXOffset = 0; - var borderYOffset = 0; - if ( parent != element ) { - var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" )); - var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" )); - borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset; - borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset; - } - - x += parent.offsetLeft - parent.scrollLeft + borderXOffset; - y += parent.offsetTop - parent.scrollTop + borderYOffset; - parent = parent.offsetParent; - } - - if ( accountForDocScroll ) { - x -= this.docScrollLeft(); - y -= this.docScrollTop(); - } - - return { x:x, y:y }; - }, - - /** - * Mozilla did not report all of the parents up the hierarchy via the - * offsetParent property that IE did. So for the calculation of the - * offsets we use the offsetParent property, but for the calculation of - * the scrollTop/scrollLeft adjustments we navigate up via the parentNode - * property instead so as to get the scroll offsets... - * - **/ - _toAbsoluteMozilla: function(element,accountForDocScroll) { - var x = 0; - var y = 0; - var parent = element; - while ( parent ) { - x += parent.offsetLeft; - y += parent.offsetTop; - parent = parent.offsetParent; - } - - parent = element; - while ( parent && - parent != document.body && - parent != document.documentElement ) { - if ( parent.scrollLeft ) - x -= parent.scrollLeft; - if ( parent.scrollTop ) - y -= parent.scrollTop; - parent = parent.parentNode; - } - - if ( accountForDocScroll ) { - x -= this.docScrollLeft(); - y -= this.docScrollTop(); - } - - return { x:x, y:y }; - }, - - docScrollLeft: function() { - if ( window.pageXOffset ) - return window.pageXOffset; - else if ( document.documentElement && document.documentElement.scrollLeft ) - return document.documentElement.scrollLeft; - else if ( document.body ) - return document.body.scrollLeft; - else - return 0; - }, - - docScrollTop: function() { - if ( window.pageYOffset ) - return window.pageYOffset; - else if ( document.documentElement && document.documentElement.scrollTop ) - return document.documentElement.scrollTop; - else if ( document.body ) - return document.body.scrollTop; - else - return 0; - } - -}; diff --git a/bigbluebutton-web/web-app/js/prototype/scriptaculous.js b/bigbluebutton-web/web-app/js/prototype/scriptaculous.js deleted file mode 100644 index c976e6bff737e7565544cab0d5221aea9554fe9a..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/scriptaculous.js +++ /dev/null @@ -1,58 +0,0 @@ -// script.aculo.us scriptaculous.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// 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. -// -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -var Scriptaculous = { - Version: '1.8.0', - require: function(libraryName) { - // inserting via DOM fails in Safari 2.0, so brute force approach - document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>'); - }, - REQUIRED_PROTOTYPE: '1.6.0', - load: function() { - function convertVersionString(versionString){ - var r = versionString.split('.'); - return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]); - } - - if((typeof Prototype=='undefined') || - (typeof Element == 'undefined') || - (typeof Element.Methods=='undefined') || - (convertVersionString(Prototype.Version) < - convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE))) - throw("script.aculo.us requires the Prototype JavaScript framework >= " + - Scriptaculous.REQUIRED_PROTOTYPE); - - $A(document.getElementsByTagName("script")).findAll( function(s) { - return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) - }).each( function(s) { - var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); - var includes = s.src.match(/\?.*load=([a-z,]*)/); - (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each( - function(include) { Scriptaculous.require(path+include+'.js') }); - }); - } -} - -Scriptaculous.load(); \ No newline at end of file diff --git a/bigbluebutton-web/web-app/js/prototype/slider.js b/bigbluebutton-web/web-app/js/prototype/slider.js deleted file mode 100644 index 53f319ecce3096ae48a66227e21b97f796e2644d..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/slider.js +++ /dev/null @@ -1,275 +0,0 @@ -// script.aculo.us slider.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if (!Control) var Control = { }; - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider = Class.create({ - initialize: function(handle, track, options) { - var slider = this; - - if (Object.isArray(handle)) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || { }; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - - this.handleLength = this.isVertical() ? - (this.handles[0].offsetHeight != 0 ? - this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : - (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : - this.handles[0].style.width.replace(/px$/,"")); - - this.active = false; - this.dragging = false; - this.disabled = false; - - if (this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if (this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (Object.isArray(slider.options.sliderValue) ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - h.makePositioned().observe("mousedown", slider.eventMouseDown); - }); - - this.track.observe("mousedown", this.eventMouseDown); - document.observe("mouseup", this.eventMouseUp); - document.observe("mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if (this.allowedValues){ - if (value >= this.allowedValues.max()) return(this.allowedValues.max()); - if (value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if (currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if (value > this.range.end) return this.range.end; - if (value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if (!this.active) { - this.activeHandleIdx = handleIdx || 0; - this.activeHandle = this.handles[this.activeHandleIdx]; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if (this.initialized && this.restricted) { - if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1])) - sliderValue = this.values[handleIdx-1]; - if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if (!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - (this.track.offsetHeight != 0 ? this.track.offsetHeight : - this.track.style.height.replace(/px$/,"")) - this.alignY : - (this.track.offsetWidth != 0 ? this.track.offsetWidth : - this.track.style.width.replace(/px$/,"")) - this.alignX); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if (this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if (this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if (this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if (this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start + this.range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start + this.range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if (Event.isLeftClick(event)) { - if (!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var track = handle; - if (track==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - if (this.handles.indexOf(handle)!=-1) { - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - } - Event.stop(event); - } - }, - update: function(event) { - if (this.active) { - if (!this.dragging) this.dragging = true; - this.draw(event); - if (Prototype.Browser.WebKit) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if (this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if (this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if (this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -}); diff --git a/bigbluebutton-web/web-app/js/prototype/sound.js b/bigbluebutton-web/web-app/js/prototype/sound.js deleted file mode 100644 index 9dd6e9f0162b7c53f4c43cf0e0ef1abeba493844..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/sound.js +++ /dev/null @@ -1,55 +0,0 @@ -// script.aculo.us sound.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Based on code created by Jules Gravinese (http://www.webveteran.com/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -Sound = { - tracks: {}, - _enabled: true, - template: - new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'), - enable: function(){ - Sound._enabled = true; - }, - disable: function(){ - Sound._enabled = false; - }, - play: function(url){ - if(!Sound._enabled) return; - var options = Object.extend({ - track: 'global', url: url, replace: false - }, arguments[1] || {}); - - if(options.replace && this.tracks[options.track]) { - $R(0, this.tracks[options.track].id).each(function(id){ - var sound = $('sound_'+options.track+'_'+id); - sound.Stop && sound.Stop(); - sound.remove(); - }) - this.tracks[options.track] = null; - } - - if(!this.tracks[options.track]) - this.tracks[options.track] = { id: 0 } - else - this.tracks[options.track].id++; - - options.id = this.tracks[options.track].id; - $$('body')[0].insert( - Prototype.Browser.IE ? new Element('bgsound',{ - id: 'sound_'+options.track+'_'+options.id, - src: options.url, loop: 1, autostart: true - }) : Sound.template.evaluate(options)); - } -}; - -if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ - if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) - Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>') - else - Sound.play = function(){} -} diff --git a/bigbluebutton-web/web-app/js/prototype/unittest.js b/bigbluebutton-web/web-app/js/prototype/unittest.js deleted file mode 100644 index 13473a30f4a21bfac09b1780e5eaf1ce17c63458..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/js/prototype/unittest.js +++ /dev/null @@ -1,568 +0,0 @@ -// script.aculo.us unittest.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) -// (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i<command.length; i++) { - Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)}); - } -}; - -var Test = {} -Test.Unit = {}; - -// security exception workaround -Test.Unit.inspect = Object.inspect; - -Test.Unit.Logger = Class.create(); -Test.Unit.Logger.prototype = { - initialize: function(log) { - this.log = $(log); - if (this.log) { - this._createLogTable(); - } - }, - start: function(testName) { - if (!this.log) return; - this.testName = testName; - this.lastLogLine = document.createElement('tr'); - this.statusCell = document.createElement('td'); - this.nameCell = document.createElement('td'); - this.nameCell.className = "nameCell"; - this.nameCell.appendChild(document.createTextNode(testName)); - this.messageCell = document.createElement('td'); - this.lastLogLine.appendChild(this.statusCell); - this.lastLogLine.appendChild(this.nameCell); - this.lastLogLine.appendChild(this.messageCell); - this.loglines.appendChild(this.lastLogLine); - }, - finish: function(status, summary) { - if (!this.log) return; - this.lastLogLine.className = status; - this.statusCell.innerHTML = status; - this.messageCell.innerHTML = this._toHTML(summary); - this.addLinksToResults(); - }, - message: function(message) { - if (!this.log) return; - this.messageCell.innerHTML = this._toHTML(message); - }, - summary: function(summary) { - if (!this.log) return; - this.logsummary.innerHTML = this._toHTML(summary); - }, - _createLogTable: function() { - this.log.innerHTML = - '<div id="logsummary"></div>' + - '<table id="logtable">' + - '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' + - '<tbody id="loglines"></tbody>' + - '</table>'; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"<br/>"); - }, - addLinksToResults: function(){ - $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run only this test" - Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); - }); - $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run all tests" - Event.observe(td, 'click', function(){ window.location.search = "";}); - }); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - this.options.tests = this.parseTestsQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push( - new Test.Unit.Testcase( - this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, - testcases[testcase], testcases["setup"], testcases["teardown"] - )); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - parseTestsQueryParameter: function(){ - if (window.location.search.parseQuery()["tests"]){ - return window.location.search.parseQuery()["tests"].split(','); - }; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i<this.tests.length;i++) { - if (this.tests[i].errors > 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i<this.tests.length;i++) { - assertions += this.tests[i].assertions; - failures += this.tests[i].failures; - errors += this.tests[i].errors; - } - return ( - (this.options.context ? this.options.context + ': ': '') + - this.tests.length + " tests, " + - assertions + " assertions, " + - failures + " failures, " + - errors + " errors"); - } -} - -Test.Unit.Assertions = Class.create(); -Test.Unit.Assertions.prototype = { - initialize: function() { - this.assertions = 0; - this.failures = 0; - this.errors = 0; - this.messages = []; - }, - summary: function() { - return ( - this.assertions + " assertions, " + - this.failures + " failures, " + - this.errors + " errors" + "\n" + - this.messages.join("\n")); - }, - pass: function() { - this.assertions++; - }, - fail: function(message) { - this.failures++; - this.messages.push("Failure: " + message); - }, - info: function(message) { - this.messages.push("Info: " + message); - }, - error: function(error) { - this.errors++; - this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")"); - }, - status: function() { - if (this.failures > 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertInspect: function(expected, actual) { - var message = arguments[2] || "assertInspect"; - try { (expected == actual.inspect()) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertEnumEqual: function(expected, actual) { - var message = arguments[2] || "assertEnumEqual"; - try { $A(expected).length == $A(actual).length && - expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? - this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + - ', actual ' + Test.Unit.inspect(actual)); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertIdentical: function(expected, actual) { - var message = arguments[2] || "assertIdentical"; - try { (expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNotIdentical: function(expected, actual) { - var message = arguments[2] || "assertNotIdentical"; - try { !(expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNull: function(obj) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } - catch(e) { this.error(e); } - }, - assertMatch: function(expected, actual) { - var message = arguments[2] || 'assertMatch'; - var regex = new RegExp(expected); - try { (regex.exec(actual)) ? this.pass() : - this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertType: function(expected, actual) { - var message = arguments[2] || 'assertType'; - try { - (actual.constructor == expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertNotOfType: function(expected, actual) { - var message = arguments[2] || 'assertNotOfType'; - try { - (actual.constructor != expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - assertRespondsTo: function(method, obj) { - var message = arguments[2] || 'assertRespondsTo'; - try { - (obj[method] && typeof obj[method] == 'function') ? this.pass() : - this.fail(message + ": object doesn't respond to [" + method + "]"); } - catch(e) { this.error(e); } - }, - assertReturnsTrue: function(method, obj) { - var message = arguments[2] || 'assertReturnsTrue'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - m() ? this.pass() : - this.fail(message + ": method returned false"); } - catch(e) { this.error(e); } - }, - assertReturnsFalse: function(method, obj) { - var message = arguments[2] || 'assertReturnsFalse'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - !m() ? this.pass() : - this.fail(message + ": method returned true"); } - catch(e) { this.error(e); } - }, - assertRaise: function(exceptionName, method) { - var message = arguments[2] || 'assertRaise'; - try { - method(); - this.fail(message + ": exception expected but none was raised"); } - catch(e) { - ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); - } - }, - assertElementsMatch: function() { - var expressions = $A(arguments), elements = $A(expressions.shift()); - if (elements.length != expressions.length) { - this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); - return false; - } - elements.zip(expressions).all(function(pair, index) { - var element = $(pair.first()), expression = pair.last(); - if (element.match(expression)) return true; - this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); - }.bind(this)) && this.pass(); - }, - assertElementMatches: function(element, expression) { - this.assertElementsMatch([element], expression); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - - if(typeof test == 'string') { - test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); - test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); - this.test = function() { - eval('with(this){'+test+'}'); - } - } else { - this.test = test || function() {}; - } - - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); - -// *EXPERIMENTAL* BDD-style testing to please non-technical folk -// This draws many ideas from RSpec http://rspec.rubyforge.org/ - -Test.setupBDDExtensionMethods = function(){ - var METHODMAP = { - shouldEqual: 'assertEqual', - shouldNotEqual: 'assertNotEqual', - shouldEqualEnum: 'assertEnumEqual', - shouldBeA: 'assertType', - shouldNotBeA: 'assertNotOfType', - shouldBeAn: 'assertType', - shouldNotBeAn: 'assertNotOfType', - shouldBeNull: 'assertNull', - shouldNotBeNull: 'assertNotNull', - - shouldBe: 'assertReturnsTrue', - shouldNotBe: 'assertReturnsFalse', - shouldRespondTo: 'assertRespondsTo' - }; - var makeAssertion = function(assertion, args, object) { - this[assertion].apply(this,(args || []).concat([object])); - } - - Test.BDDMethods = {}; - $H(METHODMAP).each(function(pair) { - Test.BDDMethods[pair.key] = function() { - var args = $A(arguments); - var scope = args.shift(); - makeAssertion.apply(scope, [pair.value, args, this]); }; - }); - - [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each( - function(p){ Object.extend(p, Test.BDDMethods) } - ); -} - -Test.context = function(name, spec, log){ - Test.setupBDDExtensionMethods(); - - var compiledSpec = {}; - var titles = {}; - for(specName in spec) { - switch(specName){ - case "setup": - case "teardown": - compiledSpec[specName] = spec[specName]; - break; - default: - var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); - var body = spec[specName].toString().split('\n').slice(1); - if(/^\{/.test(body[0])) body = body.slice(1); - body.pop(); - body = body.map(function(statement){ - return statement.strip() - }); - compiledSpec[testName] = body.join('\n'); - titles[testName] = specName; - } - } - new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); -}; \ No newline at end of file diff --git a/bigbluebutton-web/web-app/test/test_bbb.jsp b/bigbluebutton-web/web-app/test/test_bbb.jsp deleted file mode 100644 index f17977e1f655badea5928c7b07fe287b3d9ae13e..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/test/test_bbb.jsp +++ /dev/null @@ -1,59 +0,0 @@ -<!-- - -BigBlueButton - http://www.bigbluebutton.org - -Copyright (c) 2008-2009 by respective authors (see below). All rights reserved. - -BigBlueButton is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, If not, see <http://www.gnu.org/licenses/>. - -Author: Fred Dixon <ffdixon@bigbluebutton.org> - ---> - -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> -<title>Test BigBlueButton</title> -</head> -<body> - -<%@ include file="test_bbb_api.jsp"%> - -<br> - -<% - String joinURL = getJoinURL("testUser", "Test Conference"); - - if (joinURL.startsWith("http://")) { -%> - -<script language="javascript" type="text/javascript"> - window.location.href="<%=joinURL%>"; -</script> - -<% - } else { -%> - -Error: getJoinURL() failed -<p/> -<%=joinURL %> - -<% - } -%> -</body> -</html> diff --git a/bigbluebutton-web/web-app/test/test_bbb_api.jsp b/bigbluebutton-web/web-app/test/test_bbb_api.jsp deleted file mode 100755 index ee5693648b3adbe9d34d2b4890bf203310501632..0000000000000000000000000000000000000000 --- a/bigbluebutton-web/web-app/test/test_bbb_api.jsp +++ /dev/null @@ -1,213 +0,0 @@ -<!-- - -BigBlueButton - http://www.bigbluebutton.org - -Copyright (c) 2008-2009 by respective authors (see below). All rights reserved. - -BigBlueButton is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, If not, see <http://www.gnu.org/licenses/>. - -Author: Fred Dixon <ffdixon@bigbluebutton.org> - ---> - -<%@ page - import="java.util.*,java.io.*,java.net.*,javax.crypto.*,javax.xml.parsers.*,org.w3c.dom.Document,org.xml.sax.*" - errorPage="error.jsp" %> - -<%@ page import="org.apache.commons.codec.digest.*"%> -<%@ include file="../demo/bbb_api_conf.jsp"%> - -<%! -// -// Create a meeting and return a URL to join it as moderator -// -public String getJoinURL(String username, String meetingID) { - String base_url_create = BigBlueButtonURL + "api/create?"; - String base_url_join = BigBlueButtonURL + "api/join?"; - - String welcome_param = ""; - String checksum = ""; - Integer voiceBridge = new Integer(99999); - - String create_parameters = "name=" + urlEncode(meetingID) + "&meetingID=" + urlEncode(meetingID) - + welcome_param + "&attendeePW=ap&moderatorPW=mp&voiceBridge="+voiceBridge; - - Document doc = null; - - try { - // Attempt to create a meeting using meetingID - String xml = getURL(base_url_create + create_parameters + "&checksum=" + checksum("create" + create_parameters + salt) ); - doc = parseXml(xml); - } catch (Exception e) { - e.printStackTrace(); - } - - if (doc.getElementsByTagName("returncode").item(0).getTextContent() - .trim().equals("SUCCESS")) { - String join_parameters = "meetingID=" + urlEncode(meetingID) + "&fullName=" + urlEncode(username) - + "&password=mp"; - - return base_url_join + join_parameters + "&checksum=" + checksum("join" + join_parameters + salt); - - } - return doc.getElementsByTagName("messageKey").item(0).getTextContent().trim() - + ": " + doc.getElementsByTagName("message").item(0).getTextContent().trim(); - } - - -// -// getJoinURLViewer() -- Get the URL to join a meeting as viewer -// -public String getJoinURLViewer(String username, String meetingID) { - - String base_url_join = BigBlueButtonURL + "api/join?"; - - String join_parameters = "meetingID=" + urlEncode(meetingID) + "&fullName=" + urlEncode(username) - + "&password=ap"; - - return base_url_join + join_parameters + "&checksum=" + checksum("join" + join_parameters + salt); -} - - // - // checksum() -- create a hash based on the shared salt (located in bbb_api_conf.jsp) - // - public static String checksum(String s) { - String checksum = ""; - try { - checksum = org.apache.commons.codec.digest.DigestUtils.shaHex(s); - } catch (Exception e) { - e.printStackTrace(); - } - return checksum; - } - - // - // getURL() -- fetch a URL and return its contents as a String - // - public static String getURL(String url) { - StringBuffer response = null; - - try { - URL u = new URL(url); - HttpURLConnection httpConnection = (HttpURLConnection) u - .openConnection(); - - httpConnection.setUseCaches(false); - httpConnection.setDoOutput(true); - httpConnection.setRequestMethod("GET"); - - httpConnection.connect(); - int responseCode = httpConnection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { - InputStream input = httpConnection.getInputStream(); - - // Read server's response. - response = new StringBuffer(); - Reader reader = new InputStreamReader(input, "UTF-8"); - reader = new BufferedReader(reader); - char[] buffer = new char[1024]; - for (int n = 0; n >= 0;) { - n = reader.read(buffer, 0, buffer.length); - if (n > 0) - response.append(buffer, 0, n); - } - - input.close(); - httpConnection.disconnect(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - if (response != null) { - return response.toString(); - } else { - return ""; - } - } - - // - // getURLisMeetingRunning() -- return a URL that the client can use to poll for whether the given meeting is running - // - public String getURLisMeetingRunning(String meetingID) { - String base_main = "meetingID=" + urlEncode(meetingID); - String base_url = BigBlueButtonURL + "api/isMeetingRunning?"; - String checksum =""; - - try { - checksum = DigestUtils.shaHex("isMeetingRunning" + base_main + salt); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - return base_url + base_main + "&checksum=" + checksum; - } - - // - // isMeetingRunning() -- check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting) - // - public String isMeetingRunning(String meetingID) { - String base_main = "meetingID=" + urlEncode(meetingID); - String base_url = BigBlueButtonURL + "api/isMeetingRunning?"; - String checksum =""; - - try { - checksum = DigestUtils.shaHex("isMeetingRunning" + base_main + salt); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - String xml = getURL(base_url + base_main + "&checksum=" + checksum); - - Document doc = null; - try { - doc = parseXml(xml); - } catch (Exception e) { - e.printStackTrace(); - } - - if (doc.getElementsByTagName("returncode").item(0).getTextContent() - .trim().equals("SUCCESS")) { - return doc.getElementsByTagName("running").item(0).getTextContent().trim(); - } - - return "false"; - - } - - // - // parseXml() -- return a DOM of the XML - // - public static Document parseXml(String xml) - throws ParserConfigurationException, IOException, SAXException { - DocumentBuilderFactory docFactory = DocumentBuilderFactory - .newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - Document doc = docBuilder.parse(new InputSource(new StringReader(xml))); - return doc; - } - - // - // urlEncode() -- URL encode the string - // - public static String urlEncode(String s) { - try { - return URLEncoder.encode(s, "UTF-8"); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } -%> diff --git a/bigbluebutton-web/wrapper/grails-wrapper-runtime-2.3.0.jar b/bigbluebutton-web/wrapper/grails-wrapper-runtime-2.3.0.jar new file mode 100755 index 0000000000000000000000000000000000000000..0cdc69135c25e0d52c9b436279ca0d5edf1425e5 Binary files /dev/null and b/bigbluebutton-web/wrapper/grails-wrapper-runtime-2.3.0.jar differ diff --git a/bigbluebutton-web/wrapper/grails-wrapper.properties b/bigbluebutton-web/wrapper/grails-wrapper.properties new file mode 100755 index 0000000000000000000000000000000000000000..74391cea895d412e7f6370c242024982bda85522 --- /dev/null +++ b/bigbluebutton-web/wrapper/grails-wrapper.properties @@ -0,0 +1 @@ +wrapper.dist.url=http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/ diff --git a/bigbluebutton-web/wrapper/springloaded-core-1.1.3.jar b/bigbluebutton-web/wrapper/springloaded-core-1.1.3.jar new file mode 100755 index 0000000000000000000000000000000000000000..3129185d36c1a4da328751180a6359c3ff72e766 Binary files /dev/null and b/bigbluebutton-web/wrapper/springloaded-core-1.1.3.jar differ