diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..85acc7df --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{java}] +indent_size = 3 diff --git a/.gitignore b/.gitignore index cc139d67..55576ab8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,16 @@ .* -•* -*.eml -*.iml -build/work -build/dist -claustra/ -code/domains.map -jobs/ -local/ -node_modules/ -static/sites/* -static/scripts/*.map.json +build/ + +/claustra/ +/docs/ +/jobs/ +/local/ +/lib/ +/node_modules/ + +/static/ +!/static/img +!/static/formica.html + +/code/domains.map +/i18n/*.js diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 00000000..20a58a64 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,33 @@ +# Change Log + +## May 23, 2020 + +* Render tables with stripes and hover colors extrapolated from layout settings +* Replaced Google’s ReCaptcha with [hCaptcha](https://hcaptcha.com) + +## May 17, 2020 + +* Reverted Yarn scripts into Gradle tasks +* Implemented complete build system in Gradle +* Added color support for console messages +* Replaced Node module for rendering Markdown (marked) with Java implementation ([CommonMark](https://github.com/atlassian/commonmark-java)) +* Replaced Node module for sanitizing HTML (string-strip-html) with Java implementation ([jsoup](https://jsoup.org)) + +## May 1, 2020 + +* Upgraded jQuery to version 3 +* Refactored remaining cient-side jQuery code using [Alpine](https://github.com/alpinejs/alpine) (jQuery is still a dependency of UIkit, though) +* Moved code for jQuery [CollagePlus](https://github.com/antville/jquery-collagePlus) plugin into extra file + +## April 13, 2020 + +* Rewrote most client-side code without using jQuery +* Refactored Formica bookmarklet +* Improved Proxy Claustra for use with Formica bookmarklet +* Fixed output missing Markdown filter in multiple places +* Replaced Gradle and Ant build tasks with Yarn scripts +* Removed support for Instant Articles +* Removed support for Accelerated Mobile Pages +* Replaced Rhino-incompatible sanitize-html NPM package with string-strip-html +* Upgraded NPM dependencies to latest compatible versions +* Incorporated some claustra as integral part of Antville diff --git a/INSTALL.md b/INSTALL.md index 7d3af022..c759ea49 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -2,18 +2,19 @@ ## Helma Object Publisher -Antville needs Helma Object Publisher to be installed on the desired machine. If not already done so please [download Helma](http://helma.org/download) and follow the [installation instructions](http://helma.org/download/installation). +Antville needs Helma Object Publisher to be installed on the desired machine. If not already done so please [download Helma](https://github.com/antville/helma/releases) and follow the [installation instructions](https://github.com/antville/helma/#how-to-helma). ## SQL Database -Furthermore, Antville needs an SQL database to be installed as well. Currently supported products are PostgreSQL and MySQL. If not already done so please install the desired database before you continue. +Furthermore, Antville needs an SQL database to be installed as well. Currently supported products are PostgreSQL and MySQL/MariaDB. Be sure to install the desired database before you continue. -For connecting Antville to the database the corresponding JDBC driver is also necessary. If not already done so please copy the driver to the directory `lib/ext` of Helma’s installation directory. +Finally, you need the corresponding JDBC driver for connecting Antville to the database. Please copy the driver to the directory `lib/ext` of Helma’s installation directory. -As of writing this installation guide the drivers could be downloaded via the following URLs: +As of writing this installation guide the drivers can be downloaded via the following URLs: -- [http://jdbc.postgresql.org/download.html]() -- [http://dev.mysql.com/downloads/connector/j/]() +- +- +- Of course you can also use a packet manager like aptitude or MacPorts if the JDBC driver is available from there. However, you then need to create a symbolic link to the driver from within Helma’s `lib/ext` directory. @@ -21,9 +22,9 @@ Now unpack the Antville distribution package. Move the resulting directory `antv Inside the directory `antville` you will find a directory called `db`. This directory contains all database-related files, ie. several SQL scripts for creating the database needed by the application. Change to that directory. -Antville currently comes with scripts for PostgreSQL (`postgre.sql`) and for MySQL databases (`my.sql`). +Antville currently comes with scripts for PostgreSQL (`postgre.sql`) and for MySQL/MariaDB databases (`my.sql`). -_Note:_ Antville is preconfigured for PostgreSQL out of the box but it is easy to modify the configuration to be compatible with MySQL. +_Note:_ Antville is preconfigured for PostgreSQL out of the box but it is easy to modify the configuration to be compatible with MySQL/MariaDB. Each of these SQL scripts creates the tables, indexes and initial records and also the account used by the application to communicate with the database. @@ -31,7 +32,7 @@ Each of these SQL scripts creates the tables, indexes and initial records and al The default password of this account is `antville`, so you should change it if you want to secure your installation. Open the desired SQL script and scroll down to the `create user` (for PostgreSQL) or `grant user` (for MySQL) statement. Search for `password` (PostgreSQL) or `identified by` (MySQL) and change the trailing value in quotes to the password of your choice. -Please refer to the documentation of your database on how to run the appropriate script. Afterwards you will have to tell Antville how it can access your database. This is done in a configuration file named `db.properties` which is located in the `code` directory, or – if you are going for MySQL – in the `db/my.compat` directory. +Please refer to the documentation of your database on how to run the appropriate script. Afterwards you will have to tell Antville how it can access your database. This is done in a configuration file named `db.properties` which is located in the `code` directory, or – if you are going for MySQL/MariaDB – in the `db/my.compat` directory. Open the desired file and ensure that the line beginning with `antville.url` points to the server that runs the database. By default, this is the local machine aka localhost which will be just right in most cases. @@ -39,11 +40,11 @@ Check that the password is set accordingly to the one you entered in the SQL scr ## Enabling an Application -Finally, you need to tell Helma about the new application. This is done by adding the contents of the file `apps.properties` in the `extra` directory to the file `apps.properties` located in the top installation directory. +Finally, you need to tell Helma about the new application. This is done by adding the contents of the file `apps.properties` in the `tools/config` directory to the file `apps.properties` located in the top installation directory. -_Note:_ If you are using MySQL you need to edit and enable line 5 (the one defining `antville.repository.1`) of the file by removing the leading comment symbol `#`. +_Note:_ If you are using MySQL/MariaDB you need to edit and enable line 5 (the one defining `antville.repository.1`) of the file by removing the leading comment symbol `#`. -## Starting Up! +## Starting Up Now start up Helma and point your browser to @@ -58,11 +59,11 @@ Have fun! ## TL;DR 1. Install Helma if not already done so -2. Install PostgreSQL or MySQL database if not already done so -3. Install corresponding JDBC driver in helma/lib/ext +2. Install PostgreSQL or MySQL/MariaDB database if not already done so +3. Install or symlink corresponding JDBC driver in helma/lib/ext 4. Unpack Antville distribution file 5. Move antville directory into helma/app directory -6. Run the desired script in antville/db for either PostgreSQL or MySQL -7. Copy contents of antville/extra/apps.properties to helma/apps.properties -8. If necessary, enable MySQL compatibility in apps.properties -9. Start up Helma and browse to [http://localhost:8080/antville]() +6. Run the desired SQL script in antville/db for either PostgreSQL or MySQL/MariaDB +7. Copy contents of antville/tools/config/apps.properties to helma/apps.properties +8. If necessary, enable MySQL/MariaDB compatibility in apps.properties +9. Start up Helma and browse to diff --git a/legal/antville.txt b/LICENSE.md similarity index 82% rename from legal/antville.txt rename to LICENSE.md index 50e1bd3d..bbf51232 100644 --- a/legal/antville.txt +++ b/LICENSE.md @@ -1,10 +1,12 @@ -Copyright 2001-2014 by the Workers of Antville. +# License + +Copyright 2001-2020 by the Workers of Antville. 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, diff --git a/README.md b/README.md index c803aea4..27fe21e6 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,54 @@ # About Antville -Antville is an open source project aimed at the development of a high performance, feature rich weblog hosting software. It can easily host up to several thousands of sites (the number of weblogs is rather limited by the installation owner’s choice and server power than by software limitations). +Antville is an open source project providing a high performance, feature-rich blog hosting software. Antville can host tens of thousands of blogs. Server power is the only limit. Installation and use is easy. -Antville is entirely written in JavaScript (ECMAScript, to be precise) and based on Helma Object Publisher, a powerful and fast scriptable open source web application server (which itself is written in Java). Antville works with a relational database in the backend. +Antville is written in server-side JavaScript and developed with Helma Object Publisher. Antville works with a relational database in the back-end. -[Check out the project site for more information.](http://project.antville.org) +[Look at the project site for more information.](https://project.antville.org) ## Status -Antville can be considered stable quality code. It is heavily used by several thousands of users at [Antville.org](http://antville.org) and [several other sites](http://code.google.com/p/antville/wiki/AntvilleSites). Nevertheless, there still could be bugs hidden somewhere in this application. +Antville’s codebase is of stable quality and ready for production deployment. Try out [Antville.org](https://antville.org) for a demonstration. -Antville can be used for production purposes, but please bear in mind that the creators of Antville do not take any warranty, whichever kind. +There still could be bugs hidden in Antville’s source code. If you find one please let us know. The creators of Antville do not take any responsibility for what the software might do. ## System Requirements -To run Antville you need [Helma Object Publisher](http://helma.org) and a relational database in the backend. Antville was thoroughly tested with [PostgreSQL](http://postgresql.org) and [MySQL](http://mysql.com). +To run Antville you need [Helma Object Publisher](https://github.com/antville/helma) and a relational database software. We tested Antville with [PostgreSQL](https://postgresql.org) and [MySQL](https://mysql.com) – [MariaDB](https://mariadb.com) should work, too. -For setting up Helma Object Publisher and the database of your choice please refer to the corresponding installation instructions. +To enable Antville sending notification e-mails you need access to an SMTP server. -To enable Antville sending confirmation mails to users (e.g. after registration) you will also need access to an SMTP server. +Helma comes with an embedded webserver (Jetty) so you do not need to install one. Yet, you can also use the webserver of your choice. -Helma comes with its own embedded webserver (Jetty) so you do not need to install one, although you can easily use Apache httpd as front-end webserver, too. +For details please refer to the installation instructions of Helma Object Publisher and the corresponding software packages. -Please refer to the Install.md file for detailed information on how to install Antville. +The `INSTALL.md` file contains detailed instructions to install Antville. ## Documentation and Further Information -For documentation and further information regarding Antville you can refer to: +For documentation and further information about Antville you can refer to: +- [project.antville.org](https://project.antville.org) +- [about.antville.org](https://about.antville.org) +- [help.antville.org](https://help.antville.org) -- [project.antville.org](http://project.antville.org) -- [about.antville.org](http://about.antville.org) -- [help.antville.org](http://help.antville.org) +Feel free to ask any question about Antville at our [support site](https://help.antville.org). -Feel free to ask any question about Antville at our [support site](http://help.antville.org). - -You should follow Antville on [Facebook](http://facebook.com/Antville) and [Twitter](http://twitter.com/antville_org)! +You should follow Antville on [Facebook](https://facebook.com/Antville) and [Twitter](https://twitter.com/antville_org)! ## Bug Reporting and Feature Requests -If you think you found a bug [please report it](http://project.antville.org). +If you think you found a bug [please let us know](https://project.antville.org). -A good place for your feature requests or proposals is the [project development site](http://project.antville.org). +A great place for your feature requests or proposals is the [project development site](https://project.antville.org). -Since Antville is open-source, you are definitely encouraged to modify the application, we would be happy to hear from your ideas, suggestions and changes – drop us a message via or use any of the aforementioned channels. - -For those of you who demonstrated a commitment to collaborative open-source development through sustained participation and contributions within the development of Antville, there will also be other ways to participate. +Antville is open-source, and we want to encourage you to change its code according to your likeness. We are curious about your ideas and suggestions. Feel free to drop us a message to or through any channels mentioned before. ## About Helma Object Publisher -[Helma Object Publisher](http://helma.org) is a web application server. +[Helma Object Publisher](https://github.com/antville/helma) is an open source project providing a powerful, fast and scriptable web application server written in Java. -With Helma Object Publisher (sometimes simply referred to as Helma or Hop) you can define Objects and map them to a relational database table. These so-called HopObjects can be created, modified and deleted using a comfortable object/container model. Hence, no manual fiddling around with database code is necessary. +Define HopObjects and map them to a relational database table. Create, change and delete HopObjects at your whim using a comfortable object-container model. Manual fiddling around with database code is not necessary. -HopObjects are extended JavaScript objects which can be scripted using server-side JavaScript. Beyond the common JavaScript features, Helma provides special “skin” and template functionalities which facilitate the rendering of objects via a web interface. - -Thanks to Helma’s relational database mapping technology, HopObjects create a hierarchical structure, the URL space of a Helma site. The parts between slashes in a Helma URL represent HopObjects (similar to the document tree in static sites). The Helma URL space can be thought of as an analogy to the Document Object Model (DOM) in client-side JavaScript. +HopObjects extend the native JavaScript object. They got all the common features you know – and more. One highlight are the special templating features to ease the rendering of objects for the Web. +Combine HopObjects to create a hierarchical structure. A URL in Helma mirrors this structure. Each part of the URL path corresponds to a relational database mapping, similar to the document tree of static websites. Helma’s URL space is an analogy to the Document Object Model implemented in client-side JavaScript. diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..ff533a9a --- /dev/null +++ b/build.gradle @@ -0,0 +1,287 @@ +plugins { + id 'base' + id 'java' + + id 'com.github.node-gradle.node' version '2.2.3' + id 'org.ajoberstar.grgit' version '4.0.2' apply false +} + +import org.ajoberstar.grgit.Grgit + +tasks.build.dependsOn 'assemble' + +node { + version = '12.16.3' + yarnVersion = '1.22.4' + download = true +} + +allprojects { + apply plugin: 'java' + + repositories { + mavenCentral() + jcenter() + } + + project.ext.distVersion = { -> + def json = new groovy.json.JsonSlurper() + def packageData = json.parse(file("${rootProject.projectDir}/package.json")) + return packageData.version.substring(0, packageData.version.size() - 2) + } + + project.ext.antvilleBuildDir = "${rootProject.buildDir}/tmp/antville" + project.ext.antvilleInstallDir = "${rootProject.buildDir}/install/antville" + + project.ext.antvilleDistFiles = copySpec { + from fileTree(antvilleBuildDir).matching { + } + } + + // Hide some purely Java-related tasks + project.tasks.buildDependents.group = null; + project.tasks.buildNeeded.group = null; + project.tasks.classes.group = null; + project.tasks.jar.group = null; + project.tasks.javadoc.group = null; + project.tasks.testClasses.group = null; +} + +version = distVersion() + +dependencies { + implementation 'com.atlassian.commonmark:commonmark:0.14.0' + implementation 'com.atlassian.commonmark:commonmark-ext-autolink:0.14.0' + implementation 'com.atlassian.commonmark:commonmark-ext-gfm-strikethrough:0.14.0' + implementation 'com.atlassian.commonmark:commonmark-ext-gfm-tables:0.14.0' + implementation 'org.jsoup:jsoup:1.13.1' + implementation 'rome:rome:1.0' + + implementation('org.lesscss:lesscss:1.7.0.1.1') { + exclude group: 'org.mozilla', module: 'rhino' + exclude group: 'org.slf4j', module: 'slf4j-api' + exclude group: 'org.slf4j', module: 'slf4j-simple' + } +} + +task assemble(type: Copy, overwrite: true) { + dependsOn 'installAntville' + dependsOn 'installJars' + dependsOn 'buildStaticFiles' + + from fileTree(antvilleBuildDir).matching { + exclude 'node_modules' + exclude 'package.json' + exclude 'tests' + exclude 'tools/client' + exclude 'tools/antclick' + exclude 'yarn.lock' + } into antvilleInstallDir +} + +task installAntville { + description 'Clone the Antville repository and remove all unnecessary files.' + group 'installation' + + def tempDir = "$project.buildDir/tmp/repo" + + outputs.dirs tempDir, antvilleBuildDir + + doFirst { + Grgit.clone(dir: tempDir, uri: project.ext['antville.repo.url']) + } + + doLast { + def git = Grgit.open(dir: tempDir) + def hash = git.head().abbreviatedId + def date = new Date().format('d MMM yyyy') + + copy { + from "$tempDir/code/app.properties" + into "$antvilleBuildDir/code" + filter { line -> line.replaceAll('(version =) 0.0.0', "\$1 $version.$hash") + .replaceAll('(buildDate =) 18 Oct 1971', "\$1 $date") + } + } + + copy { + from fileTree(tempDir).matching { + exclude 'code/app.properties' + exclude '*gradle*' + exclude '.*' + exclude 'i18n/*.po*' + } into antvilleBuildDir + } + } +} + +task installJars(type: Copy) { + description 'Download required JAR libraries.' + group 'installation' + dependsOn 'installAntville' + + def outputDir = "$antvilleBuildDir/lib" + + outputs.dir outputDir + + from configurations.runtimeClasspath + into outputDir +} + +task installNodeModules(type: YarnTask) { + description 'Download required Node modules.' + group 'build' + dependsOn 'installAntville' + + inputs.files "$antvilleBuildDir/package.json" + outputs.dir "$antvilleBuildDir/node_modules" + + args = ['-s', 'install'] + + execOverrides { + it.workingDir = antvilleBuildDir + } +} + +task buildStaticFiles(type: Copy) { + description 'Build fonts, client-side scripts and stylesheets.' + group 'build' + + dependsOn 'installAntville' + dependsOn 'installNodeModules' + dependsOn 'buildMainScript' + dependsOn 'buildMainStyles' + dependsOn 'buildEditorScript' + dependsOn 'buildEditorStyles' + dependsOn 'buildGalleryScript' + dependsOn 'buildLicenses' + + def inputDir = "$antvilleBuildDir/node_modules/uikit/dist/fonts" + def outputDir = "$antvilleBuildDir/static/fonts" + + inputs.dir inputDir + outputs.dir outputDir + + from inputDir + into outputDir +} + +['main', 'editor', 'gallery'].each { name -> + task "build${name.capitalize()}Script" (type: YarnTask) { + description "Build the ${name} client-side scripts." + group 'build' + dependsOn 'installNodeModules' + + def inputFile = "tools/client/${name}.js" + def outputFile = "static/scripts/${name}.min.js" + + inputs.files "$antvilleBuildDir/$inputFile" + outputs.files "$antvilleBuildDir/$outputFile" + + args = ['-s', 'browserify', inputFile, '-o', outputFile, '-g', 'uglifyify'] + + execOverrides { + it.workingDir = antvilleBuildDir + } + } +} + +['main', 'editor'].each { name -> + task "build${name.capitalize()}Styles" (type: YarnTask) { + description "Build the ${name} stylesheet." + group 'build' + dependsOn 'installNodeModules' + + def inputFile = "tools/client/${name}.less" + def outputFile = "static/styles/${name}.min.css" + + inputs.files "$antvilleBuildDir/$inputFile" + outputs.files "$antvilleBuildDir/$outputFile" + + args = ['-s', 'lessc', '--clean-css', inputFile, outputFile] + + execOverrides { + it.workingDir = antvilleBuildDir + } + } +} + +task buildLicenses(type: YarnTask) { + description 'Build licenses file from client-side dependecies.' + group 'build' + dependsOn 'installNodeModules' + + def outputFile = "$antvilleBuildDir/static/licenses.txt" + + inputs.file "$antvilleBuildDir/package.json" + outputs.file outputFile + + args = ['-s', 'licenses', 'generate-disclaimer'] + + execOverrides { + it.workingDir = antvilleBuildDir + it.standardOutput = new FileOutputStream(outputFile) + } +} + +task jsdoc(type: YarnTask) { + description 'Generates JavaScript API documentation for the main source code.' + group 'documentation' + dependsOn 'installNodeModules' + + def inputDir = "$antvilleBuildDir/code" + def outputDir = "${project.buildDir}/docs/jsdoc" + + inputs.dir inputDir + outputs.dir outputDir + + args = ['-s', 'jsdoc', '-r', '-d', outputDir, inputDir] + + execOverrides { + it.workingDir = antvilleBuildDir + } +} + +task assembleDist { + description 'Creates the Antville download packages.' + group 'distribution' + + dependsOn 'assemble' + dependsOn 'distZip' + dependsOn 'distTar' +} + +task distZip(type: Zip) { + description 'Creates the Antville download package as Zip file.' + group 'distribution' + dependsOn 'assemble' + + def version = project.distVersion() + def outputDir = "${project.buildDir}/distributions" + def outputFile = "antville-${version}.zip" + + inputs.dir antvilleInstallDir + outputs.file "$outputDir/$outputFile" + + from antvilleInstallDir + destinationDirectory = file(outputDir) + archiveFileName = outputFile +} + +task distTar(type: Tar) { + description 'Creates the Antville download package as Bzip2 file.' + group 'distribution' + dependsOn 'assemble' + + def version = project.distVersion() + def outputDir = "${project.buildDir}/distributions" + def outputFile = "antville-${version}.tbz" + + inputs.dir antvilleInstallDir + outputs.file "$outputDir/$outputFile" + + from antvilleInstallDir + compression = Compression.BZIP2 + destinationDirectory = file(outputDir) + archiveFileName = outputFile +} diff --git a/build.xml b/build.xml deleted file mode 100644 index 5e999971..00000000 --- a/build.xml +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0]]> - - - 0]]> - - - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Build aborted by user. - - - - - - - - - // Apply with enabled updater repository using `ant patch -Dpatch.id=${file-date}`${line.separator}var sql = new Sql(); - - - - - - - - - #sites = collection(Site) - ${claustra.title}.prototype.main_action = function () {${line.separator} //res.debug(this.sites.count());${line.separator}};${line.separator} - - ${claustra.name} = mountpoint(${claustra.title})${line.separator} - - - - - - - - - - - - - - - diff --git a/build/MessageParser.js b/build/MessageParser.js deleted file mode 100644 index c78b945f..00000000 --- a/build/MessageParser.js +++ /dev/null @@ -1,481 +0,0 @@ -// Jala Project [http://opensvn.csie.org/traccgi/jala] -// -// Copyright 2004 ORF Online und Teletext GmbH. -// -// 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. - -/** - * @fileoverview - * MessageParser script that extracts all gettext message macros - * out of skin files and all calls of gettext functions - * (that is "gettext", "ngettext" and "_") out of function - * files and directly generates a .pot file from it. - * If an argument "-o" is given and it is followed by - * a path to a file, the output is written to this file. - * Any other argument is interpreted as directory or file - * that should be parsed. - */ - - -/** - * @constructor - */ -var Message = function(id, pluralId) { - this.id = id && String(id); - this.pluralId = pluralId && String(pluralId); - this.locations = []; - return this; -}; - -/** - * Static method that constructs a message key by - * which a message can be identified in the messages map. - * @param {String} id The message Id - * @param {String} pluralId The plural message Id - * @returns The generated message key - * @type String - */ -Message.getKey = function(id, pluralId) { - if (id && pluralId) { - return id + pluralId; - } else { - return id; - } -}; - -/** - * Encloses the string passed as argument in quotes - * and wraps the string if it is longer than 80 characters. - * @param {String} str The string to format - * @param {Boolean} wrap If true the message string will be splitted in - * parts where each one is max. 80 characters long - * @returns The formatted string. - * @type String - */ -Message.formatId = function(str, wrap) { - var escapeQuotes = function(s) { - return s.replace(/(^|[^\\])"/g, '$1\\"'); - }; - - var len = 80; - var buf = new java.lang.StringBuffer(); - if (wrap == true && str.length > len) { - buf.append('""\n'); - var offset = 0; - while (offset < str.length) { - buf.append('"'); - buf.append(escapeQuotes(str.substring(offset, offset += len))); - buf.append('"'); - buf.append("\n"); - } - return buf.toString(); - } else { - buf.append('"'); - buf.append(escapeQuotes(str)); - buf.append('"\n'); - } - return buf.toString(); -}; - -/** - * Adds a new location to this Message instance. - * @param {String} filePath The path to the file this message - * is located in. - * @param {Number} lineNum The line number at which this message - * was found at - */ -Message.prototype.addLocation = function(filePath, lineNum) { - this.locations.push(filePath + ":" + lineNum); -}; - -/** - * Writes this Message instance as .po compatible string to - * the StringBuffer passed as argument. - * @param {java.lang.StringBuffer} buf The StringBuffer instance - * to write into - */ -Message.prototype.write = function(buf) { - for (var i=0;i -1 - || (this.pluralId != null && this.pluralId.indexOf("{") > -1)) { - buf.append("#, java-format\n"); - } - buf.append('msgid '); - buf.append(Message.formatId(this.id)); - if (this.pluralId != null) { - buf.append('msgid_plural '); - buf.append(Message.formatId(this.pluralId)); - buf.append('msgstr[0] ""\nmsgstr[1] ""\n') - } else { - buf.append('msgstr ""\n') - } - buf.append("\n"); - return; -}; - -/** - * @constructor - */ -var MessageParser = function() { - this.messages = {}; - return this; -}; - -/** - * Object containing the accepted function names, currently - * supported are "gettext", "ngettext" and "_". This is used - * as a lookup map during function file parsing. - * @type Object - */ -MessageParser.FUNCTION_NAMES = { - "_": true, - "gettext": true, - "ngettext": true, - "markgettext": true, - "cgettext": true -}; - -/** - * The name of the gettext macro - * @type String - */ -MessageParser.MACRO_NAME = "message"; - -/** - * The name of the macro attribute that will be interpreted - * as gettext attribute. - * @type String - */ -MessageParser.ATTRIBUTE_NAME = MessageParser.MACRO_NAME; - -/** - * A regular expression for parsing macros in a skin. The result - * of this regular expression contains: - * result[1] = macro handler name (can be empty for global macros) - * result[2] = macro name - * result[3] = the macro's attributes - * @type RegExp - */ -MessageParser.REGEX_MACRO = /<%\s*(?:([\w]+)\.)?([\w]+)\s+([^%]+?)\s*%>/gm; - -/** - * A regular expression for parsing the attributes of a macro. The result - * of this regular expression contains: - * result[1] = attribute name - * result[2] = attribute value - * @type RegExp - */ -MessageParser.REGEX_PARAM = /([\w]*)\s*=\s*["'](.*?)["']\s*(?=\w+=|$)/gm; - -/** - * Calculates the line number in the string passed as argument - * at which the specified index position is located. - * @param {String} str The source string - * @param {Number} idx The index position to get the line number for. - * @returns The line number of the index position in the source string. - * @type Number - */ -MessageParser.getLineNum = function(str, idx) { - return str.substring(0, idx).split(/.*(?:\r\n|\n\r|\r|\n)/).length; -}; - -/** - * Parses the file passed as argument. If the file - * is a directory, this method recurses down the directory - * tree and parses all skin and function files. - * @param {java.io.File} file The file or directory to start at. - * @param {String} encoding The encoding to use - */ -MessageParser.prototype.parse = function(file, encoding) { - if (file.isDirectory()) { - var list = file.list(); - for (var i=0;i -1) { - switch (String(fName.substring(dotIdx+1))) { - case "skin": - print("Parsing skin file " + file.getCanonicalPath() + "..."); - this.parseSkinFile(file, encoding); - break; - case "hac": - case "js": - print("Parsing function file " + file.getCanonicalPath() + "..."); - this.parseFunctionFile(file, encoding); - break; - default: - break; - } - } - } - return; -}; - -/** @ignore */ -MessageParser.prototype.toString = function() { - return "[Jala Message Parser]"; -}; - -/** - * Parses a .js file and creates Message instances for all - * calls of "gettext", "ngettext", "markgettext" and "_". - * @param {java.io.File} file The function file to parse - * @param {String} encoding The encoding to use - */ -MessageParser.prototype.parseFunctionFile = function(file, encoding) { - var fis = new java.io.FileInputStream(file); - var isr = new java.io.InputStreamReader(fis, encoding || "UTF-8"); - var reader = new java.io.BufferedReader(isr); - var tokenizer = new java.io.StreamTokenizer(reader); - var messages = [], stack = []; - var c; - while ((c = tokenizer.nextToken()) != java.io.StreamTokenizer.TT_EOF) { - switch (c) { - case java.io.StreamTokenizer.TT_WORD: - if (MessageParser.FUNCTION_NAMES[tokenizer.sval] == true) { - stack.push({name: tokenizer.sval, lineNr: tokenizer.lineno()}); - } else if (stack.length > 0) { - // it's something else than a string argument inside a gettext method call - // so finalize the argument parsing here as we aren't interested in that - messages.push(stack.pop()); - } - break; - case java.io.StreamTokenizer.TT_NUMBER: - break; - default: - if (stack.length > 0) { - if ("\u0028".charCodeAt(0) == c) { - // start of arguments (an opening bracket) - stack[stack.length-1].args = []; - } else if ("\u0029".charCodeAt(0) == c) { - // end of arguments (a closing bracket) - messages.push(stack.pop()); - } else if ("\u0022".charCodeAt(0) == c || "\u0027".charCodeAt(0) == c) { - // a quoted string argument - stack[stack.length-1].args.push(tokenizer.sval); - } - } - break; - } - } - if (messages.length > 0) { - var msgParam, key, msg; - for (var i=0;i 0) { - if (msgParam.name === "cgettext" || msgParam.name === "markgettext") { - msgParam.args[0] = cgettext.getKey(msgParam.args[0], msgParam.args[1]); - delete msgParam.args[1]; - } - key = Message.getKey(msgParam.args[0]); - if (!(msg = this.messages[key])) { - this.messages[key] = msg = new Message(msgParam.args[0], msgParam.args[1]); - } - if (!msg.pluralId && msgParam.args.length > 1) { - msg.pluralId = msgParam.args[1]; - } - msg.addLocation(file.getCanonicalPath(), msgParam.lineNr); - } - } - } - fis.close(); - isr.close(); - reader.close(); - return; -}; - -/** - * ================================================= - * FIXME: This is a patched version of the method in - * jala/util/HopKit/scripts/MessageParser.js - * It needs skin/macro introspection features enabled - * in Helma. See also the file Skin.java.patch. - * ================================================== - * Parses a skin file and creates Message instances for - * all macros which name is either "message" or - * that have attributes named "message" and optional - * "plural" - * @param {java.io.File} file The skin file to parse - * @param {String} encoding The encoding to use - */ -MessageParser.prototype.parseSkinFile = function(file, encoding) { - var self = this; - var source = readFile(file.getAbsolutePath(), encoding || "UTF-8"); - - var checkNestedMacros = function(iterator) { - var macros = []; - while (iterator.hasNext()) { - macro = iterator.next(); - if (macro && macro.constructor !== String) { - macros.push(macro); - } - } - processMacros(macros); - } - - var processMacros = function(macros) { - var re = gettext_macro.REGEX; - var id, pluralId, name, args, param, key, msg; - for each (var macro in macros) { - id = pluralId = null; - name = macro.getName(); - param = macro.getNamedParams(); - if (param) { - checkNestedMacros(param.values().iterator()); - if (name === MessageParser.MACRO_NAME) { - id = param.get("text"); - pluralId = param.get("plural"); - } else if (param.containsKey("message") === MessageParser.ATTRIBUTE_NAME) { - id = param.get("message"); - pluralId = param.get("plural"); - } - } - args = macro.getPositionalParams(); - if (args) { - checkNestedMacros(args.iterator()); - if (name === "gettext" || name === "markgettext") { - id = cgettext.getKey(args.get(0), param && param.get("context")); - } else if (name === "ngettext") { - id = args.get(0); - pluralId = args.get(1); - } - } - if (id != null) { - if (id.constructor !== String) { - continue; - } - // create new Message instance or update the existing one - id = id.replace(re, String.SPACE); - pluralId && (pluralId = pluralId.replace(re, String.SPACE)); - key = Message.getKey(id); - if (!(msg = self.messages[key])) { - self.messages[key] = msg = new Message(id, pluralId, file.getCanonicalPath()); - } - msg.addLocation(file.getCanonicalPath(), MessageParser.getLineNum(source, macro.start)); - } - } - } - - var skin = createSkin(source); - if (skin.hasMainskin()) { - processMacros(skin.getMacros()); - } - for each (var name in skin.getSubskinNames()) { - var subskin = skin.getSubskin(name); - processMacros(subskin.getMacros()); - } - return; -} - -/** - * FIXME: Patched with adequate header data - * Prints a standard Header of a .po file - * FIXME: why the hell is Plural-Forms ignored in poEdit? - * @see http://drupal.org/node/17564 - */ -MessageParser.prototype.getPotString = function() { - var date = new Date; - var buf = new java.lang.StringBuffer(); - buf.append('#\n'); - buf.append('# The Antville Project\n'); - buf.append('# http://code.google.com/p/antville\n'); - buf.append('#\n'); - buf.append('# Copyright 2001-' + date.getFullYear() + ' by the Workers of Antville.\n'); - buf.append('#\n'); - buf.append("# Licensed under the Apache License, Version 2.0 (the ``License''\n"); - buf.append('# you may not use this file except in compliance with the License.\n'); - buf.append('# You may obtain a copy of the License at\n'); - buf.append('#\n'); - buf.append('# http://www.apache.org/licenses/LICENSE-2.0\n'); - buf.append('#\n'); - buf.append('# Unless required by applicable law or agreed to in writing, software\n'); - buf.append("# distributed under the License is distributed on an ``AS IS'' BASIS,\n"); - buf.append('# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n'); - buf.append('# See the License for the specific language governing permissions and\n'); - buf.append('# limitations under the License.\n'); - buf.append('#\n\n'); - buf.append('#, fuzzy\n'); - buf.append('msgid ""\n'); - buf.append('msgstr ""\n'); - buf.append('"Project-Id-Version: Antville-' + Root.VERSION + '\\n"\n'); - buf.append('"Report-Msgid-Bugs-To: mail@antville.org\\n"\n'); - var sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mmZ"); - buf.append('"POT-Creation-Date: ' + sdf.format(new java.util.Date()) + '\\n"\n'); - buf.append('"PO-Revision-Date: ' + sdf.format(new java.util.Date()) + '\\n"\n'); - //buf.append('"Last-Translator: FULL NAME \\n"\n'); - buf.append('"Language-Team: The Antville People \\n"\n'); - buf.append('"MIME-Version: 1.0\\n"\n'); - buf.append('"Content-Type: text/plain; charset=utf-8\\n"\n'); - buf.append('"Content-Transfer-Encoding: 8bit\\n"\n'); - buf.append('"Plural-Forms: nplurals=2; plural=(n != 1);\\n"\n'); - buf.append('\n'); - - // sort all messages by their singular key - var keys = []; - for (var i in this.messages) { - keys[keys.length] = this.messages[i].id; - } - keys.sort(); - // add all the messages - for (var i=0;ijava -cp rhino.jar org.mozilla.javascript.tools.shell.Main PoParser.js [namespace] - * - * The accepted arguments are: - *
    - *
  • input: Either a single .po file or a directory containing multiple files
  • - *
  • output: The directory where to put the generated message files
  • - *
  • namespace: An optional namespace in which the generated message object will reside - * (eg. if the namespace is called "jala", the messages will be stored in global.jala.messages)
  • - *
- */ - - -/** - * Constructs a new PoParser instance. - * @class Instances of this class can generate JavaScript message files out - * of GNU Gettext .po files for use with jala.I18n (and possibly other internationalization - * environments too). - * @param {String} handler An optional namespace where the parsed messages should be stored - * @returns A newly created instance of PoParser - * @constructor - */ -var PoParser = function(namespace) { - /** - * An array containing the parsed messages - * @type Array - */ - this.messages = []; - - /** - * The locale key string (eg. "de_AT") of the .po file - * @type String - */ - this.localeKey = null; - - /** - * The namespace (optional) where to store the generated messages - * @type String - */ - this.namespace = namespace; - return this; -}; - -/** - * A regular expression for splitting the contents of a .po file into - * single lines - * @type RegExp - */ -PoParser.REGEX_LINES = /\r\n|\r|\n|\u0085|\u2028|\u2029/; - -/** - * A regular expression for parsing singular message keys - * @type RegExp - */ -PoParser.REGEX_MSGID = /^\s*msgid(?!_plural)\s+\"(.*)\"\s*$/; - -/** - * A regular expression for parsing plural message keys - * @type RegExp - */ -PoParser.REGEX_MSGID_PLURAL = /^\s*msgid_plural\s+\"(.*)\"\s*$/; - -/** - * A regular expression for parsing message key continuations - * @type RegExp - */ -PoParser.REGEX_MSG_CONT = /^\s*\"(.*)\"\s*$/; - -/** - * A regular expression for parsing a message translation - * @type RegExp - */ -PoParser.REGEX_MSGSTR = /^\s*msgstr(?:\[(\d)\])?\s+\"(.*)\"\s*$/; - -/** - * A regular expression used to detect lines other than whitespace - * and comments - * @type RegExp - */ -PoParser.REGEX_DATA = /^\s*msg/; - -PoParser.isData = function(str) { - return PoParser.REGEX_DATA.test(str); -}; - -/** - * Reads the file passed as argument, assuming that it is UTF-8 encoded - * @param {java.io.File} file The file to read - * @returns The contents of the file - * @type java.lang.String - */ -PoParser.readFile = function(file) { - var inStream = new java.io.InputStreamReader(new java.io.FileInputStream(file), "UTF-8"); - var buffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 2048); - var read = 0; - var r = 0; - while ((r = inStream.read(buffer, read, buffer.length - read)) > -1) { - read += r; - if (read == buffer.length) { - // grow input buffer - var newBuffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, buffer.length * 2); - java.lang.System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); - buffer = newBuffer; - } - } - inStream.close(); - return new java.lang.String(buffer, 0, read); -} - -/** - * Parses the PO file passed as argument into the messages array - * of this PoParser instance. - * @param {java.io.File} file The .po file to parse - */ -PoParser.prototype.parse = function(file) { - // parse the locale key out of the file name - var fileName = file.getName(); - if (!(this.localeKey = fileName.substring(0, fileName.indexOf(".")))) { - throw "Invalid PO file name: " + fileName; - } - - // read the PO file content and parse it into messages - var content = PoParser.readFile(file); - var start = new Date(); - var lines = content.split(PoParser.REGEX_LINES); - var idx = -1; - var line = null; - var m, value, nr; - var msg; - - var hasMoreLines = function() { - return idx < lines.length - 1; - }; - - var nextLine = function() { - return (line = lines[idx += 1]) != null; - }; - - var getContinuation = function(str) { - var nLine; - while ((nLine = lines[idx + 1]) != null) { - if ((m = nLine.match(PoParser.REGEX_MSG_CONT)) != null) { - str += m[1]; - nextLine(); - } else { - break; - } - } - return str; - } - - while (nextLine()) { - if ((m = line.match(PoParser.REGEX_MSGID)) != null) { - value = getContinuation(m[1]); - if (value) { - msg = this.messages[this.messages.length] = new Message(value); - } - } else if ((m = line.match(PoParser.REGEX_MSGID_PLURAL)) != null) { - value = getContinuation(m[1]); - if (value && msg != null) { - msg.pluralKey = value; - } - } else if ((m = line.match(PoParser.REGEX_MSGSTR)) != null) { - nr = m[1]; - value = getContinuation(m[2]); - if (value && msg != null) { - nr = parseInt(nr, 10); - msg.translations[nr || 0] = value; - } - } - } - return; -}; - -/** - * Converts the array containing the parsed messages into a message - * catalog script file and saves it on disk. - * @param {java.io.File} outputDir The directory where the message - * file should be saved - */ -PoParser.prototype.writeToFile = function(output) { - var buf = new java.lang.StringBuffer(); - // write header - buf.append('/**\n'); - buf.append(' * Instantiate the messages namespace if it\'s not already existing\n'); - buf.append(' */\n'); - var objPath = ""; - if (this.namespace) { - objPath += this.namespace; - buf.append('if (!global.' + objPath + ') {\n'); - buf.append(' global.' + objPath + ' = {};\n'); - buf.append('}\n'); - objPath += "."; - } - objPath += "messages"; - buf.append('if (!global.' + objPath + ') {\n'); - buf.append(' global.' + objPath + ' = {};\n'); - buf.append('}\n\n'); - - buf.append('/**\n'); - buf.append(' * Messages for locale "' + this.localeKey + '"\n'); - buf.append(' */\n'); - var fname = objPath + "." + this.localeKey + ".js"; - objPath += "['" + this.localeKey + "']"; - buf.append('global.' + objPath + ' = {\n'); - // write messages - for (var i=0;i [namespace]"); - print(": Either a single .po file or a directory containing .po files"); - print(": The directory where the generated messages files should be stored"); - print("[namespace]: An optional global namespace where the messages should be"); - print(" stored (eg. a namespace like 'jala' will lead to messages"); - print(" stored in global.jala.messages by their locale."); - quit(); -} - -var input = new java.io.File(arguments[0]); -var output = new java.io.File(arguments[1]); -var namespace = arguments[2]; - -// check if the output destination is a directory -if (output.isFile()) { - print("Invalid arguments: the output destination must be a directory."); - quit(); -} - -if (namespace && namespace.indexOf(".") != -1) { - print("Invalid arguments: Please don't specify complex object paths, as this"); - print("would corrupt the messages file."); - quit(); -} - -// parse the PO file(s) and create the message catalog files -var parser; -if (input.isDirectory()) { - var files = input.listFiles(); - var file; - for (var i=0;i 0) { - return; - } - var href = String($(element).find('a').attr('href')) + location.hash; - var index = location.href.lastIndexOf(href); - if (href && index > -1 && index + href.length === location.href.length) { - $(element).addClass('uk-active'); - counter += 1; - } - }); - - // Prevent redundant submits of a form - $('form').one('submit', function (event) { - var submit = $(this).find('[type=submit]'); - setTimeout(function () { - submit.attr('disabled', true); - }, 1); - }); - - // Show prompt to copy macro code - $('a.av-clipboard-copy').on('click', function (event) { - event.preventDefault(); - prompt($(this).data('text'), $(this).data('value')); - }); - - // Select the macro code when clicking on elements with the macro-code class. - // FIXME: Obsolete (should move to compat layer) - $('.macro-code').click(function(event) { - $(this).selectText(); - }); - - // Compatibility: Go back when cancel link is clicked - $('a.cancel').on('click', function (event) { - event.preventDefault(); - history.back() - }); - - // Add the skin controls for the layout sandbox - /*$('body').prepend($('
').attr('class', 'layout-sandbox') - .append($('
') - .append($('
'; + + document.body.appendChild(html); + + const modal = UIkit.modal('#uk-modal'); + + document.addEventListener('show-modal', function() { + document.style.paddingRight = ''; + modal.show(); + }); + + document.addEventListener('hide-modal', function() { + modal.hide(); + }); +}; diff --git a/claustra/construction/Construction/Construction.js b/claustra/construction/Construction/Construction.js new file mode 100644 index 00000000..e58af8fd --- /dev/null +++ b/claustra/construction/Construction/Construction.js @@ -0,0 +1,3 @@ +Construction.prototype.main = function () { + this.renderSkin('$Construction#main'); +}; diff --git a/claustra/construction/README.md b/claustra/construction/README.md new file mode 100644 index 00000000..a93c7bf7 --- /dev/null +++ b/claustra/construction/README.md @@ -0,0 +1,16 @@ +# The Construction Claustra + +The Antville Construction Claustra just adds a simple graphical ornament to each Antville page warning that the data of this installation might not be persisting. + +This comes in handy e.g. for testing your Antville installation. + +## Installation + +Enable the Claustra in your application’s `app.properties` file: + +```properties +# Multiple claustra can be enabled comma-separated +claustra = construction +``` + +That’s it – there is no further configuration or setup necessary. diff --git a/claustra/proxy/Claustra/Claustra.properties b/claustra/proxy/Claustra/Claustra.properties new file mode 100644 index 00000000..761e7a4e --- /dev/null +++ b/claustra/proxy/Claustra/Claustra.properties @@ -0,0 +1 @@ +proxy = mountpoint(Proxy) diff --git a/claustra/proxy/Proxy/Proxy.js b/claustra/proxy/Proxy/Proxy.js new file mode 100644 index 00000000..effe0a80 --- /dev/null +++ b/claustra/proxy/Proxy/Proxy.js @@ -0,0 +1,68 @@ +// The Antville Project +// http://code.google.com/p/antville +// +// Copyright 2001–2014 by the Workers of Antville. +// +// 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. + +/** + * @fileoverview Defines the Antville proxy Feature. + */ + +Proxy.prototype.main_action = function () { + const url = req.data.url; + + if (!url) return res.status = 400; + + const callback = req.data.callback; + const http = new helma.Http(); + + http.setBinaryMode(true); + + http.setHeader('Accept', '*/*'); + http.setHeader('Accept-Encoding', 'gzip'); + http.setHeader('Cache-Control', 'no-cache'); + http.setHeader('Pragma', 'no-cache'); + http.setHeader('User-Agent', req.data.http_browser); + + const data = http.getUrl(url); + + if (!data.content) { + throw Error('Failed to retrieve URL.'); + } + + if (callback) { + res.contentType = 'application/javascript'; + + let content = new java.lang.String(data.content, 'utf-8'); + + if (!data.type.startsWith('text/')) { + content = new java.lang.String(content.enbase64()); + } + + // The String() call prevents stack overflow + res.write(JSON.pad({ content: String(content) }, callback)); + } else { + res.contentType = data.type; + + if (data.type.startsWith('text/')) { + res.write(java.lang.String(data.content, 'utf-8')); + } else { + res.writeBinary(data.content); + } + } +}; + +Proxy.prototype.getPermission = function() { + return User.require(User.REGULAR); +}; diff --git a/claustra/proxy/README.md b/claustra/proxy/README.md new file mode 100644 index 00000000..f9b0fd47 --- /dev/null +++ b/claustra/proxy/README.md @@ -0,0 +1,34 @@ +# The Proxy Claustra + +The Antville Proxy Claustra allows to retrieve URLs via HTTP from outside Antville’s domain, e.g. for fetching site content with JavaScript. + +It is required for using the Formica bookmarklet available from the settings of each Antville site. + +## Installation + +Enable the Claustra in your application’s `app.properties` file: + +```properties +# Multiple claustra can be enabled comma-separated +claustra = proxy +``` + +## Usage + +To use the proxy you must be logged in to the corresponding Antville installation. + +It is available under the path `/claustra/proxy`, e.g. under the URL `http://localhost:8080/claustra/proxy`. + +Use the `url` query parameter to retrieve a URL via the Proxy Claustra: + +```sh +curl -G --data-urlencode 'url=https://postman-echo.com/time/now' 'http://localhost:8080/claustra/proxy' +Fri, 24 Apr 2020 19:00:43 GMT +``` + +The proxy also supports JSONP requests simply by appending the `callback` query parameter: + +```sh +curl -G --data-urlencode 'url=https://postman-echo.com/time/now' 'http://localhost:8080/claustra/proxy?callback=evaluate' +evaluate({"content":"Fri, 24 Apr 2020 19:00:43 GMT"}); +``` diff --git a/code/Admin/$Admin.skin b/code/Admin/$Admin.skin index 6283eed7..7f87e678 100644 --- a/code/Admin/$Admin.skin +++ b/code/Admin/$Admin.skin @@ -46,13 +46,46 @@
+ <% gettext 'Registration & Login' %> +
+ +
+ <% root.select loginScope %> +
+
+
+ +
+ <% root.input termsStory class=uk-width-1-4 pattern="[a-zA-Z0-9]+/[0-9]+" placeholder=<% gettext "e.g. {0}" www/12345 %> %> + + + +
+
+
+ +
+ <% root.input privacyStory class=uk-width-1-4 pattern="[a-zA-Z0-9]+/[0-9]+" placeholder=<% gettext "e.g. {0}" www/12345 %> %> + + + +
+
+
+
<% gettext 'Site Creation' %>
- <% root.select creationScope %> + <% root.select creationScope x-model='creationScope' %>
@@ -60,7 +93,7 @@ <% gettext 'Probation Period' %>
- <% root.input probationPeriod class=uk-width-1-6 type=number min=0 %> <% gettext days %> + <% root.input probationPeriod class=uk-width-1-6 type=number min=0 :disabled="creationScope !== 'regular'" %> <% gettext days %>
@@ -68,18 +101,18 @@ <% gettext Interval %>
- <% root.input creationDelay class=uk-width-1-6 type=number min=0 %> <% gettext days %> + <% root.input creationDelay class=uk-width-1-6 type=number min=0 :disabled="creationScope !== 'regular'" %> <% gettext days %>
-
+
<% gettext 'Site Phase-Out' %>
- <% root.select phaseOutMode %> + <% root.select phaseOutMode x-model='phaseOutMode' %>
@@ -87,7 +120,7 @@ <% gettext 'Notification Period' %>
- <% root.input phaseOutNotificationPeriod class=uk-width-1-6 type=number min=1 %> <% gettext days %> + <% root.input phaseOutNotificationPeriod class=uk-width-1-6 type=number min=1 :disabled="phaseOutMode === 'disabled'" %> <% gettext days %>
@@ -95,7 +128,7 @@ <% gettext 'Grace Period' %>
- <% root.input phaseOutGracePeriod class=uk-width-1-6 type=number min=1 %> <% gettext days %> + <% root.input phaseOutGracePeriod class=uk-width-1-6 type=number min=1 :disabled="phaseOutMode === 'disabled'" %> <% gettext days %>
@@ -106,18 +139,6 @@ <% gettext Cancel %> - <% #activities %>

<% response.title %>

@@ -174,7 +195,7 @@
<% gettext '{0} sites sorted by {1} in {2} order.' - <% admin.dropdown name="display" <% markgettext all %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext open %> <% markgettext restricted %> <% markgettext public %> <% markgettext closed %> <% markgettext deleted %> %> + <% admin.dropdown name="display" <% markgettext all %> <% markgettext deleted %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext open %> <% markgettext restricted %> <% markgettext public %> <% markgettext closed %> %> <% admin.dropdown name="sorting" <% markgettext modified %> <% markgettext created %> <% markgettext name %> %> <% admin.dropdown name="order" <% markgettext descending %> <% markgettext ascending %> %> %> @@ -220,7 +241,7 @@
<% gettext '{0} accounts sorted by {1} in {2} order.' - <% admin.dropdown name="display" <% markgettext all %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext privileged %> %> + <% admin.dropdown name="display" <% markgettext all %> <% markgettext deleted %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext privileged %> %> <% admin.dropdown name="sorting" <% markgettext Registration %> <% markgettext 'last login' %> <% markgettext Name %> %> <% admin.dropdown name="order" <% markgettext descending %> <% markgettext ascending %> %> %> @@ -263,8 +284,10 @@ + + @@ -336,19 +359,37 @@ - +<% #timelineItem %> + + + + + + + <% #job %> + + - + <% #blockedSite %> @@ -358,7 +399,7 @@
<% gettext Trusted %>
<% #deletedSite %> - +
<% gettext Deleted %>
<% #closedSite %> @@ -369,6 +410,9 @@ <% #openSite %> +<% #deletedUser %> +
<% gettext Deleted %>
+ <% #blockedUser %>
<% gettext Blocked %>
diff --git a/code/Admin/Admin.js b/code/Admin/Admin.js index a13efaf3..59c27b28 100644 --- a/code/Admin/Admin.js +++ b/code/Admin/Admin.js @@ -23,7 +23,6 @@ markgettext('export'); markgettext('import'); markgettext('remove'); -Admin.SITEREMOVALGRACEPERIOD = 14; // days Admin.MAXBATCHSIZE = 50; /** @@ -34,8 +33,9 @@ Admin.MAXBATCHSIZE = 50; * @constructor */ Admin.Job = function(target, method, user) { - var file; - user || (user = session.user); + if (!user) user = session.user; + + var file, date; this.__defineGetter__('target', function() { return target; @@ -53,6 +53,10 @@ Admin.Job = function(target, method, user) { return file.getName(); }); + this.__defineGetter__('date', function() { + return date; + }); + this.remove = function(isCareless) { // isCareless is `true` after a site is completely removed, to prevent NullPointer exception if (!isCareless) target.job = null; @@ -69,6 +73,7 @@ Admin.Job = function(target, method, user) { target = global[data.type].getById(data.id); method = data.method; user = User.getById(data.user); + date = new Date(file.lastModified()); } } else { throw Error('Insufficient arguments'); @@ -102,6 +107,13 @@ Admin.getPhaseOutModes = defineConstants(Admin, markgettext('Disabled'), markget */ Admin.getCreationScopes = defineConstants(Admin, markgettext('Privileged'), markgettext('Trusted'), markgettext('Regular')); +/** + * @function + * @returns {String[]} + * @see defineConstants + */ +Admin.getLoginScopes = defineConstants(Admin, markgettext('Privileged'), markgettext('Trusted'), markgettext('Regular'), markgettext('None')); + /** * Convenience method for easily queueing jobs. * @param {HopObject} target @@ -125,16 +137,17 @@ Admin.queue.dir.exists() || Admin.queue.dir.mkdirs(); * */ Admin.dequeue = function() { - var jobs = Admin.queue.dir.list(); + var jobs = Admin.getJobs('desc'); var max = Math.min(jobs.length, Admin.MAXBATCHSIZE); for (let i=0; i { + return (a.lastModified() - b.lastModified()) * (sort === 'asc' ? -1 : 1); + }); +}; + +Admin.purgeAccounts = function() { + var now = Date.now(); + + root.admin.deletedUsers.forEach(function() { + if (this.job || this.deleted) return; // already gone + this.job = Admin.queue(this, 'remove', this); + }); +}; + Admin.purgeSites = function() { var now = new Date; root.admin.deletedSites.forEach(function() { - if (now - this.deleted > Date.ONEDAY * Admin.SITEREMOVALGRACEPERIOD) { - if (this.job) { - return; // Site is already scheduled for deletion - } - this.job = Admin.queue(this, 'remove', this.modifier); - } + if (this.job) return; + this.job = Admin.queue(this, 'remove', this.modifier); }); var notificationPeriod = root.phaseOutNotificationPeriod * Date.ONEDAY; @@ -177,7 +199,7 @@ Admin.purgeSites = function() { return; } var age = now - (this.stories.size() > 0 ? - this.stories.get(0).modified : this.created); + this.stories.get(0).modified : this.modified); if (age - notificationPeriod > 0) { if (!this.notified) { var site = res.handlers.site = this; @@ -189,7 +211,7 @@ Admin.purgeSites = function() { }); this.notified = now; } else if (now - this.notified > gracePeriod) { - this.mode = Site.DELETED; + this.status = Site.DELETED; this.deleted = now; this.notified = null; } @@ -277,13 +299,14 @@ Admin.commitEntries = function() { } // Only log unique combinations of context, ip and referrer - referrer = String(referrer); + referrer = Admin.resolveUrl(referrer); var key = item.context._prototype + '-' + item.context._id + ':' + item.ip + ':' + referrer; if (history.indexOf(key) > -1) { continue; } history.push(key); + item.referrer = referrer; // Exclude requests coming from the same site if (item.site) { @@ -370,6 +393,26 @@ Admin.updateDomains = function() { return; } +Admin.resolveUrl = function(url) { + var http = new helma.Http(); + http.setMethod('HEAD'); + http.setFollowRedirects(false); + + var response; + var location = url; + + while (location) { + try { + response = http.getUrl(location); + location = response.location; + } catch (error) { + location = null; + } + }; + + return String(response ? response.url : url); +}; + /** * The Admin prototype is mounted at root and provides actions needed * for system administration. A user needs the User.PRIVILEGED permission @@ -501,7 +544,7 @@ Admin.prototype.activity_action = function () { } Admin.prototype.jobs_action = function() { - var files = Admin.queue.dir.listFiles(); + var files = Admin.getJobs(); res.data.count = files.length; res.data.list = renderList(files, this.renderItem); res.data.title = gettext('Jobs'); @@ -512,9 +555,8 @@ Admin.prototype.jobs_action = function() { }; Admin.prototype.job_action = function () { - var site = Site.getById(req.data.delete); - if (site && site.job) { - var job = new Admin.Job(site.job); + if (req.data.name) { + const job = new Admin.Job(req.data.name); job.remove(); } return res.redirect(req.data.http_referer); @@ -568,13 +610,16 @@ Admin.prototype.update = function(data) { root.map({ creationScope: data.creationScope, creationDelay: data.creationDelay, - replyTo: data.replyTo, + loginScope: data.loginScope, notificationScope: data.notificationScope, phaseOutGracePeriod: data.phaseOutGracePeriod, phaseOutMode: data.phaseOutMode, phaseOutNotificationPeriod: data.phaseOutNotificationPeriod, + privacyStory: data.privacyStory, probationPeriod: data.probationPeriod, - quota: data.quota + quota: data.quota, + replyTo: data.replyTo, + termsStory: data.termsStory }); return; } @@ -588,12 +633,12 @@ Admin.prototype.filterSites = function(data) { var displays = { 1: "status = 'blocked'", - 2: "status = 'trusted'", - 3: "mode = 'open'", - 4: "mode = 'restricted'", - 5: "mode = 'public'", - 6: "mode = 'closed'", - 7: "mode = 'deleted'" + 2: "status = 'deleted'", + 3: "status = 'trusted'", + 4: "mode = 'open'", + 5: "mode = 'restricted'", + 6: "mode = 'public'", + 7: "mode = 'closed'" }; var sortings = { @@ -630,9 +675,10 @@ Admin.prototype.filterUsers = function(data) { data || (data = {}); var displays = { - 1: "status = 'blocked'", - 2: "status = 'trusted'", - 3: "status = 'privileged'" + 1: "status = 'deleted'", + 2: "status = 'blocked'", + 3: "status = 'trusted'", + 4: "status = 'privileged'" }; var sortings = { @@ -685,7 +731,9 @@ Admin.prototype.renderItem = function(item) { return; } -Admin.prototype.renderActivity = function (item) { +Admin.prototype.renderActivity = function (item, skin) { + if (!skin) skin = '$Admin#activity'; + var param = { item: item, icon: getIcon(item), @@ -694,11 +742,13 @@ Admin.prototype.renderActivity = function (item) { user: item.creator ? item.creator.name : item.name, href: item.href(item.constructor === User ? 'edit' : ''), linkCount: getLinkCount(item), - alert: getAlert(item) - //site: item.site && item.site.name + alert: getAlert(item), + site: (item.parent && item.parent.site || item.parent || item.site || {}).name }; + param.warn = param.linkCount > 2 ? true : false; - Admin.prototype.renderSkin('$Admin#activity', param); + + Admin.prototype.renderSkin(skin, param); function getReference(item) { switch (item.constructor) { @@ -754,7 +804,7 @@ Admin.prototype.renderActivity = function (item) { function getAlert(item) { switch (item.constructor) { case User: - return item.status !== User.BLOCKED && item.created - item.modified < 1; + return item.status !== User.BLOCKED && item.status !== User.DELETED && item.created - item.modified < 1; case Site: return item.status !== Site.DELETED && item.created - item.modified < 1; } @@ -782,7 +832,7 @@ Admin.prototype.log = function(context, action) { */ Admin.prototype.href_macro = function (param, action, id) { - res.write(this.href.apply(this, arguments)); + res.write(this.href.call(this, action, id)); return; }; @@ -849,7 +899,7 @@ Admin.prototype.link_macro = function (param, action, text, target) { switch (action) { case 'block': var user = target.creator || target; - if (user.status !== User.PRIVILEGED && user.status !== User.BLOCKED) { + if (user.status !== User.PRIVILEGED && user.status !== User.BLOCKED && user.status !== User.DELETED) { var url = user.href('block'); return renderLink.call(global, param, url, text || String.EMPTY, this); } @@ -857,7 +907,7 @@ Admin.prototype.link_macro = function (param, action, text, target) { case 'delete': var site = target.constructor === Site ? target : target.site; - if (site && site.getPermission(action) && site.mode !== Site.DELETED) { + if (site && site.getPermission(action) && site.status !== Site.DELETED) { var url = site.href('delete') + '?safemode'; return renderLink.call(global, param, url, text || String.EMPTY, this); } diff --git a/code/Admin/Admin.properties b/code/Admin/Admin.properties index d8a15ec8..ecdaaf1c 100644 --- a/code/Admin/Admin.properties +++ b/code/Admin/Admin.properties @@ -28,9 +28,14 @@ restrictedSites = collection(Site) restrictedSites.filter = mode = 'restricted' and status <> 'blocked' deletedSites = collection(Site) -deletedSites.filter = mode = 'deleted' +deletedSites.filter = status = 'deleted' deletedSites.order = modified desc users = collection(User) users.accessName = name users.order = created desc + +deletedUsers = collection(User) +deletedUsers.filter = status = 'deleted' +deletedUsers.order = modified desc + diff --git a/code/Comment/$Comment.skin b/code/Comment/$Comment.skin index 13181798..75196690 100644 --- a/code/Comment/$Comment.skin +++ b/code/Comment/$Comment.skin @@ -15,28 +15,11 @@ <% #delete %> -
- - -
- - -
+ - diff --git a/code/Comment/Comment.js b/code/Comment/Comment.js index 3065119c..ae034d95 100644 --- a/code/Comment/Comment.js +++ b/code/Comment/Comment.js @@ -23,6 +23,8 @@ markgettext('Comment'); markgettext('comment'); markgettext('a comment // accusative'); +Comment.HTML_WHITELIST = Packages.org.jsoup.safety.Whitelist.relaxed(); + /** * @see defineConstants */ @@ -192,11 +194,8 @@ Comment.prototype.filter_action = function () { * @param {Object} data */ Comment.prototype.update = function(data) { - if (!User.require(User.TRUSTED) && !Membership.require(Membership.CONTRIBUTOR)) { - var spec = { - allowedTags: node.sanitizeHtml.defaults.allowedTags.concat(['img']) - }; - data.text = data.text ? node.sanitizeHtml(data.text, spec) : String.EMPTY; + if (data.text && !User.require(User.TRUSTED) && !Membership.require(Membership.CONTRIBUTOR)) { + data.text = sanitizeHtml(data.text, Comment.HTML_WHITELIST); } if (!data.text) { @@ -214,14 +213,19 @@ Comment.prototype.update = function(data) { this.status = Comment.PENDING; } else if (delta > 50) { this.modified = new Date; + if (this.story.status !== Story.CLOSED) { this.site.modified = this.modified; } + // We need persistence for adding the callback - this.isTransient() && this.persist(); + if (this.isTransient()) this.persist(); + res.handlers.site.callback(this); + // Notification is sent in Story.comment_action() } + this.clearCache(); this.modifier = session.user; return; @@ -235,7 +239,7 @@ Comment.prototype.getConfirmText = function() { if (this.status === Comment.DELETED && size > 1) { return gettext('You are about to delete a comment thread consisting of {0} postings.', size); } - return gettext('You are about to delete a comment by user {0}.', this.creator.name); + return gettext('You are about to delete a comment by {0}.', this.creator.name); }; Comment.prototype.getConfirmExtra = function () { diff --git a/code/File/$File.skin b/code/File/$File.skin index 191e994c..697385fb 100644 --- a/code/File/$File.skin +++ b/code/File/$File.skin @@ -1,15 +1,15 @@ <% #listItem %>
+ - + - + - + - diff --git a/code/Global/$Global.skin b/code/Global/$Global.skin index e2259412..ab723503 100644 --- a/code/Global/$Global.skin +++ b/code/Global/$Global.skin @@ -31,38 +31,20 @@ -
- + + - <% #listItemFlag %>
+ class="listItemFlag"><% param.text %> <% #mailFooter %> diff --git a/code/Global/0.node.js b/code/Global/0.node.js deleted file mode 100644 index 68afa05b..00000000 --- a/code/Global/0.node.js +++ /dev/null @@ -1,25757 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o - * @license MIT - */ - -var base64 = require('base64-js') -var ieee754 = require('ieee754') -var isArray = require('is-array') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var kMaxLength = 0x3fffffff -var rootParent = {} - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Note: - * - * - Implementation must support adding new properties to `Uint8Array` instances. - * Firefox 4-29 lacked support, fixed in Firefox 30+. - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - * - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will - * get the Object implementation, which is slower but will work correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { - try { - var buf = new ArrayBuffer(0) - var arr = new Uint8Array(buf) - arr.foo = function () { return 42 } - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -})() - -/** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. - */ -function Buffer (subject, encoding, noZero) { - if (!(this instanceof Buffer)) - return new Buffer(subject, encoding, noZero) - - var type = typeof subject - - // Find the length - var length - if (type === 'number') { - length = +subject - } else if (type === 'string') { - length = Buffer.byteLength(subject, encoding) - } else if (type === 'object' && subject !== null) { // assume object is array-like - if (subject.type === 'Buffer' && isArray(subject.data)) - subject = subject.data - length = +subject.length - } else { - throw new TypeError('must start with number, buffer, array or string') - } - - if (length > kMaxLength) - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength.toString(16) + ' bytes') - - if (length < 0) - length = 0 - else - length >>>= 0 // Coerce to uint32. - - var self = this - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Preferred: Return an augmented `Uint8Array` instance for best performance - /*eslint-disable consistent-this */ - self = Buffer._augment(new Uint8Array(length)) - /*eslint-enable consistent-this */ - } else { - // Fallback: Return THIS instance of Buffer (created by `new`) - self.length = length - self._isBuffer = true - } - - var i - if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') { - // Speed optimization -- use set if we're copying from a typed array - self._set(subject) - } else if (isArrayish(subject)) { - // Treat array-ish objects as a byte array - if (Buffer.isBuffer(subject)) { - for (i = 0; i < length; i++) - self[i] = subject.readUInt8(i) - } else { - for (i = 0; i < length; i++) - self[i] = ((subject[i] % 256) + 256) % 256 - } - } else if (type === 'string') { - self.write(subject, 0, encoding) - } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { - for (i = 0; i < length; i++) { - self[i] = 0 - } - } - - if (length > 0 && length <= Buffer.poolSize) - self.parent = rootParent - - return self -} - -function SlowBuffer (subject, encoding, noZero) { - if (!(this instanceof SlowBuffer)) - return new SlowBuffer(subject, encoding, noZero) - - var buf = new Buffer(subject, encoding, noZero) - delete buf.parent - return buf -} - -Buffer.isBuffer = function (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) - throw new TypeError('Arguments must be Buffers') - - if (a === b) return 0 - - var x = a.length - var y = b.length - for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {} - if (i !== len) { - x = a[i] - y = b[i] - } - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'raw': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function (list, totalLength) { - if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') - - if (list.length === 0) { - return new Buffer(0) - } else if (list.length === 1) { - return list[0] - } - - var i - if (totalLength === undefined) { - totalLength = 0 - for (i = 0; i < list.length; i++) { - totalLength += list[i].length - } - } - - var buf = new Buffer(totalLength) - var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length - } - return buf -} - -Buffer.byteLength = function (str, encoding) { - var ret - str = str + '' - switch (encoding || 'utf8') { - case 'ascii': - case 'binary': - case 'raw': - ret = str.length - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = str.length * 2 - break - case 'hex': - ret = str.length >>> 1 - break - case 'utf8': - case 'utf-8': - ret = utf8ToBytes(str).length - break - case 'base64': - ret = base64ToBytes(str).length - break - default: - ret = str.length - } - return ret -} - -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - -// toString(encoding, start=0, end=buffer.length) -Buffer.prototype.toString = function (encoding, start, end) { - var loweredCase = false - - start = start >>> 0 - end = end === undefined || end === Infinity ? this.length : end >>> 0 - - if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'binary': - return binarySlice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) - throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.equals = function (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) - str += ' ... ' - } - return '' -} - -Buffer.prototype.compare = function (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) -} - -// `get` will be removed in Node 0.13+ -Buffer.prototype.get = function (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) -} - -// `set` will be removed in Node 0.13+ -Buffer.prototype.set = function (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; i++) { - var byte = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(byte)) throw new Error('Invalid hex string') - buf[offset + i] = byte - } - return i -} - -function utf8Write (buf, string, offset, length) { - var charsWritten = blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) - return charsWritten -} - -function asciiWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length) - return charsWritten -} - -function binaryWrite (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length) - return charsWritten -} - -function utf16leWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) - return charsWritten -} - -Buffer.prototype.write = function (string, offset, length, encoding) { - // Support both (string, offset, length, encoding) - // and the legacy (string, encoding, offset, length) - if (isFinite(offset)) { - if (!isFinite(length)) { - encoding = length - length = undefined - } - } else { // legacy - var swap = encoding - encoding = offset - offset = length - length = swap - } - - offset = Number(offset) || 0 - - if (length < 0 || offset < 0 || offset > this.length) - throw new RangeError('attempt to write outside buffer bounds') - - var remaining = this.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - encoding = String(encoding || 'utf8').toLowerCase() - - var ret - switch (encoding) { - case 'hex': - ret = hexWrite(this, string, offset, length) - break - case 'utf8': - case 'utf-8': - ret = utf8Write(this, string, offset, length) - break - case 'ascii': - ret = asciiWrite(this, string, offset, length) - break - case 'binary': - ret = binaryWrite(this, string, offset, length) - break - case 'base64': - ret = base64Write(this, string, offset, length) - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = utf16leWrite(this, string, offset, length) - break - default: - throw new TypeError('Unknown encoding: ' + encoding) - } - return ret -} - -Buffer.prototype.toJSON = function () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - var res = '' - var tmp = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - if (buf[i] <= 0x7F) { - res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) - tmp = '' - } else { - tmp += '%' + buf[i].toString(16) - } - } - - return res + decodeUtf8Char(tmp) -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function binarySlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; i++) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) - start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) - end = 0 - } else if (end > len) { - end = len - } - - if (end < start) - end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined, true) - for (var i = 0; i < sliceLen; i++) { - newBuf[i] = this[i + start] - } - } - - if (newBuf.length) - newBuf.parent = this.parent || this - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) - throw new RangeError('offset is not uint') - if (offset + ext > length) - throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) - val += this[offset + i] * mul - - return val -} - -Buffer.prototype.readUIntBE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) - val += this[offset + --byteLength] * mul - - return val -} - -Buffer.prototype.readUInt8 = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) - val += this[offset + i] * mul - mul *= 0x80 - - if (val >= mul) - val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) - val += this[offset + --i] * mul - mul *= 0x80 - - if (val >= mul) - val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) - return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') -} - -Buffer.prototype.writeUIntLE = function (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) - this[offset + i] = (value / mul) >>> 0 & 0xFF - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) - this[offset + i] = (value / mul) >>> 0 & 0xFF - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else objectWriteUInt16(this, value, offset, true) - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else objectWriteUInt16(this, value, offset, false) - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = value - } else objectWriteUInt32(this, value, offset, true) - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else objectWriteUInt32(this, value, offset, false) - return offset + 4 -} - -Buffer.prototype.writeIntLE = function (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkInt(this, - value, - offset, - byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1)) - } - - var i = 0 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkInt(this, - value, - offset, - byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1)) - } - - var i = byteLength - 1 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = value - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else objectWriteUInt16(this, value, offset, true) - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else objectWriteUInt16(this, value, offset, false) - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else objectWriteUInt32(this, value, offset, true) - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else objectWriteUInt32(this, value, offset, false) - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function (target, target_start, start, end) { - var self = this // source - - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (target_start >= target.length) target_start = target.length - if (!target_start) target_start = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || self.length === 0) return 0 - - // Fatal error conditions - if (target_start < 0) - throw new RangeError('targetStart out of bounds') - if (start < 0 || start >= self.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) - end = this.length - if (target.length - target_start < end - start) - end = target.length - target_start + start - - var len = end - start - - if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < len; i++) { - target[i + target_start] = this[i + start] - } - } else { - target._set(this.subarray(start, start + len), target_start) - } - - return len -} - -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length - - if (end < start) throw new RangeError('end < start') - - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return - - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') - - var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value - } - } else { - var bytes = utf8ToBytes(value.toString()) - var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] - } - } - - return this -} - -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - -// HELPER FUNCTIONS -// ================ - -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array get/set methods before overwriting - arr._get = arr.get - arr._set = arr.set - - // deprecated, will be removed in node 0.13+ - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - -var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function isArrayish (subject) { - return isArray(subject) || Buffer.isBuffer(subject) || - subject && typeof subject === 'object' && - typeof subject.length === 'number' -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - var i = 0 - - for (; i < length; i++) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (leadSurrogate) { - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } else { - // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - leadSurrogate = null - } - } else { - // no lead yet - - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else { - // valid lead - leadSurrogate = codePoint - continue - } - } - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = null - } - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x200000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; i++) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; i++) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) - break - dst[i + offset] = src[i] - } - return i -} - -function decodeUtf8Char (str) { - try { - return decodeURIComponent(str) - } catch (err) { - return String.fromCharCode(0xFFFD) // UTF 8 invalid char - } -} - -},{"base64-js":5,"ieee754":6,"is-array":7}],5:[function(require,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -;(function (exports) { - 'use strict'; - - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],6:[function(require,module,exports){ -exports.read = function(buffer, offset, isLE, mLen, nBytes) { - var e, m, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = isLE ? (nBytes - 1) : 0, - d = isLE ? -1 : 1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); -}; - -exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = isLE ? 0 : (nBytes - 1), - d = isLE ? 1 : -1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); - - buffer[offset + i - d] |= s * 128; -}; - -},{}],7:[function(require,module,exports){ - -/** - * isArray - */ - -var isArray = Array.isArray; - -/** - * toString - */ - -var str = Object.prototype.toString; - -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ - -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; - -},{}],8:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; -}; - -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } - throw TypeError('Uncaught, unspecified "error" event.'); - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - handler.apply(this, args); - } - } else if (isObject(handler)) { - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; -}; - -EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - var m; - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } - - return this; -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; -}; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } - - if (this._events.removeListener) - this.emit('removeListener', type, listener); - } - - return this; -}; - -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; - - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; - - return this; -}; - -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; -}; - -EventEmitter.listenerCount = function(emitter, type) { - var ret; - if (!emitter._events || !emitter._events[type]) - ret = 0; - else if (isFunction(emitter._events[type])) - ret = 1; - else - ret = emitter._events[type].length; - return ret; -}; - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} - -function isUndefined(arg) { - return arg === void 0; -} - -},{}],9:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],10:[function(require,module,exports){ -module.exports = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]'; -}; - -},{}],11:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; - -function drainQueue() { - if (draining) { - return; - } - draining = true; - var currentQueue; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - var i = -1; - while (++i < len) { - currentQueue[i](); - } - len = queue.length; - } - draining = false; -} -process.nextTick = function (fun) { - queue.push(fun); - if (!draining) { - setTimeout(drainQueue, 0); - } -}; - -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -// TODO(shtylman) -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],12:[function(require,module,exports){ -module.exports = require("./lib/_stream_duplex.js") - -},{"./lib/_stream_duplex.js":13}],13:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - -module.exports = Duplex; - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; -} -/**/ - - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); - -util.inherits(Duplex, Readable); - -forEach(objectKeys(Writable.prototype), function(method) { - if (!Duplex.prototype[method]) - Duplex.prototype[method] = Writable.prototype[method]; -}); - -function Duplex(options) { - if (!(this instanceof Duplex)) - return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) - this.readable = false; - - if (options && options.writable === false) - this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) - this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) - return; - - // no more data can be written. - // But allow more writes to happen in this tick. - process.nextTick(this.end.bind(this)); -} - -function forEach (xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -}).call(this,require('_process')) - -},{"./_stream_readable":15,"./_stream_writable":17,"_process":11,"core-util-is":18,"inherits":9}],14:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - -module.exports = PassThrough; - -var Transform = require('./_stream_transform'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) - return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function(chunk, encoding, cb) { - cb(null, chunk); -}; - -},{"./_stream_transform":16,"core-util-is":18,"inherits":9}],15:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -module.exports = Readable; - -/**/ -var isArray = require('isarray'); -/**/ - - -/**/ -var Buffer = require('buffer').Buffer; -/**/ - -Readable.ReadableState = ReadableState; - -var EE = require('events').EventEmitter; - -/**/ -if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -var Stream = require('stream'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var StringDecoder; - -util.inherits(Readable, Stream); - -function ReadableState(options, stream) { - options = options || {}; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; - - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; - - this.buffer = []; - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = false; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // In streams that never have any data, and do push(null) right away, - // the consumer can miss the 'end' event if they do some I/O before - // consuming the stream. So, we don't emit('end') until some reading - // happens. - this.calledRead = false; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, becuase any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - if (!(this instanceof Readable)) - return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - Stream.call(this); -} - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function(chunk, encoding) { - var state = this._readableState; - - if (typeof chunk === 'string' && !state.objectMode) { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = new Buffer(chunk, encoding); - encoding = ''; - } - } - - return readableAddChunk(this, state, chunk, encoding, false); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function(chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); -}; - -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (chunk === null || chunk === undefined) { - state.reading = false; - if (!state.ended) - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var e = new Error('stream.unshift() after end event'); - stream.emit('error', e); - } else { - if (state.decoder && !addToFront && !encoding) - chunk = state.decoder.write(chunk); - - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) { - state.buffer.unshift(chunk); - } else { - state.reading = false; - state.buffer.push(chunk); - } - - if (state.needReadable) - emitReadable(stream); - - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } - - return needMoreData(state); -} - - - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && - (state.needReadable || - state.length < state.highWaterMark || - state.length === 0); -} - -// backwards compatibility. -Readable.prototype.setEncoding = function(enc) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; -}; - -// Don't raise the hwm > 128MB -var MAX_HWM = 0x800000; -function roundUpToNextPowerOf2(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 - n--; - for (var p = 1; p < 32; p <<= 1) n |= n >> p; - n++; - } - return n; -} - -function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) - return 0; - - if (state.objectMode) - return n === 0 ? 0 : 1; - - if (n === null || isNaN(n)) { - // only flow one buffer at a time - if (state.flowing && state.buffer.length) - return state.buffer[0].length; - else - return state.length; - } - - if (n <= 0) - return 0; - - // If we're asking for more than the target buffer level, - // then raise the water mark. Bump up to the next highest - // power of 2, to prevent increasing it excessively in tiny - // amounts. - if (n > state.highWaterMark) - state.highWaterMark = roundUpToNextPowerOf2(n); - - // don't have that much. return null, unless we've ended. - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else - return state.length; - } - - return n; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function(n) { - var state = this._readableState; - state.calledRead = true; - var nOrig = n; - var ret; - - if (typeof n !== 'number' || n > 0) - state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && - state.needReadable && - (state.length >= state.highWaterMark || state.ended)) { - emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - ret = null; - - // In cases where the decoder did not receive enough data - // to produce a full chunk, then immediately received an - // EOF, state.buffer will contain [, ]. - // howMuchToRead will see this and coerce the amount to - // read to zero (because it's looking at the length of the - // first in state.buffer), and we'll end up here. - // - // This can only happen via state.decoder -- no other venue - // exists for pushing a zero-length chunk into state.buffer - // and triggering this behavior. In this case, we return our - // remaining data and end the stream, if appropriate. - if (state.length > 0 && state.decoder) { - ret = fromList(n, state); - state.length -= ret.length; - } - - if (state.length === 0) - endReadable(this); - - return ret; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - - // if we currently have less than the highWaterMark, then also read some - if (state.length - n <= state.highWaterMark) - doRead = true; - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) - doRead = false; - - if (doRead) { - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) - state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - } - - // If _read called its callback synchronously, then `reading` - // will be false, and we need to re-evaluate how much data we - // can return to the user. - if (doRead && !state.reading) - n = howMuchToRead(nOrig, state); - - if (n > 0) - ret = fromList(n, state); - else - ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } - - state.length -= n; - - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (state.length === 0 && !state.ended) - state.needReadable = true; - - // If we happened to read() exactly the remaining amount in the - // buffer, and the EOF has been seen at this point, then make sure - // that we emit 'end' on the very next tick. - if (state.ended && !state.endEmitted && state.length === 0) - endReadable(this); - - return ret; -}; - -function chunkInvalid(state, chunk) { - var er = null; - if (!Buffer.isBuffer(chunk) && - 'string' !== typeof chunk && - chunk !== null && - chunk !== undefined && - !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - - -function onEofChunk(stream, state) { - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // if we've ended and we have some data left, then emit - // 'readable' now to make sure it gets picked up. - if (state.length > 0) - emitReadable(stream); - else - endReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (state.emittedReadable) - return; - - state.emittedReadable = true; - if (state.sync) - process.nextTick(function() { - emitReadable_(stream); - }); - else - emitReadable_(stream); -} - -function emitReadable_(stream) { - stream.emit('readable'); -} - - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - process.nextTick(function() { - maybeReadMore_(stream, state); - }); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && - state.length < state.highWaterMark) { - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break; - else - len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function(n) { - this.emit('error', new Error('not implemented')); -}; - -Readable.prototype.pipe = function(dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && - dest !== process.stdout && - dest !== process.stderr; - - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) - process.nextTick(endFn); - else - src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - if (readable !== src) return; - cleanup(); - } - - function onend() { - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - function cleanup() { - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (!dest._writableState || dest._writableState.needDrain) - ondrain(); - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - unpipe(); - dest.removeListener('error', onerror); - if (EE.listenerCount(dest, 'error') === 0) - dest.emit('error', er); - } - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. - if (!dest._events || !dest._events.error) - dest.on('error', onerror); - else if (isArray(dest._events.error)) - dest._events.error.unshift(onerror); - else - dest._events.error = [onerror, dest._events.error]; - - - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - // the handler that waits for readable events after all - // the data gets sucked out in flow. - // This would be easier to follow with a .once() handler - // in flow(), but that is too slow. - this.on('readable', pipeOnReadable); - - state.flowing = true; - process.nextTick(function() { - flow(src); - }); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function() { - var dest = this; - var state = src._readableState; - state.awaitDrain--; - if (state.awaitDrain === 0) - flow(src); - }; -} - -function flow(src) { - var state = src._readableState; - var chunk; - state.awaitDrain = 0; - - function write(dest, i, list) { - var written = dest.write(chunk); - if (false === written) { - state.awaitDrain++; - } - } - - while (state.pipesCount && null !== (chunk = src.read())) { - - if (state.pipesCount === 1) - write(state.pipes, 0, null); - else - forEach(state.pipes, write); - - src.emit('data', chunk); - - // if anyone needs a drain, then we have to wait for that. - if (state.awaitDrain > 0) - return; - } - - // if every destination was unpiped, either before entering this - // function, or in the while loop, then stop flowing. - // - // NB: This is a pretty rare edge case. - if (state.pipesCount === 0) { - state.flowing = false; - - // if there were data event listeners added, then switch to old mode. - if (EE.listenerCount(src, 'data') > 0) - emitDataEvents(src); - return; - } - - // at this point, no one needed a drain, so we just ran out of data - // on the next readable event, start it over again. - state.ranOut = true; -} - -function pipeOnReadable() { - if (this._readableState.ranOut) { - this._readableState.ranOut = false; - flow(this); - } -} - - -Readable.prototype.unpipe = function(dest) { - var state = this._readableState; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) - return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) - return this; - - if (!dest) - dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - this.removeListener('readable', pipeOnReadable); - state.flowing = false; - if (dest) - dest.emit('unpipe', this); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - this.removeListener('readable', pipeOnReadable); - state.flowing = false; - - for (var i = 0; i < len; i++) - dests[i].emit('unpipe', this); - return this; - } - - // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) - return this; - - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) - state.pipes = state.pipes[0]; - - dest.emit('unpipe', this); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function(ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data' && !this._readableState.flowing) - emitDataEvents(this); - - if (ev === 'readable' && this.readable) { - var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; - state.emittedReadable = false; - state.needReadable = true; - if (!state.reading) { - this.read(0); - } else if (state.length) { - emitReadable(this, state); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function() { - emitDataEvents(this); - this.read(0); - this.emit('resume'); -}; - -Readable.prototype.pause = function() { - emitDataEvents(this, true); - this.emit('pause'); -}; - -function emitDataEvents(stream, startPaused) { - var state = stream._readableState; - - if (state.flowing) { - // https://github.com/isaacs/readable-stream/issues/16 - throw new Error('Cannot switch to old mode now.'); - } - - var paused = startPaused || false; - var readable = false; - - // convert to an old-style stream. - stream.readable = true; - stream.pipe = Stream.prototype.pipe; - stream.on = stream.addListener = Stream.prototype.on; - - stream.on('readable', function() { - readable = true; - - var c; - while (!paused && (null !== (c = stream.read()))) - stream.emit('data', c); - - if (c === null) { - readable = false; - stream._readableState.needReadable = true; - } - }); - - stream.pause = function() { - paused = true; - this.emit('pause'); - }; - - stream.resume = function() { - paused = false; - if (readable) - process.nextTick(function() { - stream.emit('readable'); - }); - else - this.read(0); - this.emit('resume'); - }; - - // now make it start, just in case it hadn't already. - stream.emit('readable'); -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function(stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function() { - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) - self.push(chunk); - } - - self.push(null); - }); - - stream.on('data', function(chunk) { - if (state.decoder) - chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - //if (state.objectMode && util.isNullOrUndefined(chunk)) - if (state.objectMode && (chunk === null || chunk === undefined)) - return; - else if (!state.objectMode && (!chunk || !chunk.length)) - return; - - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (typeof stream[i] === 'function' && - typeof this[i] === 'undefined') { - this[i] = function(method) { return function() { - return stream[method].apply(stream, arguments); - }}(i); - } - } - - // proxy certain important events. - var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function(ev) { - stream.on(ev, self.emit.bind(self, ev)); - }); - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function(n) { - if (paused) { - paused = false; - stream.resume(); - } - }; - - return self; -}; - - - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; - var ret; - - // nothing in the list, definitely empty. - if (list.length === 0) - return null; - - if (length === 0) - ret = null; - else if (objectMode) - ret = list.shift(); - else if (!n || n >= length) { - // read it all, truncate the array. - if (stringMode) - ret = list.join(''); - else - ret = Buffer.concat(list, length); - list.length = 0; - } else { - // read just some of it. - if (n < list[0].length) { - // just take a part of the first list item. - // slice is the same for buffers and strings. - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - // first list is a perfect match - ret = list.shift(); - } else { - // complex case. - // we have enough to cover it, but it spans past the first buffer. - if (stringMode) - ret = ''; - else - ret = new Buffer(n); - - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); - - if (stringMode) - ret += buf.slice(0, cpy); - else - buf.copy(ret, c, 0, cpy); - - if (cpy < buf.length) - list[0] = buf.slice(cpy); - else - list.shift(); - - c += cpy; - } - } - } - - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) - throw new Error('endReadable called on non-empty stream'); - - if (!state.endEmitted && state.calledRead) { - state.ended = true; - process.nextTick(function() { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } - }); - } -} - -function forEach (xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf (xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -}).call(this,require('_process')) - -},{"_process":11,"buffer":4,"core-util-is":18,"events":8,"inherits":9,"isarray":10,"stream":23,"string_decoder/":24}],16:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(Transform, Duplex); - - -function TransformState(options, stream) { - this.afterTransform = function(er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) - return stream.emit('error', new Error('no writecb in Transform class')); - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) - stream.push(data); - - if (cb) - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} - - -function Transform(options) { - if (!(this instanceof Transform)) - return new Transform(options); - - Duplex.call(this, options); - - var ts = this._transformState = new TransformState(options, this); - - // when the writable side finishes, then flush out anything remaining. - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - this.once('finish', function() { - if ('function' === typeof this._flush) - this._flush(function(er) { - done(stream, er); - }); - else - done(stream); - }); -} - -Transform.prototype.push = function(chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function(chunk, encoding, cb) { - throw new Error('not implemented'); -}; - -Transform.prototype._write = function(chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || - rs.needReadable || - rs.length < rs.highWaterMark) - this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function(n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - - -function done(stream, er) { - if (er) - return stream.emit('error', er); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var rs = stream._readableState; - var ts = stream._transformState; - - if (ws.length) - throw new Error('calling transform done when ws.length != 0'); - - if (ts.transforming) - throw new Error('calling transform done when still transforming'); - - return stream.push(null); -} - -},{"./_stream_duplex":13,"core-util-is":18,"inherits":9}],17:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, cb), and it'll handle all -// the drain event emission and buffering. - -module.exports = Writable; - -/**/ -var Buffer = require('buffer').Buffer; -/**/ - -Writable.WritableState = WritableState; - - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var Stream = require('stream'); - -util.inherits(Writable, Stream); - -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; -} - -function WritableState(options, stream) { - options = options || {}; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; - - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, becuase any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function(er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.buffer = []; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; -} - -function Writable(options) { - var Duplex = require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) - return new Writable(options); - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - Stream.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function() { - this.emit('error', new Error('Cannot pipe. Not readable.')); -}; - - -function writeAfterEnd(stream, state, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); -} - -// If we get something that is not a buffer, string, null, or undefined, -// and we're not in objectMode, then that's an error. -// Otherwise stream chunks are all considered to be of length=1, and the -// watermarks determine how many objects to keep in the buffer, rather than -// how many bytes or characters. -function validChunk(stream, state, chunk, cb) { - var valid = true; - if (!Buffer.isBuffer(chunk) && - 'string' !== typeof chunk && - chunk !== null && - chunk !== undefined && - !state.objectMode) { - var er = new TypeError('Invalid non-string/buffer chunk'); - stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); - valid = false; - } - return valid; -} - -Writable.prototype.write = function(chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (Buffer.isBuffer(chunk)) - encoding = 'buffer'; - else if (!encoding) - encoding = state.defaultEncoding; - - if (typeof cb !== 'function') - cb = function() {}; - - if (state.ended) - writeAfterEnd(this, state, cb); - else if (validChunk(this, state, chunk, cb)) - ret = writeOrBuffer(this, state, chunk, encoding, cb); - - return ret; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && - state.decodeStrings !== false && - typeof chunk === 'string') { - chunk = new Buffer(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); - if (Buffer.isBuffer(chunk)) - encoding = 'buffer'; - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) - state.needDrain = true; - - if (state.writing) - state.buffer.push(new WriteReq(chunk, encoding, cb)); - else - doWrite(stream, state, len, chunk, encoding, cb); - - return ret; -} - -function doWrite(stream, state, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - if (sync) - process.nextTick(function() { - cb(er); - }); - else - cb(er); - - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) - onwriteError(stream, state, sync, er, cb); - else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(stream, state); - - if (!finished && !state.bufferProcessing && state.buffer.length) - clearBuffer(stream, state); - - if (sync) { - process.nextTick(function() { - afterWrite(stream, state, finished, cb); - }); - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) - onwriteDrain(stream, state); - cb(); - if (finished) - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - - for (var c = 0; c < state.buffer.length; c++) { - var entry = state.buffer[c]; - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, len, chunk, encoding, cb); - - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - c++; - break; - } - } - - state.bufferProcessing = false; - if (c < state.buffer.length) - state.buffer = state.buffer.slice(c); - else - state.buffer.length = 0; -} - -Writable.prototype._write = function(chunk, encoding, cb) { - cb(new Error('not implemented')); -}; - -Writable.prototype.end = function(chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (typeof chunk !== 'undefined' && chunk !== null) - this.write(chunk, encoding); - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) - endWritable(this, state, cb); -}; - - -function needFinish(stream, state) { - return (state.ending && - state.length === 0 && - !state.finished && - !state.writing); -} - -function finishMaybe(stream, state) { - var need = needFinish(stream, state); - if (need) { - state.finished = true; - stream.emit('finish'); - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) - process.nextTick(cb); - else - stream.once('finish', cb); - } - state.ended = true; -} - -}).call(this,require('_process')) - -},{"./_stream_duplex":13,"_process":11,"buffer":4,"core-util-is":18,"inherits":9,"stream":23}],18:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -function isBuffer(arg) { - return Buffer.isBuffer(arg); -} -exports.isBuffer = isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} -}).call(this,require("buffer").Buffer) - -},{"buffer":4}],19:[function(require,module,exports){ -module.exports = require("./lib/_stream_passthrough.js") - -},{"./lib/_stream_passthrough.js":14}],20:[function(require,module,exports){ -var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = Stream; -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_duplex.js":13,"./lib/_stream_passthrough.js":14,"./lib/_stream_readable.js":15,"./lib/_stream_transform.js":16,"./lib/_stream_writable.js":17,"stream":23}],21:[function(require,module,exports){ -module.exports = require("./lib/_stream_transform.js") - -},{"./lib/_stream_transform.js":16}],22:[function(require,module,exports){ -module.exports = require("./lib/_stream_writable.js") - -},{"./lib/_stream_writable.js":17}],23:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":8,"inherits":9,"readable-stream/duplex.js":12,"readable-stream/passthrough.js":19,"readable-stream/readable.js":20,"readable-stream/transform.js":21,"readable-stream/writable.js":22}],24:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -var Buffer = require('buffer').Buffer; - -var isBufferEncoding = Buffer.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - } - - -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -var StringDecoder = exports.StringDecoder = function(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; - } - - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; -}; - - -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } - - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); - - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; - - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; - } - break; - } - - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; - -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; - -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} - -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} - -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} - -},{"buffer":4}],25:[function(require,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} -},{}],26:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = require('./support/isBuffer'); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./support/isBuffer":25,"_process":11,"inherits":9}],27:[function(require,module,exports){ -var htmlparser = require('htmlparser2'); -var _ = require('lodash'); -var quoteRegexp = require('regexp-quote'); - -module.exports = sanitizeHtml; - -// Ignore the _recursing flag; it's there for recursive -// invocation as a guard against this exploit: -// https://github.com/fb55/htmlparser2/issues/105 - -function sanitizeHtml(html, options, _recursing) { - var result = ''; - - function Frame(tag, attribs) { - var that = this; - this.tag = tag; - this.attribs = attribs || {}; - this.tagPosition = result.length; - this.text = ''; // Node inner text - - this.updateParentNodeText = function() { - if (stack.length) { - var parentFrame = stack[stack.length - 1]; - parentFrame.text += that.text; - } - }; - } - - if (!options) { - options = sanitizeHtml.defaults; - } else { - _.defaults(options, sanitizeHtml.defaults); - } - // Tags that contain something other than HTML. If we are not allowing - // these tags, we should drop their content too. For other tags you would - // drop the tag but keep its content. - var nonTextTagsMap = { - script: true, - style: true - }; - var allowedTagsMap; - if(options.allowedTags) { - allowedTagsMap = {}; - _.each(options.allowedTags, function(tag) { - allowedTagsMap[tag] = true; - }); - } - var selfClosingMap = {}; - _.each(options.selfClosing, function(tag) { - selfClosingMap[tag] = true; - }); - var allowedAttributesMap; - var allowedAttributesGlobMap; - if(options.allowedAttributes) { - allowedAttributesMap = {}; - allowedAttributesGlobMap = {}; - _.each(options.allowedAttributes, function(attributes, tag) { - allowedAttributesMap[tag] = {}; - var globRegex = []; - _.each(attributes, function(name) { - if(name.indexOf('*') >= 0) { - globRegex.push(quoteRegexp(name).replace(/\\\*/g, '.*')); - } else { - allowedAttributesMap[tag][name] = true; - } - }); - allowedAttributesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$'); - }); - } - var allowedClassesMap = {}; - _.each(options.allowedClasses, function(classes, tag) { - // Implicitly allows the class attribute - if(allowedAttributesMap) { - if (!allowedAttributesMap[tag]) { - allowedAttributesMap[tag] = {}; - } - allowedAttributesMap[tag]['class'] = true; - } - - allowedClassesMap[tag] = {}; - _.each(classes, function(name) { - allowedClassesMap[tag][name] = true; - }); - }); - - var transformTagsMap = {}; - _.each(options.transformTags, function(transform, tag){ - if (typeof transform === 'function') { - transformTagsMap[tag] = transform; - } else if (typeof transform === "string") { - transformTagsMap[tag] = sanitizeHtml.simpleTransform(transform); - } - }); - - var depth = 0; - var stack = []; - var skipMap = {}; - var transformMap = {}; - var skipText = false; - var parser = new htmlparser.Parser({ - onopentag: function(name, attribs) { - var frame = new Frame(name, attribs); - stack.push(frame); - - var skip = false; - if (_.has(transformTagsMap, name)) { - var transformedTag = transformTagsMap[name](name, attribs); - - frame.attribs = attribs = transformedTag.attribs; - if (name !== transformedTag.tagName) { - frame.name = name = transformedTag.tagName; - transformMap[depth] = transformedTag.tagName; - } - } - - if (allowedTagsMap && !_.has(allowedTagsMap, name)) { - skip = true; - if (_.has(nonTextTagsMap, name)) { - skipText = true; - } - skipMap[depth] = true; - } - depth++; - if (skip) { - // We want the contents but not this tag - return; - } - result += '<' + name; - if (!allowedAttributesMap || _.has(allowedAttributesMap, name)) { - _.each(attribs, function(value, a) { - if (!allowedAttributesMap || _.has(allowedAttributesMap[name], a) || (_.has(allowedAttributesGlobMap, name) && - allowedAttributesGlobMap[name].test(a))) { - if ((a === 'href') || (a === 'src')) { - if (naughtyHref(value)) { - delete frame.attribs[a]; - return; - } - } - if (a === 'class') { - value = filterClasses(value, allowedClassesMap[name]); - if (!value.length) { - delete frame.attribs[a]; - return; - } - } - result += ' ' + a; - if (value.length) { - result += '="' + escapeHtml(value) + '"'; - } - } else { - delete frame.attribs[a]; - } - }); - } - if (_.has(selfClosingMap, name)) { - result += " />"; - } else { - result += ">"; - } - }, - ontext: function(text) { - if (skipText) { - return; - } - var tag = stack[stack.length-1] && stack[stack.length-1].tag; - if (_.has(nonTextTagsMap, tag)) { - result += text; - } else { - var escaped = escapeHtml(text); - if (options.textFilter) { - result += options.textFilter(escaped); - } else { - result += escaped; - } - } - if (stack.length) { - var frame = stack[stack.length - 1]; - frame.text += text; - } - }, - onclosetag: function(name) { - var frame = stack.pop(); - if (!frame) { - // Do not crash on bad markup - return; - } - skipText = false; - depth--; - if (skipMap[depth]) { - delete skipMap[depth]; - frame.updateParentNodeText(); - return; - } - - if (transformMap[depth]) { - name = transformMap[depth]; - delete transformMap[depth]; - } - - if (options.exclusiveFilter && options.exclusiveFilter(frame)) { - result = result.substr(0, frame.tagPosition); - return; - } - - frame.updateParentNodeText(); - - if (_.has(selfClosingMap, name)) { - // Already output /> - return; - } - - result += ""; - } - }, { decodeEntities: true }); - - parser.write(html); - parser.end(); - - return result; - - function escapeHtml(s) { - if (typeof(s) !== 'string') { - s = s + ''; - } - return s.replace(/\&/g, '&').replace(//g, '>').replace(/\"/g, '"'); - } - - function naughtyHref(href) { - // Browsers ignore character codes of 32 (space) and below in a surprising - // number of situations. Start reading here: - // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Embedded_tab - href = href.replace(/[\x00-\x20]+/g, ''); - // Clobber any comments in URLs, which the browser might - // interpret inside an XML data island, allowing - // a javascript: URL to be snuck through - href = href.replace(/<\!\-\-.*?\-\-\>/g, ''); - // Case insensitive so we don't get faked out by JAVASCRIPT #1 - var matches = href.match(/^([a-zA-Z]+)\:/); - if (!matches) { - // No scheme = no way to inject js (right?) - return false; - } - var scheme = matches[1].toLowerCase(); - return (!_.contains(options.allowedSchemes, scheme)); - } - - function filterClasses(classes, allowed) { - if (!allowed) { - // The class attribute is allowed without filtering on this tag - return classes; - } - classes = classes.split(/\s+/); - return _.filter(classes, function(c) { - return _.has(allowed, c); - }).join(' '); - } -} - -// Defaults are accessible to you so that you can use them as a starting point -// programmatically if you wish - -sanitizeHtml.defaults = { - allowedTags: [ 'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol', 'nl', 'li', 'b', 'i', 'strong', 'em', 'strike', 'code', 'hr', 'br', 'div', 'table', 'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre' ], - allowedAttributes: { - a: [ 'href', 'name', 'target' ], - // We don't currently allow img itself by default, but this - // would make sense if we did - img: [ 'src' ] - }, - // Lots of these won't come up by default because we don't allow them - selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ], - // URL schemes we permit - allowedSchemes: [ 'http', 'https', 'ftp', 'mailto' ] -}; - -sanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) { - merge = (merge === undefined) ? true : merge; - newAttribs = newAttribs || {}; - - return function(tagName, attribs) { - var attrib; - if (merge) { - for (attrib in newAttribs) { - attribs[attrib] = newAttribs[attrib]; - } - } else { - attribs = newAttribs; - } - - return { - tagName: newTagName, - attribs: attribs - }; - }; -}; - -},{"htmlparser2":35,"lodash":62,"regexp-quote":63}],28:[function(require,module,exports){ -module.exports = CollectingHandler; - -function CollectingHandler(cbs){ - this._cbs = cbs || {}; - this.events = []; -} - -var EVENTS = require("./").EVENTS; -Object.keys(EVENTS).forEach(function(name){ - if(EVENTS[name] === 0){ - name = "on" + name; - CollectingHandler.prototype[name] = function(){ - this.events.push([name]); - if(this._cbs[name]) this._cbs[name](); - }; - } else if(EVENTS[name] === 1){ - name = "on" + name; - CollectingHandler.prototype[name] = function(a){ - this.events.push([name, a]); - if(this._cbs[name]) this._cbs[name](a); - }; - } else if(EVENTS[name] === 2){ - name = "on" + name; - CollectingHandler.prototype[name] = function(a, b){ - this.events.push([name, a, b]); - if(this._cbs[name]) this._cbs[name](a, b); - }; - } else { - throw Error("wrong number of arguments"); - } -}); - -CollectingHandler.prototype.onreset = function(){ - this.events = []; - if(this._cbs.onreset) this._cbs.onreset(); -}; - -CollectingHandler.prototype.restart = function(){ - if(this._cbs.onreset) this._cbs.onreset(); - - for(var i = 0, len = this.events.length; i < len; i++){ - if(this._cbs[this.events[i][0]]){ - - var num = this.events[i].length; - - if(num === 1){ - this._cbs[this.events[i][0]](); - } else if(num === 2){ - this._cbs[this.events[i][0]](this.events[i][1]); - } else { - this._cbs[this.events[i][0]](this.events[i][1], this.events[i][2]); - } - } - } -}; - -},{"./":35}],29:[function(require,module,exports){ -var index = require("./index.js"), - DomHandler = index.DomHandler, - DomUtils = index.DomUtils; - -//TODO: make this a streamable handler -function FeedHandler(callback, options){ - this.init(callback, options); -} - -require("util").inherits(FeedHandler, DomHandler); - -FeedHandler.prototype.init = DomHandler; - -function getElements(what, where){ - return DomUtils.getElementsByTagName(what, where, true); -} -function getOneElement(what, where){ - return DomUtils.getElementsByTagName(what, where, true, 1)[0]; -} -function fetch(what, where, recurse){ - return DomUtils.getText( - DomUtils.getElementsByTagName(what, where, recurse, 1) - ).trim(); -} - -function addConditionally(obj, prop, what, where, recurse){ - var tmp = fetch(what, where, recurse); - if(tmp) obj[prop] = tmp; -} - -var isValidFeed = function(value){ - return value === "rss" || value === "feed" || value === "rdf:RDF"; -}; - -FeedHandler.prototype.onend = function(){ - var feed = {}, - feedRoot = getOneElement(isValidFeed, this.dom), - tmp, childs; - - if(feedRoot){ - if(feedRoot.name === "feed"){ - childs = feedRoot.children; - - feed.type = "atom"; - addConditionally(feed, "id", "id", childs); - addConditionally(feed, "title", "title", childs); - if((tmp = getOneElement("link", childs)) && (tmp = tmp.attribs) && (tmp = tmp.href)) feed.link = tmp; - addConditionally(feed, "description", "subtitle", childs); - if((tmp = fetch("updated", childs))) feed.updated = new Date(tmp); - addConditionally(feed, "author", "email", childs, true); - - feed.items = getElements("entry", childs).map(function(item){ - var entry = {}, tmp; - - item = item.children; - - addConditionally(entry, "id", "id", item); - addConditionally(entry, "title", "title", item); - if((tmp = getOneElement("link", item)) && (tmp = tmp.attribs) && (tmp = tmp.href)) entry.link = tmp; - if((tmp = fetch("summary", item) || fetch("content", item))) entry.description = tmp; - if((tmp = fetch("updated", item))) entry.pubDate = new Date(tmp); - return entry; - }); - } else { - childs = getOneElement("channel", feedRoot.children).children; - - feed.type = feedRoot.name.substr(0, 3); - feed.id = ""; - addConditionally(feed, "title", "title", childs); - addConditionally(feed, "link", "link", childs); - addConditionally(feed, "description", "description", childs); - if((tmp = fetch("lastBuildDate", childs))) feed.updated = new Date(tmp); - addConditionally(feed, "author", "managingEditor", childs, true); - - feed.items = getElements("item", feedRoot.children).map(function(item){ - var entry = {}, tmp; - - item = item.children; - - addConditionally(entry, "id", "guid", item); - addConditionally(entry, "title", "title", item); - addConditionally(entry, "link", "link", item); - addConditionally(entry, "description", "description", item); - if((tmp = fetch("pubDate", item))) entry.pubDate = new Date(tmp); - return entry; - }); - } - } - this.dom = feed; - DomHandler.prototype._handleCallback.call( - this, feedRoot ? null : Error("couldn't find root of feed") - ); -}; - -module.exports = FeedHandler; - -},{"./index.js":35,"util":26}],30:[function(require,module,exports){ -var Tokenizer = require("./Tokenizer.js"); - -/* - Options: - - xmlMode: Special behavior for script/style tags (true by default) - lowerCaseAttributeNames: call .toLowerCase for each attribute name (true if xmlMode is `false`) - lowerCaseTags: call .toLowerCase for each tag name (true if xmlMode is `false`) -*/ - -/* - Callbacks: - - oncdataend, - oncdatastart, - onclosetag, - oncomment, - oncommentend, - onerror, - onopentag, - onprocessinginstruction, - onreset, - ontext -*/ - -var formTags = { - input: true, - option: true, - optgroup: true, - select: true, - button: true, - datalist: true, - textarea: true -}; - -var openImpliesClose = { - tr : { tr:true, th:true, td:true }, - th : { th:true }, - td : { thead:true, td:true }, - body : { head:true, link:true, script:true }, - li : { li:true }, - p : { p:true }, - h1 : { p:true }, - h2 : { p:true }, - h3 : { p:true }, - h4 : { p:true }, - h5 : { p:true }, - h6 : { p:true }, - select : formTags, - input : formTags, - output : formTags, - button : formTags, - datalist: formTags, - textarea: formTags, - option : { option:true }, - optgroup: { optgroup:true } -}; - -var voidElements = { - __proto__: null, - area: true, - base: true, - basefont: true, - br: true, - col: true, - command: true, - embed: true, - frame: true, - hr: true, - img: true, - input: true, - isindex: true, - keygen: true, - link: true, - meta: true, - param: true, - source: true, - track: true, - wbr: true, - - //common self closing svg elements - path: true, - circle: true, - ellipse: true, - line: true, - rect: true, - use: true, - stop: true, - polyline: true, - polygone: true -}; - -var re_nameEnd = /\s|\//; - -function Parser(cbs, options){ - this._options = options || {}; - this._cbs = cbs || {}; - - this._tagname = ""; - this._attribname = ""; - this._attribvalue = ""; - this._attribs = null; - this._stack = []; - - this.startIndex = 0; - this.endIndex = null; - - this._lowerCaseTagNames = "lowerCaseTags" in this._options ? - !!this._options.lowerCaseTags : - !this._options.xmlMode; - this._lowerCaseAttributeNames = "lowerCaseAttributeNames" in this._options ? - !!this._options.lowerCaseAttributeNames : - !this._options.xmlMode; - - this._tokenizer = new Tokenizer(this._options, this); - - if(this._cbs.onparserinit) this._cbs.onparserinit(this); -} - -require("util").inherits(Parser, require("events").EventEmitter); - -Parser.prototype._updatePosition = function(initialOffset){ - if(this.endIndex === null){ - if(this._tokenizer._sectionStart <= initialOffset){ - this.startIndex = 0; - } else { - this.startIndex = this._tokenizer._sectionStart - initialOffset; - } - } - else this.startIndex = this.endIndex + 1; - this.endIndex = this._tokenizer.getAbsoluteIndex(); -}; - -//Tokenizer event handlers -Parser.prototype.ontext = function(data){ - this._updatePosition(1); - this.endIndex--; - - if(this._cbs.ontext) this._cbs.ontext(data); -}; - -Parser.prototype.onopentagname = function(name){ - if(this._lowerCaseTagNames){ - name = name.toLowerCase(); - } - - this._tagname = name; - - if(!this._options.xmlMode && name in openImpliesClose) { - for( - var el; - (el = this._stack[this._stack.length - 1]) in openImpliesClose[name]; - this.onclosetag(el) - ); - } - - if(this._options.xmlMode || !(name in voidElements)){ - this._stack.push(name); - } - - if(this._cbs.onopentagname) this._cbs.onopentagname(name); - if(this._cbs.onopentag) this._attribs = {}; -}; - -Parser.prototype.onopentagend = function(){ - this._updatePosition(1); - - if(this._attribs){ - if(this._cbs.onopentag) this._cbs.onopentag(this._tagname, this._attribs); - this._attribs = null; - } - - if(!this._options.xmlMode && this._cbs.onclosetag && this._tagname in voidElements){ - this._cbs.onclosetag(this._tagname); - } - - this._tagname = ""; -}; - -Parser.prototype.onclosetag = function(name){ - this._updatePosition(1); - - if(this._lowerCaseTagNames){ - name = name.toLowerCase(); - } - - if(this._stack.length && (!(name in voidElements) || this._options.xmlMode)){ - var pos = this._stack.lastIndexOf(name); - if(pos !== -1){ - if(this._cbs.onclosetag){ - pos = this._stack.length - pos; - while(pos--) this._cbs.onclosetag(this._stack.pop()); - } - else this._stack.length = pos; - } else if(name === "p" && !this._options.xmlMode){ - this.onopentagname(name); - this._closeCurrentTag(); - } - } else if(!this._options.xmlMode && (name === "br" || name === "p")){ - this.onopentagname(name); - this._closeCurrentTag(); - } -}; - -Parser.prototype.onselfclosingtag = function(){ - if(this._options.xmlMode || this._options.recognizeSelfClosing){ - this._closeCurrentTag(); - } else { - this.onopentagend(); - } -}; - -Parser.prototype._closeCurrentTag = function(){ - var name = this._tagname; - - this.onopentagend(); - - //self-closing tags will be on the top of the stack - //(cheaper check than in onclosetag) - if(this._stack[this._stack.length - 1] === name){ - if(this._cbs.onclosetag){ - this._cbs.onclosetag(name); - } - this._stack.pop(); - } -}; - -Parser.prototype.onattribname = function(name){ - if(this._lowerCaseAttributeNames){ - name = name.toLowerCase(); - } - this._attribname = name; -}; - -Parser.prototype.onattribdata = function(value){ - this._attribvalue += value; -}; - -Parser.prototype.onattribend = function(){ - if(this._cbs.onattribute) this._cbs.onattribute(this._attribname, this._attribvalue); - if( - this._attribs && - !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname) - ){ - this._attribs[this._attribname] = this._attribvalue; - } - this._attribname = ""; - this._attribvalue = ""; -}; - -Parser.prototype._getInstructionName = function(value){ - var idx = value.search(re_nameEnd), - name = idx < 0 ? value : value.substr(0, idx); - - if(this._lowerCaseTagNames){ - name = name.toLowerCase(); - } - - return name; -}; - -Parser.prototype.ondeclaration = function(value){ - if(this._cbs.onprocessinginstruction){ - var name = this._getInstructionName(value); - this._cbs.onprocessinginstruction("!" + name, "!" + value); - } -}; - -Parser.prototype.onprocessinginstruction = function(value){ - if(this._cbs.onprocessinginstruction){ - var name = this._getInstructionName(value); - this._cbs.onprocessinginstruction("?" + name, "?" + value); - } -}; - -Parser.prototype.oncomment = function(value){ - this._updatePosition(4); - - if(this._cbs.oncomment) this._cbs.oncomment(value); - if(this._cbs.oncommentend) this._cbs.oncommentend(); -}; - -Parser.prototype.oncdata = function(value){ - this._updatePosition(1); - - if(this._options.xmlMode || this._options.recognizeCDATA){ - if(this._cbs.oncdatastart) this._cbs.oncdatastart(); - if(this._cbs.ontext) this._cbs.ontext(value); - if(this._cbs.oncdataend) this._cbs.oncdataend(); - } else { - this.oncomment("[CDATA[" + value + "]]"); - } -}; - -Parser.prototype.onerror = function(err){ - if(this._cbs.onerror) this._cbs.onerror(err); -}; - -Parser.prototype.onend = function(){ - if(this._cbs.onclosetag){ - for( - var i = this._stack.length; - i > 0; - this._cbs.onclosetag(this._stack[--i]) - ); - } - if(this._cbs.onend) this._cbs.onend(); -}; - - -//Resets the parser to a blank state, ready to parse a new HTML document -Parser.prototype.reset = function(){ - if(this._cbs.onreset) this._cbs.onreset(); - this._tokenizer.reset(); - - this._tagname = ""; - this._attribname = ""; - this._attribs = null; - this._stack = []; - - if(this._cbs.onparserinit) this._cbs.onparserinit(this); -}; - -//Parses a complete HTML document and pushes it to the handler -Parser.prototype.parseComplete = function(data){ - this.reset(); - this.end(data); -}; - -Parser.prototype.write = function(chunk){ - this._tokenizer.write(chunk); -}; - -Parser.prototype.end = function(chunk){ - this._tokenizer.end(chunk); -}; - -Parser.prototype.pause = function(){ - this._tokenizer.pause(); -}; - -Parser.prototype.resume = function(){ - this._tokenizer.resume(); -}; - -//alias for backwards compat -Parser.prototype.parseChunk = Parser.prototype.write; -Parser.prototype.done = Parser.prototype.end; - -module.exports = Parser; - -},{"./Tokenizer.js":33,"events":8,"util":26}],31:[function(require,module,exports){ -module.exports = ProxyHandler; - -function ProxyHandler(cbs){ - this._cbs = cbs || {}; -} - -var EVENTS = require("./").EVENTS; -Object.keys(EVENTS).forEach(function(name){ - if(EVENTS[name] === 0){ - name = "on" + name; - ProxyHandler.prototype[name] = function(){ - if(this._cbs[name]) this._cbs[name](); - }; - } else if(EVENTS[name] === 1){ - name = "on" + name; - ProxyHandler.prototype[name] = function(a){ - if(this._cbs[name]) this._cbs[name](a); - }; - } else if(EVENTS[name] === 2){ - name = "on" + name; - ProxyHandler.prototype[name] = function(a, b){ - if(this._cbs[name]) this._cbs[name](a, b); - }; - } else { - throw Error("wrong number of arguments"); - } -}); -},{"./":35}],32:[function(require,module,exports){ -module.exports = Stream; - -var Parser = require("./WritableStream.js"); - -function Stream(options){ - Parser.call(this, new Cbs(this), options); -} - -require("util").inherits(Stream, Parser); - -Stream.prototype.readable = true; - -function Cbs(scope){ - this.scope = scope; -} - -var EVENTS = require("../").EVENTS; - -Object.keys(EVENTS).forEach(function(name){ - if(EVENTS[name] === 0){ - Cbs.prototype["on" + name] = function(){ - this.scope.emit(name); - }; - } else if(EVENTS[name] === 1){ - Cbs.prototype["on" + name] = function(a){ - this.scope.emit(name, a); - }; - } else if(EVENTS[name] === 2){ - Cbs.prototype["on" + name] = function(a, b){ - this.scope.emit(name, a, b); - }; - } else { - throw Error("wrong number of arguments!"); - } -}); -},{"../":35,"./WritableStream.js":34,"util":26}],33:[function(require,module,exports){ -module.exports = Tokenizer; - -var decodeCodePoint = require("entities/lib/decode_codepoint.js"), - entityMap = require("entities/maps/entities.json"), - legacyMap = require("entities/maps/legacy.json"), - xmlMap = require("entities/maps/xml.json"), - - i = 0, - - TEXT = i++, - BEFORE_TAG_NAME = i++, //after < - IN_TAG_NAME = i++, - IN_SELF_CLOSING_TAG = i++, - BEFORE_CLOSING_TAG_NAME = i++, - IN_CLOSING_TAG_NAME = i++, - AFTER_CLOSING_TAG_NAME = i++, - - //attributes - BEFORE_ATTRIBUTE_NAME = i++, - IN_ATTRIBUTE_NAME = i++, - AFTER_ATTRIBUTE_NAME = i++, - BEFORE_ATTRIBUTE_VALUE = i++, - IN_ATTRIBUTE_VALUE_DQ = i++, // " - IN_ATTRIBUTE_VALUE_SQ = i++, // ' - IN_ATTRIBUTE_VALUE_NQ = i++, - - //declarations - BEFORE_DECLARATION = i++, // ! - IN_DECLARATION = i++, - - //processing instructions - IN_PROCESSING_INSTRUCTION = i++, // ? - - //comments - BEFORE_COMMENT = i++, - IN_COMMENT = i++, - AFTER_COMMENT_1 = i++, - AFTER_COMMENT_2 = i++, - - //cdata - BEFORE_CDATA_1 = i++, // [ - BEFORE_CDATA_2 = i++, // C - BEFORE_CDATA_3 = i++, // D - BEFORE_CDATA_4 = i++, // A - BEFORE_CDATA_5 = i++, // T - BEFORE_CDATA_6 = i++, // A - IN_CDATA = i++, // [ - AFTER_CDATA_1 = i++, // ] - AFTER_CDATA_2 = i++, // ] - - //special tags - BEFORE_SPECIAL = i++, //S - BEFORE_SPECIAL_END = i++, //S - - BEFORE_SCRIPT_1 = i++, //C - BEFORE_SCRIPT_2 = i++, //R - BEFORE_SCRIPT_3 = i++, //I - BEFORE_SCRIPT_4 = i++, //P - BEFORE_SCRIPT_5 = i++, //T - AFTER_SCRIPT_1 = i++, //C - AFTER_SCRIPT_2 = i++, //R - AFTER_SCRIPT_3 = i++, //I - AFTER_SCRIPT_4 = i++, //P - AFTER_SCRIPT_5 = i++, //T - - BEFORE_STYLE_1 = i++, //T - BEFORE_STYLE_2 = i++, //Y - BEFORE_STYLE_3 = i++, //L - BEFORE_STYLE_4 = i++, //E - AFTER_STYLE_1 = i++, //T - AFTER_STYLE_2 = i++, //Y - AFTER_STYLE_3 = i++, //L - AFTER_STYLE_4 = i++, //E - - BEFORE_ENTITY = i++, //& - BEFORE_NUMERIC_ENTITY = i++, //# - IN_NAMED_ENTITY = i++, - IN_NUMERIC_ENTITY = i++, - IN_HEX_ENTITY = i++, //X - - j = 0, - - SPECIAL_NONE = j++, - SPECIAL_SCRIPT = j++, - SPECIAL_STYLE = j++; - -function whitespace(c){ - return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r"; -} - -function characterState(char, SUCCESS){ - return function(c){ - if(c === char) this._state = SUCCESS; - }; -} - -function ifElseState(upper, SUCCESS, FAILURE){ - var lower = upper.toLowerCase(); - - if(upper === lower){ - return function(c){ - if(c === lower){ - this._state = SUCCESS; - } else { - this._state = FAILURE; - this._index--; - } - }; - } else { - return function(c){ - if(c === lower || c === upper){ - this._state = SUCCESS; - } else { - this._state = FAILURE; - this._index--; - } - }; - } -} - -function consumeSpecialNameChar(upper, NEXT_STATE){ - var lower = upper.toLowerCase(); - - return function(c){ - if(c === lower || c === upper){ - this._state = NEXT_STATE; - } else { - this._state = IN_TAG_NAME; - this._index--; //consume the token again - } - }; -} - -function Tokenizer(options, cbs){ - this._state = TEXT; - this._buffer = ""; - this._sectionStart = 0; - this._index = 0; - this._bufferOffset = 0; //chars removed from _buffer - this._baseState = TEXT; - this._special = SPECIAL_NONE; - this._cbs = cbs; - this._running = true; - this._ended = false; - this._xmlMode = !!(options && options.xmlMode); - this._decodeEntities = !!(options && options.decodeEntities); -} - -Tokenizer.prototype._stateText = function(c){ - if(c === "<"){ - if(this._index > this._sectionStart){ - this._cbs.ontext(this._getSection()); - } - this._state = BEFORE_TAG_NAME; - this._sectionStart = this._index; - } else if(this._decodeEntities && this._special === SPECIAL_NONE && c === "&"){ - if(this._index > this._sectionStart){ - this._cbs.ontext(this._getSection()); - } - this._baseState = TEXT; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeTagName = function(c){ - if(c === "/"){ - this._state = BEFORE_CLOSING_TAG_NAME; - } else if(c === ">" || this._special !== SPECIAL_NONE || whitespace(c)) { - this._state = TEXT; - } else if(c === "!"){ - this._state = BEFORE_DECLARATION; - this._sectionStart = this._index + 1; - } else if(c === "?"){ - this._state = IN_PROCESSING_INSTRUCTION; - this._sectionStart = this._index + 1; - } else if(c === "<"){ - this._cbs.ontext(this._getSection()); - this._sectionStart = this._index; - } else { - this._state = (!this._xmlMode && (c === "s" || c === "S")) ? - BEFORE_SPECIAL : IN_TAG_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInTagName = function(c){ - if(c === "/" || c === ">" || whitespace(c)){ - this._emitToken("onopentagname"); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateBeforeCloseingTagName = function(c){ - if(whitespace(c)); - else if(c === ">"){ - this._state = TEXT; - } else if(this._special !== SPECIAL_NONE){ - if(c === "s" || c === "S"){ - this._state = BEFORE_SPECIAL_END; - } else { - this._state = TEXT; - this._index--; - } - } else { - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInCloseingTagName = function(c){ - if(c === ">" || whitespace(c)){ - this._emitToken("onclosetag"); - this._state = AFTER_CLOSING_TAG_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateAfterCloseingTagName = function(c){ - //skip everything until ">" - if(c === ">"){ - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateBeforeAttributeName = function(c){ - if(c === ">"){ - this._cbs.onopentagend(); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if(c === "/"){ - this._state = IN_SELF_CLOSING_TAG; - } else if(!whitespace(c)){ - this._state = IN_ATTRIBUTE_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInSelfClosingTag = function(c){ - if(c === ">"){ - this._cbs.onselfclosingtag(); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if(!whitespace(c)){ - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateInAttributeName = function(c){ - if(c === "=" || c === "/" || c === ">" || whitespace(c)){ - this._cbs.onattribname(this._getSection()); - this._sectionStart = -1; - this._state = AFTER_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateAfterAttributeName = function(c){ - if(c === "="){ - this._state = BEFORE_ATTRIBUTE_VALUE; - } else if(c === "/" || c === ">"){ - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } else if(!whitespace(c)){ - this._cbs.onattribend(); - this._state = IN_ATTRIBUTE_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeAttributeValue = function(c){ - if(c === "\""){ - this._state = IN_ATTRIBUTE_VALUE_DQ; - this._sectionStart = this._index + 1; - } else if(c === "'"){ - this._state = IN_ATTRIBUTE_VALUE_SQ; - this._sectionStart = this._index + 1; - } else if(!whitespace(c)){ - this._state = IN_ATTRIBUTE_VALUE_NQ; - this._sectionStart = this._index; - this._index--; //reconsume token - } -}; - -Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function(c){ - if(c === "\""){ - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - } else if(this._decodeEntities && c === "&"){ - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInAttributeValueSingleQuotes = function(c){ - if(c === "'"){ - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - } else if(this._decodeEntities && c === "&"){ - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInAttributeValueNoQuotes = function(c){ - if(whitespace(c) || c === ">"){ - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } else if(this._decodeEntities && c === "&"){ - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeDeclaration = function(c){ - this._state = c === "[" ? BEFORE_CDATA_1 : - c === "-" ? BEFORE_COMMENT : - IN_DECLARATION; -}; - -Tokenizer.prototype._stateInDeclaration = function(c){ - if(c === ">"){ - this._cbs.ondeclaration(this._getSection()); - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateInProcessingInstruction = function(c){ - if(c === ">"){ - this._cbs.onprocessinginstruction(this._getSection()); - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateBeforeComment = function(c){ - if(c === "-"){ - this._state = IN_COMMENT; - this._sectionStart = this._index + 1; - } else { - this._state = IN_DECLARATION; - } -}; - -Tokenizer.prototype._stateInComment = function(c){ - if(c === "-") this._state = AFTER_COMMENT_1; -}; - -Tokenizer.prototype._stateAfterComment1 = function(c){ - if(c === "-"){ - this._state = AFTER_COMMENT_2; - } else { - this._state = IN_COMMENT; - } -}; - -Tokenizer.prototype._stateAfterComment2 = function(c){ - if(c === ">"){ - //remove 2 trailing chars - this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2)); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if(c !== "-"){ - this._state = IN_COMMENT; - } - // else: stay in AFTER_COMMENT_2 (`--->`) -}; - -Tokenizer.prototype._stateBeforeCdata1 = ifElseState("C", BEFORE_CDATA_2, IN_DECLARATION); -Tokenizer.prototype._stateBeforeCdata2 = ifElseState("D", BEFORE_CDATA_3, IN_DECLARATION); -Tokenizer.prototype._stateBeforeCdata3 = ifElseState("A", BEFORE_CDATA_4, IN_DECLARATION); -Tokenizer.prototype._stateBeforeCdata4 = ifElseState("T", BEFORE_CDATA_5, IN_DECLARATION); -Tokenizer.prototype._stateBeforeCdata5 = ifElseState("A", BEFORE_CDATA_6, IN_DECLARATION); - -Tokenizer.prototype._stateBeforeCdata6 = function(c){ - if(c === "["){ - this._state = IN_CDATA; - this._sectionStart = this._index + 1; - } else { - this._state = IN_DECLARATION; - this._index--; - } -}; - -Tokenizer.prototype._stateInCdata = function(c){ - if(c === "]") this._state = AFTER_CDATA_1; -}; - -Tokenizer.prototype._stateAfterCdata1 = characterState("]", AFTER_CDATA_2); - -Tokenizer.prototype._stateAfterCdata2 = function(c){ - if(c === ">"){ - //remove 2 trailing chars - this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2)); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if(c !== "]") { - this._state = IN_CDATA; - } - //else: stay in AFTER_CDATA_2 (`]]]>`) -}; - -Tokenizer.prototype._stateBeforeSpecial = function(c){ - if(c === "c" || c === "C"){ - this._state = BEFORE_SCRIPT_1; - } else if(c === "t" || c === "T"){ - this._state = BEFORE_STYLE_1; - } else { - this._state = IN_TAG_NAME; - this._index--; //consume the token again - } -}; - -Tokenizer.prototype._stateBeforeSpecialEnd = function(c){ - if(this._special === SPECIAL_SCRIPT && (c === "c" || c === "C")){ - this._state = AFTER_SCRIPT_1; - } else if(this._special === SPECIAL_STYLE && (c === "t" || c === "T")){ - this._state = AFTER_STYLE_1; - } - else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeScript1 = consumeSpecialNameChar("R", BEFORE_SCRIPT_2); -Tokenizer.prototype._stateBeforeScript2 = consumeSpecialNameChar("I", BEFORE_SCRIPT_3); -Tokenizer.prototype._stateBeforeScript3 = consumeSpecialNameChar("P", BEFORE_SCRIPT_4); -Tokenizer.prototype._stateBeforeScript4 = consumeSpecialNameChar("T", BEFORE_SCRIPT_5); - -Tokenizer.prototype._stateBeforeScript5 = function(c){ - if(c === "/" || c === ">" || whitespace(c)){ - this._special = SPECIAL_SCRIPT; - } - this._state = IN_TAG_NAME; - this._index--; //consume the token again -}; - -Tokenizer.prototype._stateAfterScript1 = ifElseState("R", AFTER_SCRIPT_2, TEXT); -Tokenizer.prototype._stateAfterScript2 = ifElseState("I", AFTER_SCRIPT_3, TEXT); -Tokenizer.prototype._stateAfterScript3 = ifElseState("P", AFTER_SCRIPT_4, TEXT); -Tokenizer.prototype._stateAfterScript4 = ifElseState("T", AFTER_SCRIPT_5, TEXT); - -Tokenizer.prototype._stateAfterScript5 = function(c){ - if(c === ">" || whitespace(c)){ - this._special = SPECIAL_NONE; - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index - 6; - this._index--; //reconsume the token - } - else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeStyle1 = consumeSpecialNameChar("Y", BEFORE_STYLE_2); -Tokenizer.prototype._stateBeforeStyle2 = consumeSpecialNameChar("L", BEFORE_STYLE_3); -Tokenizer.prototype._stateBeforeStyle3 = consumeSpecialNameChar("E", BEFORE_STYLE_4); - -Tokenizer.prototype._stateBeforeStyle4 = function(c){ - if(c === "/" || c === ">" || whitespace(c)){ - this._special = SPECIAL_STYLE; - } - this._state = IN_TAG_NAME; - this._index--; //consume the token again -}; - -Tokenizer.prototype._stateAfterStyle1 = ifElseState("Y", AFTER_STYLE_2, TEXT); -Tokenizer.prototype._stateAfterStyle2 = ifElseState("L", AFTER_STYLE_3, TEXT); -Tokenizer.prototype._stateAfterStyle3 = ifElseState("E", AFTER_STYLE_4, TEXT); - -Tokenizer.prototype._stateAfterStyle4 = function(c){ - if(c === ">" || whitespace(c)){ - this._special = SPECIAL_NONE; - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index - 5; - this._index--; //reconsume the token - } - else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeEntity = ifElseState("#", BEFORE_NUMERIC_ENTITY, IN_NAMED_ENTITY); -Tokenizer.prototype._stateBeforeNumericEntity = ifElseState("X", IN_HEX_ENTITY, IN_NUMERIC_ENTITY); - -//for entities terminated with a semicolon -Tokenizer.prototype._parseNamedEntityStrict = function(){ - //offset = 1 - if(this._sectionStart + 1 < this._index){ - var entity = this._buffer.substring(this._sectionStart + 1, this._index), - map = this._xmlMode ? xmlMap : entityMap; - - if(map.hasOwnProperty(entity)){ - this._emitPartial(map[entity]); - this._sectionStart = this._index + 1; - } - } -}; - - -//parses legacy entities (without trailing semicolon) -Tokenizer.prototype._parseLegacyEntity = function(){ - var start = this._sectionStart + 1, - limit = this._index - start; - - if(limit > 6) limit = 6; //the max length of legacy entities is 6 - - while(limit >= 2){ //the min length of legacy entities is 2 - var entity = this._buffer.substr(start, limit); - - if(legacyMap.hasOwnProperty(entity)){ - this._emitPartial(legacyMap[entity]); - this._sectionStart += limit + 1; - return; - } else { - limit--; - } - } -}; - -Tokenizer.prototype._stateInNamedEntity = function(c){ - if(c === ";"){ - this._parseNamedEntityStrict(); - if(this._sectionStart + 1 < this._index && !this._xmlMode){ - this._parseLegacyEntity(); - } - this._state = this._baseState; - } else if((c < "a" || c > "z") && (c < "A" || c > "Z") && (c < "0" || c > "9")){ - if(this._xmlMode); - else if(this._sectionStart + 1 === this._index); - else if(this._baseState !== TEXT){ - if(c !== "="){ - this._parseNamedEntityStrict(); - } - } else { - this._parseLegacyEntity(); - } - - this._state = this._baseState; - this._index--; - } -}; - -Tokenizer.prototype._decodeNumericEntity = function(offset, base){ - var sectionStart = this._sectionStart + offset; - - if(sectionStart !== this._index){ - //parse entity - var entity = this._buffer.substring(sectionStart, this._index); - var parsed = parseInt(entity, base); - - this._emitPartial(decodeCodePoint(parsed)); - this._sectionStart = this._index; - } else { - this._sectionStart--; - } - - this._state = this._baseState; -}; - -Tokenizer.prototype._stateInNumericEntity = function(c){ - if(c === ";"){ - this._decodeNumericEntity(2, 10); - this._sectionStart++; - } else if(c < "0" || c > "9"){ - if(!this._xmlMode){ - this._decodeNumericEntity(2, 10); - } else { - this._state = this._baseState; - } - this._index--; - } -}; - -Tokenizer.prototype._stateInHexEntity = function(c){ - if(c === ";"){ - this._decodeNumericEntity(3, 16); - this._sectionStart++; - } else if((c < "a" || c > "f") && (c < "A" || c > "F") && (c < "0" || c > "9")){ - if(!this._xmlMode){ - this._decodeNumericEntity(3, 16); - } else { - this._state = this._baseState; - } - this._index--; - } -}; - -Tokenizer.prototype._cleanup = function (){ - if(this._sectionStart < 0){ - this._buffer = ""; - this._index = 0; - this._bufferOffset += this._index; - } else if(this._running){ - if(this._state === TEXT){ - if(this._sectionStart !== this._index){ - this._cbs.ontext(this._buffer.substr(this._sectionStart)); - } - this._buffer = ""; - this._index = 0; - this._bufferOffset += this._index; - } else if(this._sectionStart === this._index){ - //the section just started - this._buffer = ""; - this._index = 0; - this._bufferOffset += this._index; - } else { - //remove everything unnecessary - this._buffer = this._buffer.substr(this._sectionStart); - this._index -= this._sectionStart; - this._bufferOffset += this._sectionStart; - } - - this._sectionStart = 0; - } -}; - -//TODO make events conditional -Tokenizer.prototype.write = function(chunk){ - if(this._ended) this._cbs.onerror(Error(".write() after done!")); - - this._buffer += chunk; - this._parse(); -}; - -Tokenizer.prototype._parse = function(){ - while(this._index < this._buffer.length && this._running){ - var c = this._buffer.charAt(this._index); - if(this._state === TEXT) { - this._stateText(c); - } else if(this._state === BEFORE_TAG_NAME){ - this._stateBeforeTagName(c); - } else if(this._state === IN_TAG_NAME) { - this._stateInTagName(c); - } else if(this._state === BEFORE_CLOSING_TAG_NAME){ - this._stateBeforeCloseingTagName(c); - } else if(this._state === IN_CLOSING_TAG_NAME){ - this._stateInCloseingTagName(c); - } else if(this._state === AFTER_CLOSING_TAG_NAME){ - this._stateAfterCloseingTagName(c); - } else if(this._state === IN_SELF_CLOSING_TAG){ - this._stateInSelfClosingTag(c); - } - - /* - * attributes - */ - else if(this._state === BEFORE_ATTRIBUTE_NAME){ - this._stateBeforeAttributeName(c); - } else if(this._state === IN_ATTRIBUTE_NAME){ - this._stateInAttributeName(c); - } else if(this._state === AFTER_ATTRIBUTE_NAME){ - this._stateAfterAttributeName(c); - } else if(this._state === BEFORE_ATTRIBUTE_VALUE){ - this._stateBeforeAttributeValue(c); - } else if(this._state === IN_ATTRIBUTE_VALUE_DQ){ - this._stateInAttributeValueDoubleQuotes(c); - } else if(this._state === IN_ATTRIBUTE_VALUE_SQ){ - this._stateInAttributeValueSingleQuotes(c); - } else if(this._state === IN_ATTRIBUTE_VALUE_NQ){ - this._stateInAttributeValueNoQuotes(c); - } - - /* - * declarations - */ - else if(this._state === BEFORE_DECLARATION){ - this._stateBeforeDeclaration(c); - } else if(this._state === IN_DECLARATION){ - this._stateInDeclaration(c); - } - - /* - * processing instructions - */ - else if(this._state === IN_PROCESSING_INSTRUCTION){ - this._stateInProcessingInstruction(c); - } - - /* - * comments - */ - else if(this._state === BEFORE_COMMENT){ - this._stateBeforeComment(c); - } else if(this._state === IN_COMMENT){ - this._stateInComment(c); - } else if(this._state === AFTER_COMMENT_1){ - this._stateAfterComment1(c); - } else if(this._state === AFTER_COMMENT_2){ - this._stateAfterComment2(c); - } - - /* - * cdata - */ - else if(this._state === BEFORE_CDATA_1){ - this._stateBeforeCdata1(c); - } else if(this._state === BEFORE_CDATA_2){ - this._stateBeforeCdata2(c); - } else if(this._state === BEFORE_CDATA_3){ - this._stateBeforeCdata3(c); - } else if(this._state === BEFORE_CDATA_4){ - this._stateBeforeCdata4(c); - } else if(this._state === BEFORE_CDATA_5){ - this._stateBeforeCdata5(c); - } else if(this._state === BEFORE_CDATA_6){ - this._stateBeforeCdata6(c); - } else if(this._state === IN_CDATA){ - this._stateInCdata(c); - } else if(this._state === AFTER_CDATA_1){ - this._stateAfterCdata1(c); - } else if(this._state === AFTER_CDATA_2){ - this._stateAfterCdata2(c); - } - - /* - * special tags - */ - else if(this._state === BEFORE_SPECIAL){ - this._stateBeforeSpecial(c); - } else if(this._state === BEFORE_SPECIAL_END){ - this._stateBeforeSpecialEnd(c); - } - - /* - * script - */ - else if(this._state === BEFORE_SCRIPT_1){ - this._stateBeforeScript1(c); - } else if(this._state === BEFORE_SCRIPT_2){ - this._stateBeforeScript2(c); - } else if(this._state === BEFORE_SCRIPT_3){ - this._stateBeforeScript3(c); - } else if(this._state === BEFORE_SCRIPT_4){ - this._stateBeforeScript4(c); - } else if(this._state === BEFORE_SCRIPT_5){ - this._stateBeforeScript5(c); - } - - else if(this._state === AFTER_SCRIPT_1){ - this._stateAfterScript1(c); - } else if(this._state === AFTER_SCRIPT_2){ - this._stateAfterScript2(c); - } else if(this._state === AFTER_SCRIPT_3){ - this._stateAfterScript3(c); - } else if(this._state === AFTER_SCRIPT_4){ - this._stateAfterScript4(c); - } else if(this._state === AFTER_SCRIPT_5){ - this._stateAfterScript5(c); - } - - /* - * style - */ - else if(this._state === BEFORE_STYLE_1){ - this._stateBeforeStyle1(c); - } else if(this._state === BEFORE_STYLE_2){ - this._stateBeforeStyle2(c); - } else if(this._state === BEFORE_STYLE_3){ - this._stateBeforeStyle3(c); - } else if(this._state === BEFORE_STYLE_4){ - this._stateBeforeStyle4(c); - } - - else if(this._state === AFTER_STYLE_1){ - this._stateAfterStyle1(c); - } else if(this._state === AFTER_STYLE_2){ - this._stateAfterStyle2(c); - } else if(this._state === AFTER_STYLE_3){ - this._stateAfterStyle3(c); - } else if(this._state === AFTER_STYLE_4){ - this._stateAfterStyle4(c); - } - - /* - * entities - */ - else if(this._state === BEFORE_ENTITY){ - this._stateBeforeEntity(c); - } else if(this._state === BEFORE_NUMERIC_ENTITY){ - this._stateBeforeNumericEntity(c); - } else if(this._state === IN_NAMED_ENTITY){ - this._stateInNamedEntity(c); - } else if(this._state === IN_NUMERIC_ENTITY){ - this._stateInNumericEntity(c); - } else if(this._state === IN_HEX_ENTITY){ - this._stateInHexEntity(c); - } - - else { - this._cbs.onerror(Error("unknown _state"), this._state); - } - - this._index++; - } - - this._cleanup(); -}; - -Tokenizer.prototype.pause = function(){ - this._running = false; -}; -Tokenizer.prototype.resume = function(){ - this._running = true; - - if(this._index < this._buffer.length){ - this._parse(); - } - if(this._ended){ - this._finish(); - } -}; - -Tokenizer.prototype.end = function(chunk){ - if(this._ended) this._cbs.onerror(Error(".end() after done!")); - if(chunk) this.write(chunk); - - this._ended = true; - - if(this._running) this._finish(); -}; - -Tokenizer.prototype._finish = function(){ - //if there is remaining data, emit it in a reasonable way - if(this._sectionStart < this._index){ - this._handleTrailingData(); - } - - this._cbs.onend(); -}; - -Tokenizer.prototype._handleTrailingData = function(){ - var data = this._buffer.substr(this._sectionStart); - - if(this._state === IN_CDATA || this._state === AFTER_CDATA_1 || this._state === AFTER_CDATA_2){ - this._cbs.oncdata(data); - } else if(this._state === IN_COMMENT || this._state === AFTER_COMMENT_1 || this._state === AFTER_COMMENT_2){ - this._cbs.oncomment(data); - } else if(this._state === IN_NAMED_ENTITY && !this._xmlMode){ - this._parseLegacyEntity(); - if(this._sectionStart < this._index){ - this._state = this._baseState; - this._handleTrailingData(); - } - } else if(this._state === IN_NUMERIC_ENTITY && !this._xmlMode){ - this._decodeNumericEntity(2, 10); - if(this._sectionStart < this._index){ - this._state = this._baseState; - this._handleTrailingData(); - } - } else if(this._state === IN_HEX_ENTITY && !this._xmlMode){ - this._decodeNumericEntity(3, 16); - if(this._sectionStart < this._index){ - this._state = this._baseState; - this._handleTrailingData(); - } - } else if( - this._state !== IN_TAG_NAME && - this._state !== BEFORE_ATTRIBUTE_NAME && - this._state !== BEFORE_ATTRIBUTE_VALUE && - this._state !== AFTER_ATTRIBUTE_NAME && - this._state !== IN_ATTRIBUTE_NAME && - this._state !== IN_ATTRIBUTE_VALUE_SQ && - this._state !== IN_ATTRIBUTE_VALUE_DQ && - this._state !== IN_ATTRIBUTE_VALUE_NQ && - this._state !== IN_CLOSING_TAG_NAME - ){ - this._cbs.ontext(data); - } - //else, ignore remaining data - //TODO add a way to remove current tag -}; - -Tokenizer.prototype.reset = function(){ - Tokenizer.call(this, {xmlMode: this._xmlMode, decodeEntities: this._decodeEntities}, this._cbs); -}; - -Tokenizer.prototype.getAbsoluteIndex = function(){ - return this._bufferOffset + this._index; -}; - -Tokenizer.prototype._getSection = function(){ - return this._buffer.substring(this._sectionStart, this._index); -}; - -Tokenizer.prototype._emitToken = function(name){ - this._cbs[name](this._getSection()); - this._sectionStart = -1; -}; - -Tokenizer.prototype._emitPartial = function(value){ - if(this._baseState !== TEXT){ - this._cbs.onattribdata(value); //TODO implement the new event - } else { - this._cbs.ontext(value); - } -}; - -},{"entities/lib/decode_codepoint.js":57,"entities/maps/entities.json":59,"entities/maps/legacy.json":60,"entities/maps/xml.json":61}],34:[function(require,module,exports){ -module.exports = Stream; - -var Parser = require("./Parser.js"), - WritableStream = require("stream").Writable || require("readable-stream").Writable; - -function Stream(cbs, options){ - var parser = this._parser = new Parser(cbs, options); - - WritableStream.call(this, {decodeStrings: false}); - - this.once("finish", function(){ - parser.end(); - }); -} - -require("util").inherits(Stream, WritableStream); - -WritableStream.prototype._write = function(chunk, encoding, cb){ - this._parser.write(chunk); - cb(); -}; -},{"./Parser.js":30,"readable-stream":3,"stream":23,"util":26}],35:[function(require,module,exports){ -var Parser = require("./Parser.js"), - DomHandler = require("domhandler"); - -function defineProp(name, value){ - delete module.exports[name]; - module.exports[name] = value; - return value; -} - -module.exports = { - Parser: Parser, - Tokenizer: require("./Tokenizer.js"), - ElementType: require("domelementtype"), - DomHandler: DomHandler, - get FeedHandler(){ - return defineProp("FeedHandler", require("./FeedHandler.js")); - }, - get Stream(){ - return defineProp("Stream", require("./Stream.js")); - }, - get WritableStream(){ - return defineProp("WritableStream", require("./WritableStream.js")); - }, - get ProxyHandler(){ - return defineProp("ProxyHandler", require("./ProxyHandler.js")); - }, - get DomUtils(){ - return defineProp("DomUtils", require("domutils")); - }, - get CollectingHandler(){ - return defineProp("CollectingHandler", require("./CollectingHandler.js")); - }, - // For legacy support - DefaultHandler: DomHandler, - get RssHandler(){ - return defineProp("RssHandler", this.FeedHandler); - }, - //helper methods - parseDOM: function(data, options){ - var handler = new DomHandler(options); - new Parser(handler, options).end(data); - return handler.dom; - }, - parseFeed: function(feed, options){ - var handler = new module.exports.FeedHandler(options); - new Parser(handler, options).end(feed); - return handler.dom; - }, - createDomStream: function(cb, options, elementCb){ - var handler = new DomHandler(cb, options, elementCb); - return new Parser(handler, options); - }, - // List of all events that the parser emits - EVENTS: { /* Format: eventname: number of arguments */ - attribute: 2, - cdatastart: 0, - cdataend: 0, - text: 1, - processinginstruction: 2, - comment: 1, - commentend: 0, - closetag: 1, - opentag: 2, - opentagname: 1, - error: 1, - end: 0 - } -}; - -},{"./CollectingHandler.js":28,"./FeedHandler.js":29,"./Parser.js":30,"./ProxyHandler.js":31,"./Stream.js":32,"./Tokenizer.js":33,"./WritableStream.js":34,"domelementtype":36,"domhandler":37,"domutils":40}],36:[function(require,module,exports){ -//Types of elements found in the DOM -module.exports = { - Text: "text", //Text - Directive: "directive", // - Comment: "comment", // - Script: "script", // diff --git a/code/Image/Image.js b/code/Image/Image.js index 3f9f01ae..800c9f60 100644 --- a/code/Image/Image.js +++ b/code/Image/Image.js @@ -19,6 +19,8 @@ * @fileOverview Defines the Image prototype. */ +app.addRepository("modules/helma/Http.js"); + markgettext('Image'); markgettext('image'); markgettext('a image // accusative'); @@ -256,10 +258,30 @@ Image.prototype.update = function(data) { var mime = data.file; var origin = data.file_origin; + var isLayout = (this.parent_type === 'Layout' || path && !!path.layout); if (!mime || mime.contentLength < 1) { if (origin && origin !== this.origin) { - mime = getURL(origin); + + var http = new helma.Http(); + + http.setBinaryMode(true); + + http.setHeader('Accept', 'image/*'); + http.setHeader('Accept-Encoding', 'gzip'); + http.setHeader('Cache-Control', 'no-cache'); + http.setHeader('Pragma', 'no-cache'); + http.setHeader('Referer', origin); + http.setHeader('User-Agent', req.data.http_browser); + + var response = http.getUrl(origin); + + mime = new Packages.helma.util.MimePart( + origin, + response.content, + response.type + ); + if (!mime) { throw Error(gettext('Could not fetch the file from the given URL.')); } @@ -274,27 +296,26 @@ Image.prototype.update = function(data) { throw Error(gettext('This does not seem to be a valid JPG, PNG or GIF image.')); } - this.origin = origin; var mimeName = mime.normalizeFilename(mime.name); this.contentLength = mime.contentLength; this.contentType = mime.contentType; + File.prototype.setOrigin.call(this, origin); if (!this.name) { - var name = File.getName(data.name) || mimeName.split('.')[0]; + var name = File.getName(data.name || mimeName.split('.')[0]); this.name = this.parent.images.getAccessName(name); } - if (!data.description && origin) { - data.description = gettext('Source: {0}', origin); - } - - var image = this.getConstraint(mime, res.handlers.site.imageDimensionLimits); - this.height = image.height; - this.width = image.width; - var thumbnail; - if (image.width > Image.THUMBNAILWIDTH) { - thumbnail = this.getConstraint(mime, [Image.THUMBNAILWIDTH]); + var image = this.getHelmaImage(mime, isLayout ? null : + res.handlers.site.imageDimensionLimits); + + this.width = image.width; + this.height = image.height; + + // Create a thumbnail version if the image size exceeds + if (this.width > Image.THUMBNAILWIDTH) { + thumbnail = this.getHelmaImage(mime, [Image.THUMBNAILWIDTH]); this.thumbnailWidth = thumbnail.width; this.thumbnailHeight = thumbnail.height; } else if (this.isPersistent()) { @@ -305,22 +326,26 @@ Image.prototype.update = function(data) { // Make the image persistent before proceeding with writing files and // setting tags (also see Helma bug #607) - this.isTransient() && this.persist(); - + if (this.isTransient()) this.persist(); var fileName = this.name + extension; + + // Remove existing image files if the file name has changed if (fileName !== this.fileName) { - // Remove existing image files if the file name has changed this.removeFiles(); } + this.fileName = fileName; - thumbnail && (this.thumbnailName = this.name + '_small' + extension); - this.writeFiles(image.resized || mime, thumbnail && thumbnail.resized); - image.resized && (this.contentLength = this.getFile().getLength()); + if (thumbnail) this.thumbnailName = this.name + '_small' + extension; + + this.writeFiles(image.data || mime, thumbnail && thumbnail.data); + this.contentLength = this.getFile().getLength(); } - if (this.parent_type !== 'Layout') { + // Layout images cannot be tagged + if (!isLayout) { this.setTags(data.tags || data.tag_array); } + this.description = data.description; this.touch(); return; @@ -374,7 +399,7 @@ Image.prototype.thumbnail_macro = function(param) { return this.render_macro(param); } param.src = encodeURI(this.getUrl(this.getThumbnailFile().getName())); - param.title || (param.title = encode(this.description)); + if (!param.title) { param.title = encode(this.description || ''); } param.alt = encode(param.alt || param.title); var width = param.width || this.thumbnailWidth; var height = param.height || this.thumbnailHeight; @@ -396,7 +421,7 @@ Image.prototype.thumbnail_macro = function(param) { */ Image.prototype.render_macro = function(param) { param.src = encodeURI(this.getUrl()); - param.title || (param.title = encode(this.description)); + if (!param.title) { param.title = encode(this.description || ''); } param.alt = encode(param.alt || param.title); var style = []; param.width && style.push('width:', param.width + 'px;'); @@ -410,6 +435,10 @@ Image.prototype.render_macro = function(param) { return; }; +Image.prototype.description_macro = function() { + File.prototype.description_macro.apply(this, arguments); +}; + /** * * @param {Object} name @@ -436,12 +465,14 @@ Image.prototype.getUrl = function(name) { name || (name = this.fileName); if (this.parent_type === 'Layout') { var layout = this.parent || res.handlers.layout; + var url = String.EMPTY; try { - return layout.site.getStaticUrl('layout/' + name); + url = layout.site.getStaticUrl('layout/' + name); } catch (ex) { console.error(ex); console.error(this.toSource()); } + return url; } var site = this.parent || res.handlers.site; return site.getStaticUrl('images/' + name); @@ -483,30 +514,49 @@ Image.prototype.getJSON = function() { * @throws {Error} * @returns {Object} */ -Image.prototype.getConstraint = function(mime, dimensionLimits) { +Image.prototype.getHelmaImage = function(mime, dimensionLimits) { + if (!dimensionLimits) dimensionLimits = []; + var maxWidth = dimensionLimits[0] || Infinity; var maxHeight = dimensionLimits[1] || Infinity; + + var result = { + data: null, + width: 0, + height: 0 + }; + try { var image = new helma.Image(mime.inputStream); var factorH = 1, factorV = 1; + if (maxWidth && image.width > maxWidth) { factorH = maxWidth / image.width; } + if (maxHeight && image.height > maxHeight) { factorV = maxHeight / image.height; } + if (factorH !== 1 || factorV !== 1) { var width = Math.ceil(image.width * (factorH < factorV ? factorH : factorV)); var height = Math.ceil(image.height * (factorH < factorV ? factorH : factorV)); + image.resize(width, height); + if (mime.contentType.endsWith('gif')) { image.reduceColors(256); } - return {resized: image, width: image.width, height: image.height}; + + result.data = image; } - return {width: image.width, height: image.height}; + + result.width = image.width; + result.height = image.height; + return result; + } catch (ex) { app.log(ex); throw Error(gettext('Could not resize the image.')); diff --git a/code/Image/Image.properties b/code/Image/Image.properties index 95e4678d..664b3e75 100644 --- a/code/Image/Image.properties +++ b/code/Image/Image.properties @@ -19,7 +19,7 @@ _db = antville _table = image _id = id _prototype = prototype -_parent = parent.images, parent +_parent = parent.images name prototype diff --git a/code/Image/Image.skin b/code/Image/Image.skin index 8179898b..78e80bc1 100644 --- a/code/Image/Image.skin +++ b/code/Image/Image.skin @@ -3,13 +3,13 @@ -
- - <% image.render %> -
- <% image.description default=<% image.name %> %> -
-
+
+
+ + <% image.render class='uk-thumbnail' %> + + <% image.description prefix="
" suffix=
%> +
<% image.link edit <% gettext Edit %> class='uk-button' %> diff --git a/code/Images/$Images.skin b/code/Images/$Images.skin index 2acbe201..f40006b0 100644 --- a/code/Images/$Images.skin +++ b/code/Images/$Images.skin @@ -33,48 +33,56 @@
- diff --git a/code/Layout/$Layout.skin b/code/Layout/$Layout.skin index 6c2273fb..b2878894 100644 --- a/code/Layout/$Layout.skin +++ b/code/Layout/$Layout.skin @@ -1,92 +1,101 @@ <% #main %>

<% response.title %>

+ +
- <% layout.link skins <% gettext Skins %> %> - <% layout.link images <% gettext Images %> prefix=' | ' %> - <% layout.link import <% gettext Import %> prefix=' | ' %> - <% layout.link export <% gettext Export %> prefix=' | ' %> + <% layout.link skins <% gettext Skins %> %> + <% layout.link images <% gettext Images %> prefix=' | ' %> + <% layout.link import <% gettext Import %> prefix=' | ' %> + <% layout.link export <% gettext Export %> prefix=' | ' %>
+ <% site.skin $Site#noscript %> +
-
-
- <% gettext 'Show Controls' %> +
+
+ <% gettext 'Show Controls' %> +
+ +
+ is true then checked %>> + +
+
+ +
+
+ + <% gettext Settings %> + +
+ <% layout.values %>
-
- is true then checked %>> - + -
-
-
- - <% gettext Settings %> - -
- <% layout.values %> -
-
-
 
- -
-
-
-
- - <% layout.link reset <% gettext Reset %> class='uk-button' %> - <% gettext Cancel %> -
+
+
+ +
+ + <% layout.link reset <% gettext Reset %> class='uk-button' %> + <% gettext Cancel %> +
- <% #value %> -
+
<% param.title %> - - +
@@ -97,7 +106,7 @@ <% #import %>

<% response.title %>

-
+ <% layout.upload upload %>
- <% gettext Cancel %> + <% gettext Cancel %> +
+ + +<% #terms %> +
+ +
+ +<% #privacy %> +
+ +
+ +<% #accept %> +

<% response.title %>

+<% gettext "We have updated our terms and conditions. Please reaffirm you understand and accept the following:" %> +
+ <% if <% root.termsStory %> is null then '' else <% members.skin $Members#terms %> %> + <% if <% root.privacyStory %> is null then '' then <% members.skin $Members#privacy %> %> +
+ + <% gettext Cancel %>
- <% #reset %>

<% response.title %>

@@ -223,3 +241,7 @@
+ +<% #captcha %> +
+ diff --git a/code/Members/Members.js b/code/Members/Members.js index 1c15ecbf..112b6f84 100644 --- a/code/Members/Members.js +++ b/code/Members/Members.js @@ -40,19 +40,27 @@ markgettext('members'); */ Members.prototype.getPermission = function(action) { switch (action) { + case 'accept': case 'login': case 'logout': - case 'register': case 'reset': case 'salt.txt': return true; + + case 'register': + return !root.creator || root.loginScope === Admin.NONE || User.require(root.loginScope); } var sitePermission = this._parent.getPermission('main'); switch (action) { + case 'delete': + return session.user && session.user.getPermission(action); + case 'edit': + case 'export': case 'subscriptions': + case 'timeline': case 'updates': return !!session.user; @@ -80,23 +88,37 @@ Members.prototype.main_action = function() { Members.prototype.register_action = function() { if (req.postParams.register) { try { - var title = res.handlers.site.title; - var user = User.register(req.postParams); - var membership = Membership.add(user, Membership.SUBSCRIBER, this._parent); + Captcha.verify(req.postParams); + + if (root.termsStory && !req.postParams.terms) throw Error('Please accept the terms and conditions.'); + if (root.privacyStory && !req.postParams.privacy) throw Error('Please accept the data privacy statement.'); + + const title = res.handlers.site.title; + const user = User.register(req.postParams); + const membership = Membership.add(user, Membership.SUBSCRIBER, this._parent); + + user.accepted = Date.now(); + membership.notify(req.action, user.email, gettext('[{0}] Welcome to {1}!', root.title, title)); + res.message = gettext('Welcome to “{0}”, {1}. Have fun!', title, user.name); + res.redirect(User.getLocation() || this._parent.href()); } catch (ex) { res.message = ex; } } + const param = { captcha: Captcha.render(this) }; + session.data.token = User.getSalt(); + res.data.action = this.href(req.action); res.data.title = gettext('Register'); - res.data.body = this.renderSkinAsString('$Members#register'); + res.data.body = this.renderSkinAsString('$Members#register', param); + this._parent.renderSkin('Site#page'); return; } @@ -105,11 +127,11 @@ Members.prototype.reset_action = function() { if (req.postParams.reset) { try { if (!req.postParams.name || !req.postParams.email) { - throw Error(gettext('Please enter a user name and e-mail address.')); + throw Error(gettext('Please enter a username and e-mail address.')); } var user = User.getByName(req.postParams.name); if (!user || user.email !== req.postParams.email) { - throw Error(gettext('User name and e-mail address do not match.')) + throw Error(gettext('Username and e-mail address do not match.')) } var token = User.getSalt(); user.setMetadata('resetToken', token); @@ -160,6 +182,25 @@ Members.prototype.login_action = function() { if (req.postParams.login) { try { var user = User.login(req.postParams); + + if (!User.require(root.loginScope, user)) { + throw Error(gettext('Sorry, logging in is currently not possible.')); + } + + // Check if terms and conditions have been updated + var accepted = user.accepted || 0; + + if ([root.termsStory, root.privacyStory].some(story => { + if (story) { + story = HopObject.getFromPath(story, 'stories'); + return story && story.modified - accepted > 0; + } + })) { + User.logout(); + session.data.login = req.postParams; + res.redirect(this.href('accept')); + } + res.message = gettext('Welcome to {0}, {1}. Have fun!', res.handlers.site.getTitle(), user.name); res.redirect(User.getLocation() || this._parent.href()); } catch (ex) { @@ -186,29 +227,29 @@ Members.prototype.logout_action = function() { } Members.prototype.edit_action = function() { - if (req.postParams.save) { - try { - session.user.update(req.postParams); - res.message = gettext('The changes were saved successfully.'); - res.redirect(this.href(req.action)); - } catch (err) { - res.message = err.toString(); - } - } - session.data.token = User.getSalt(); - session.data.salt = session.user.salt; - res.data.title = gettext('Account'); - res.data.body = session.user.renderSkinAsString('$User#edit'); - this._parent.renderSkin('Site#page'); - return; -} + res.handlers.context = this; + return void User.prototype.edit_action.call(session.user); +}; + +Members.prototype.export_action = function() { + res.handlers.context = this; + return void User.prototype.export_action.call(session.user); +}; + +Members.prototype.timeline_action = function() { + res.handlers.context = this; + return void User.prototype.timeline_action.call(session.user); +}; + +Members.prototype.delete_action = function() { + res.handlers.context = this; + return void User.prototype.delete_action.call(session.user); +}; Members.prototype.salt_txt_action = function() { res.contentType = 'text/plain'; - var user; - if (user = User.getByName(req.queryParams.user)) { - res.write(user.salt || String.EMPTY); - } + const user = User.getByName(req.queryParams.user); + if (user) res.write(user.salt || String.EMPTY); return; } @@ -314,6 +355,33 @@ Members.prototype.add_action = function() { return; } +Members.prototype.accept_action = function() { + if (!session.data.login) { res.redirect(this._parent.href()); } + + if (req.postParams.accept) { + try { + if (root.termsStory && !req.postParams.terms) { + throw Error(gettext('Please accept the terms and conditions.')); + } + + if (root.privacyStory && !req.postParams.privacy) { + throw Error(gettext('Please accept the data privacy statement.')); + } + + User.login(session.data.login); + session.data.login = null; + session.user.accepted = Date.now(); + res.message = gettext('Welcome to {0}, {1}. Have fun!', res.handlers.site.getTitle(), session.user.name); + res.redirect(User.getLocation() || this._parent.href()); + } catch (err) { + res.message = err.toString(); + } + } + res.data.title = gettext('Updated Terms & Conditions'); + res.data.body = this.renderSkinAsString('$Members#accept'); + res.handlers.site.renderSkin('Site#page'); +}; + /** * * @param {String} searchString @@ -355,7 +423,7 @@ Members.prototype.search = function(searchString, limit) { Members.prototype.addMembership = function(data) { var user = root.users.get(data.name); if (!user) { - throw Error(gettext('Sorry, your input did not match any registered user.')); + throw Error(gettext('Sorry, your input did not match any registered account.')); /*} else if (this.get(data.name)) { throw Error(gettext('This user is already a member of this site.'));*/ } diff --git a/code/Membership/$Membership.skin b/code/Membership/$Membership.skin index 56da5a72..4897ceae 100644 --- a/code/Membership/$Membership.skin +++ b/code/Membership/$Membership.skin @@ -70,6 +70,7 @@ + <% param.captcha prefix="
" suffix='
' %>
+ <% site.link delete <% gettext Delete %> class='uk-button' %> <% gettext Cancel %>
- <% #meta %> + + + -<% // Facebook is very picky with locales (e.g. complains about 'de' and 'en_AU') %> -<% //site.locale prefix="" %> -<% response.title prefix="" %> -<% response.description prefix="" %> - -<% response.title prefix="" %> -<% response.description prefix="" %> -<% response.title prefix="" %> -<% response.description prefix="" %> +<% // Facebook is very picky with locales (e.g. complains about 'de' and 'en_AU') %> +<% //site.locale prefix="" %> <% response.images %> <% response.videos %> @@ -225,6 +269,10 @@ +<% #menuButton %> + + + <% #admin %>
@@ -285,6 +333,13 @@
<% response.result %>
+<% if <% property search.provider %> is null then '' else <% site.skin $Site#moreResults %> %> + +<% #moreResults %> + + <% gettext 'Search with {0}' <% property search.provider | replace 'https?://([^/]+).*' '$1' %> %> + + <% #opensearchdescription %> @@ -297,52 +352,6 @@ -<% #page %> - -> - - - <% response.title %> - - - - - - - - - - - - - <% site.skin $Site#header %> -
-
- <% response.message prefix="
" suffix=
%> - <% response.body %> -
-
-
- <% membership.status %> -
    -
  • - <% site.skin Site#navigation %> -
  • -
  • - <% site.skin Site#search %> -
  • -
  • -
  • - <% site.calendar %> -
  • -
-
-
-
- <% site.skin $Site#footer %> - - - <% #header %>
'>
@@ -360,36 +369,30 @@

-
<% gettext 'Created {0}' <% site.created text %> %>.
-
<% gettext 'Last modified {0}' <% site.modified text %> %>.
+
<% if <% site.created %> then <% gettext 'Created {0}' <% site.created text %> %> suffix=. %>
+
<% if <% site.modified %> then <% gettext 'Last modified {0}' <% site.modified text %> %> suffix=. %>
- <% image /smallchaos.gif | link http://antville.org %> & + <% image /smallchaos.gif | link https://antville.org %> & <% image /helma.png | link http://helma.org %>
<% #javascript %> -$(function () { - // Unhide hidden links triggering JavaScript - $('a[href="javascript:"]:hidden').css('display', 'inline-block'); - - // Injecting main.css if necessary for compatibility reasons - if (!document.querySelector('link[href="<% site.href main.css %>"]')) { - var link = document.createElement('link'); - link.href = '<% site.href main.css %>'; - link.rel = 'stylesheet'; - link.type = 'text/css'; - document.head.appendChild(link); - } -}); +// Injecting main.css if necessary for compatibility reasons +if (!document.querySelector('link[href="<% site.href main.css %>"]')) { + const link = document.createElement('link'); + link.href = '<% site.href main.css %>'; + link.rel = 'stylesheet'; + document.head.appendChild(link); +} <% site.skin Site#javascript | script %> <% #include %> -(function (url) { - var script = document.createElement('script'); - script.type = 'text/javascript'; +// The void operator is necessary or we get some wicked error from browserify(?) +void (function(url) { + const script = document.createElement('script'); script.src = url; document.head.appendChild(script); })('<% param.href %>'); @@ -400,7 +403,7 @@ $(function () { // FIXME: compatibility @base-font: <% value 'base font' default='Helvetica Neue, Helvetica, Arial, sans-serif' %>; -@base-font-size: <% value 'base font size' default="'14px / 20px'" %>; +@base-font-size: <% value 'base font size' default="14px e('/') 20px" %>; @base-font-color: <% value 'base font color' default=#444 %>; @big-font: <% value 'big font' default=@base-font %>; @@ -435,6 +438,11 @@ html, html.uk-notouch, body { font-family: @text-font; } +body.av-16, body.av-page { + max-width: 900px; + margin: auto 5%; +} + h1, h2, h3, h4, h5, h6 { color: @title-color; font-family: @title-font; @@ -442,9 +450,11 @@ h1, h2, h3, h4, h5, h6 { a { color: @link-color; + &:hover { color: @hover-color; } + &[href='javascript:'] { display: none; } @@ -458,7 +468,10 @@ em { } img { - max-width: initial; // FIXME: compatibility + body:not(.av-16) &, table & { + max-width: initial; // FIXME: compatibility + } + &[src$='pixel.gif'] { width: initial; height: initial; @@ -477,8 +490,12 @@ hr { color: @muted-color !important; } -.uk-table-striped tbody tr:hover, .uk-table-striped tbody tr:nth-of-type(odd) { - background: inherit; +.uk-table-striped tbody tr:nth-of-type(odd) { + background: darken(@background, 2%); +} + +.uk-table-striped tbody tr:hover { + background: fadeout(@link-color, 88%); } .uk-button-group.av-link-group a { @@ -518,6 +535,7 @@ hr { border-color: @link-color; text-shadow: initial; } + &:hover { background-color: @background; color: @hover-color; @@ -526,7 +544,7 @@ hr { } } -.uk-button:not(.uk-button-success) { +.uk-button:not(.uk-button-success):not([disabled]) { text-shadow: initial !important; &, &:link, &:visited { @@ -534,26 +552,32 @@ hr { color: @text-color; border-color: @text-color; } + &:hover { background-color: @background; color: @hover-color; border-color: @hover-color; } + &.uk-button-link { border: initial; + &:link, &:visited { color: @link-color; } + &:hover { color: @hover-color; } } + &.uk-button-primary { background-color: @background; border-style: double; border-color: @link-color; color: @link-color; font-weight: bold; + &:hover { background: inherit; border-color: @hover-color; @@ -562,24 +586,31 @@ hr { } } +&.uk-button-primary[disabled] { + font-weight: bold; +} + .uk-pagination { & > li > a { background: @background; color: @link-color; border-color: @link-color; text-shadow: initial; + &:hover { background: @background; color: @hover-color; border-color: @hover-color; } } + & > .uk-active > span { background: @background; border-color: @text-color; color: @text-color; font-weight: bold; } + & > .uk-disabled > span { background: @muted-background; color: @muted-color; @@ -592,6 +623,7 @@ hr { &:link, &:visited { color: @link-color; } + &:hover { color: @hover-color; } @@ -605,13 +637,16 @@ hr { } .uk-thumbnail img { - max-width: 100%; + body:not(.av-16) & { + max-width: 100%; + } } h1 a, .uk-table a { &:visited { color: @link-color; } + &:hover { color: @hover-color; } @@ -628,7 +663,23 @@ h1 a, .uk-table a { width: 100%; } -.uk-form select, .uk-form textarea, .uk-form input:not([type]), .uk-form input[type="text"], .uk-form input[type="password"], .uk-form input[type="datetime"], .uk-form input[type="datetime-local"], .uk-form input[type="date"], .uk-form input[type="month"], .uk-form input[type="time"], .uk-form input[type="week"], .uk-form input[type="number"], .uk-form input[type="email"], .uk-form input[type="url"], .uk-form input[type="search"], .uk-form input[type="tel"], .uk-form input[type="color"] { +.uk-form select, +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="datetime"], +.uk-form input[type="datetime-local"], +.uk-form input[type="date"], +.uk-form input[type="month"], +.uk-form input[type="time"], +.uk-form input[type="week"], +.uk-form input[type="number"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="color"] { border-color: @border-color; } @@ -638,7 +689,7 @@ h4 + .uk-comment-meta li:first-child { } .av-page { - width: 900px; // FIXME: Could we use the `vw` unit already? + overflow: auto; } .av-sprite { @@ -651,8 +702,9 @@ h4 + .uk-comment-meta li:first-child { margin: 0 0 -2px -2px; width: 15px; height: 15px; - background: url(/static/img/ant.svg); + background-image: url(/static/img/ant.svg); background-size: 15px 15px; + background-repeat: no-repeat; } .av-border-left { @@ -740,8 +792,10 @@ h4 + .uk-comment-meta li:first-child { .av-collage { padding: 0; + .av-tagged-image { opacity: 0; + img { max-width: 100%; display: inline-block; @@ -750,6 +804,7 @@ h4 + .uk-comment-meta li:first-child { vertical-align: bottom; opacity: 1; } + .Caption_Content { color: #fff; padding: 10px; @@ -780,10 +835,10 @@ h4 + .uk-comment-meta li:first-child { } .av-header-bg-dots { - margin-left: 222px; position: relative; top: -46px; - width: 900px - 274px + 54px; + margin-left: 222px; + margin-right: -5.6%; height: 38px; background: url('<% image /dot.gif url %>'); } @@ -791,11 +846,17 @@ h4 + .uk-comment-meta li:first-child { .av-title { position: absolute; top: 13px; - overflow: visible; + width: 100%; + height: 100%; + overflow-x: hidden; white-space: nowrap; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 25px; font-weight: bold; + + img { + max-width: initial; + } } // The root site gets the beautiful logo with ant animation @@ -807,6 +868,68 @@ h4 + .uk-comment-meta li:first-child { } } +.av-menu { + & .av-menu-toggle { + display: none; + } +} + +@media (max-width: 767px) { + .av-menu { + @top: 14px; + @right: 5%; + @size: 30px; + + i.av-menu-toggle { + .av-ant; + padding: 2px; + border-radius: 100%; + background-color: fadeout(@background, 20%); + background-size: @size @size; + background-position: 2px 2px; + } + + i.av-menu-toggle, + input.av-menu-toggle { + display: initial; + position: absolute; + top: @top; + right: @right; + width: @size; + height: @size; + margin-right: 2px; + } + + input.av-menu-toggle { + z-index: 9; + opacity: 0; + + &:checked { + position: fixed; + width: 100%; + height: 100%; + + & ~ .av-navigation { + display: initial; + } + } + } + + .av-navigation { + display: none; + position: fixed; + top: 0; + right: 0; + bottom: 0; + z-index: 10; + padding: 10pt 10pt 10pt 0; + background-color: fadeout(@background, 10%); + box-shadow: -5px 0 5px 0 @border-color; + overflow: auto; + } + } +} + .av-skin-active { background: #fff; opacity: .25; @@ -841,6 +964,11 @@ h4 + .uk-comment-meta li:first-child { text-decoration: none !important; } +.av-rtl { + unicode-bidi: bidi-override; + direction: rtl; +} + // Overwriting some Helma and Jala classes for debugging and calendar integration .helma-debug-line /*:has(script)*/ { @@ -849,6 +977,7 @@ h4 + .uk-comment-meta li:first-child { .jala-calendar { width: 100%; + max-width: 200px; text-align: center; tbody th { @@ -1000,15 +1129,14 @@ a.gs-title:hover { <% response.list %>
<% gettext Date %> <% gettext Method %> <% gettext Reference %><% gettext Name %> <% gettext Account %>
<% item.notes prefix="" %> + <% item.link delete "" %> <% admin.link block "" <% item.self %> %> <% item.link edit "" %>
<% param.icon %><% param.site %> + <% param.date | format text %> + + <% param.reference %> +
<% item.date | format short %> <% gettext <% item.method %> | titleize %> <% item.target.name %><% item.name %> <% item.user.name %><% admin.link <% item.target.id prefix='job?delete=' %> "" %> + + + +
<% file.requests %> <% file.name | file.link %> <% file.contentLength %> <% file.creator %> <% file.modified text %> ' data-value="<% file.macro %>"> <% file.link delete "" %> @@ -24,7 +24,7 @@ <% site.skin $Site#noscript %> -
+
-
+
@@ -64,11 +64,3 @@ <% gettext Cancel %>
- diff --git a/code/File/File.js b/code/File/File.js index f8247a57..9b20a27d 100644 --- a/code/File/File.js +++ b/code/File/File.js @@ -65,11 +65,8 @@ File.remove = function() { * @param {String} name */ File.getName = function(name) { - if (name) { - //return name.replace(/[^\w\d\s._-]/g, String.EMPTY); - return String(name).trim().replace(/[\/\\:;?+\[\]{}|#"`<>^]/g, String.EMPTY); - } - return null; + // TODO: Maybe return a hash if name is undefined? + return name ? String(name).replace(/[^\w\d\s,._-]/g, String.EMPTY) : null; } File.getGenericType = function (contentType) { @@ -273,20 +270,16 @@ File.prototype.update = function(data) { } if (mime.contentLength > 0) { - this.origin = origin; var mimeName = mime.normalizeFilename(mime.name); this.contentLength = mime.contentLength; this.contentType = mime.contentType; + this.setOrigin(origin); if (!this.name) { var name = File.getName(data.name) || mimeName.split('.')[0]; this.name = this.site.files.getAccessName(name); } - if (!data.description && origin) { - data.description = gettext('Source: {0}', origin); - } - // Make the file persistent before proceeding with writing // it to disk (also see Helma bug #607) this.isTransient() && this.persist(); @@ -331,6 +324,19 @@ File.prototype.contentType_macro = function (param, mode) { return res.write(this.contentType); } +File.prototype.description_macro = function(param) { + if (this.description) { + res.write(this.description); + } else if (param['default']) { + res.write(param['default']); + } else if (this.origin) { + var text = this.origin.replace(new RegExp('^.+:///?(?:www\.)?([^/]+).*$'), '$1'); + var link = html.linkAsString({href: this.origin}, text); + res.write(gettext('Source: {0}', link)); + } + return; +}; + /** * */ @@ -347,6 +353,10 @@ File.prototype.getUrl = function() { return site.getStaticUrl('files/' + this.fileName); } +File.prototype.setOrigin = function(origin) { + if (/(?:https?|ftp)/i.test(origin)) this.origin = origin; +}; + /** * @returns {String} */ diff --git a/code/Files/$Files.skin b/code/Files/$Files.skin index 3ed111f2..abe3043b 100644 --- a/code/Files/$Files.skin +++ b/code/Files/$Files.skin @@ -10,12 +10,12 @@
<% gettext Name %><% gettext Size %> <% gettext Account %> <% gettext Modified %>
<% param.text %>
- <% #referrer %> @@ -1132,23 +1255,20 @@ a.gs-title:hover { <% param.referrer | link %> - + -<% #deleted %> -

<% gettext "This site is going to be deleted completely and irreversibly after {0}." <% site.deleted | format long %> %>

- <% #export %>

<% gettext "Export Site Data" %>

- <% if <% param.status %> is null then <% if <% file.self %> is null then '' else <% gettext "Download the file {0} or klick “Start” to create a new one." <% file.skin File#main %> '' <% file.created | format short %> '' %> %> else <% param.status %> %> + <% if <% param.status %> is null then <% if <% site.export %> is null then '' else <% gettext "{0}Download the archive{1} or click “Export” to create a new one." <% site.export prefix="" %> "" %> %> else <% param.status %> %>

-
- - <% gettext Cancel %> + <% gettext Settings %>
<% #import %> @@ -1201,12 +1321,11 @@ a.gs-title:hover { <% #menuExt %> - diff --git a/code/Site/Site.js b/code/Site/Site.js index f4ba3ffe..0f9ce029 100644 --- a/code/Site/Site.js +++ b/code/Site/Site.js @@ -29,8 +29,7 @@ this.handleMetadata('callbackUrl'); this.handleMetadata('closed'); this.handleMetadata('commentMode'); this.handleMetadata('configured'); -this.handleMetadata('deleted'); -this.handleMetadata('export_id'); +this.handleMetadata('export'); this.handleMetadata('imageDimensionLimits'); this.handleMetadata('import_id'); this.handleMetadata('job'); @@ -51,23 +50,21 @@ this.handleMetadata('trollFilter'); * @returns {String[]} * @see defineConstants */ -Site.getStatus = defineConstants(Site, markgettext('Blocked'), +Site.getStatus = defineConstants(Site, markgettext('Deleted'), markgettext('Blocked'), markgettext('Regular'), markgettext('Trusted')); /** * @function * @returns {String[]} * @see defineConstants */ -Site.getModes = defineConstants(Site, markgettext('Deleted'), - markgettext('Closed'), markgettext('Restricted'), +Site.getModes = defineConstants(Site, markgettext('Closed'), markgettext('Restricted'), markgettext('Public'), markgettext('Open')); /** * @function * @returns {String[]} * @see defineConstants */ -Site.getPageModes = defineConstants(Site, markgettext('days') /* , - markgettext('stories') */ ); +Site.getPageModes = defineConstants(Site, markgettext('days')/*, markgettext('stories') */ ); /** * @function * @returns {String[]} @@ -156,20 +153,38 @@ Site.add = function(data, user) { * @param {Site} site */ Site.remove = function() { - if (this.constructor === Site || this === root) { - HopObject.remove.call(this.stories); - HopObject.remove.call(this.images); - HopObject.remove.call(this.files); - HopObject.remove.call(this.polls); - HopObject.remove.call(this.entries); - HopObject.remove.call(this.members, {force: true}); - Layout.remove.call(this.layout, {force: true}); - this.getStaticFile().removeDirectory(); - this.deleteMetadata(); - this.remove(); - } - return; -} + if (this.constructor !== Site || this === root) return; + + const sql = new Sql(); + const id = this._id; + const dir = this.getStaticFile(); + + app.log('Removing site #' + id); + this.remove(); + root.cache.sites = null; + + sql.execute('delete from site where id = $0', id); + + sql.execute('delete from content where site_id = $0', id); + sql.execute('delete from file where site_id = $0', id); + sql.execute('delete from membership where site_id = $0', id); + + sql.execute("delete from image where parent_type = 'Site' and parent_id = $0", id); + sql.execute("delete from metadata where parent_type = 'Site' and parent_id = $0", id); + + sql.execute('delete from skin where layout_id in (select id from layout where site_id = $0)', id); + sql.execute('delete from layout where site_id = $0', id); + + sql.execute('delete from tag_hub where tag_id in (select id from tag where site_id = $0)', id); + sql.execute('delete from tag where site_id = $0', id); + + let subQuery = 'select id from poll where site_id'; + sql.execute('delete from vote where choice_id in (select id from choice where poll_id in ($0 = $1))', subQuery, id); + sql.execute('delete from choice where poll_id in ($0 = $1)', subQuery, id); + sql.execute('delete from poll where site_id = $0', id); + + dir.removeDirectory(); +}; /** * @@ -200,8 +215,7 @@ Site.require = function(mode) { * @property {String} commentMode The way comments of a site are displayed * @property {Date} created The date and time of site creation * @property {User} creator A reference to a user who created a site - * @property {Date} deleted - * @property {String} export_id + * @property {String} export * @property {Files} files * @property {Tags} galleries * @property {Images} images @@ -249,7 +263,9 @@ Site.prototype.getPermission = function(action) { case 'search.xml': case 'user.js': return true; + } + switch (action) { case '.': case 'main': case 'comments.xml': @@ -265,7 +281,7 @@ Site.prototype.getPermission = function(action) { User.require(User.PRIVILEGED); case 'delete': - return this !== root && this.getPermission('edit'); + return this !== root && this.status !== Site.DELETED && this.getPermission('edit'); case 'edit': case 'export': @@ -289,15 +305,19 @@ Site.prototype.getPermission = function(action) { } Site.prototype.main_action = function() { + res.dependsOn(this.modified); + res.digest(); + this.renderPage({ type: 'website', schema: 'http://schema.org/WebSite', title: this.getTitle(), description: this.tagline || String.EMPTY, - body: this.renderSkinAsString(this.mode === Site.DELETED ? '$Site#deleted' : 'Site#main'), + body: this.renderSkinAsString('Site#main'), images: [(this.layout.images.get('favicon') || Images.Default['favicon.png']).getUrl()], links: this.renderSkinAsString('$Site#links') }); + this.log(); return; }; @@ -328,17 +348,15 @@ Site.prototype.delete_action = function () { HopObject.prototype.delete_action.call(this); } else { // Otherwise, queue for deletion - this.deleted = new Date; - this.status = Site.BLOCKED; - this.mode = Site.DELETED; - res.message = gettext('The site {0} is queued for removal.', this.name); + this.status = Site.DELETED; + res.message = gettext('The site {0} is being deleted.', this.name); } this.log(root, 'Deleted site ' + this.name); - res.redirect(this.href()); + res.redirect(root.href()); } else { HopObject.prototype.delete_action.call(this); } -} +}; /** * @@ -402,12 +420,10 @@ Site.prototype.getConfirmExtra = function () { * @param {Object} data */ Site.prototype.update = function(data) { - if (this.mode !== Site.DELETED && data.mode === Site.DELETED) { - this.deleted = new Date; - } else if (this.job && this.mode === Site.DELETED && data.mode !== Site.DELETED) { - var job = new Admin.Job(this.job); - job.remove(); - this.job = null; + // Remove the corresponding job if site deletion is cancelled + if (this.job && this.status === Site.DELETED && this.status !== data.status) { + let job = new Admin.Job(this.job); + if (job.method === 'remove') job.remove(); } data.maxImageWidth = Math.abs(data.maxImageWidth) || Infinity; @@ -452,22 +468,15 @@ Site.prototype.main_css_action = function() { res.dependsOn((new Skin('Site', 'stylesheet')).getStaticFile().lastModified()); res.digest(); - // FIXME: This prevents the UIKit fonts from loading (wrong path) - //var file = new java.io.File(root.getStaticFile('../../styles/main.min.css')); - //res.writeln(Packages.org.apache.commons.io.FileUtils.readFileToString(file, 'utf-8')); - - var coreCss = this.renderSkinAsString('$Site#stylesheet'); - var customCss = this.renderSkinAsString('Site#stylesheet'); - - lessParser.parse(coreCss, function (error, tree) { - if (error) throw error; - coreCss = tree.toCSS(); - }); + res.push(); + this.renderSkin('$Site#stylesheet'); + this.renderSkin('Site#stylesheet'); + var css = res.pop(); try { - lessParser.parse(customCss, function(error, tree) { + lessParser.parse(css, function(error, less) { if (error) throw error; - customCss = tree.toCSS(); + res.write(less.toCSS()); }); } catch (ex) { var message = [ex.type, 'error in line', ex.line, 'column', ex.column, 'of', ex.filename + ':', ex.message/*, '/', ex.extract[1]*/].join(String.SPACE); @@ -476,10 +485,9 @@ Site.prototype.main_css_action = function() { res.writeln(message) res.writeln('**/'); console.error(message); + res.write(css); } - res.writeln(coreCss); - res.writeln(customCss); return; } @@ -560,7 +568,7 @@ Site.prototype.renderPage = function (parts) { property: 'og:image', name: 'twitter:image', itemprop: 'image', - content: encodeURI(url) + content: url }); }).join('\n'); } @@ -568,7 +576,7 @@ Site.prototype.renderPage = function (parts) { res.data.videos = parts.videos.map(function (url) { return html.tagAsString('meta', { property: 'og:video', - content: encodeURI(url) + content: url }); }).join('\n'); } @@ -581,82 +589,48 @@ Site.prototype.renderPage = function (parts) { * @param {Story[]} collection */ Site.prototype.renderXml = function(collection) { - collection || (collection = this.stories.recent); + if (!collection) collection = this.stories.recent; + var now = new Date; var feed = new rome.SyndFeedImpl(); + feed.setFeedType('rss_2.0'); feed.setLink(this.href()); feed.setTitle(this.title); feed.setDescription(this.tagline || String.EMPTY); feed.setLanguage(this.locale.replace('_', '-')); feed.setPublishedDate(now); - /* - var feedInfo = new rome.FeedInformationImpl(); - var feedModules = new java.util.ArrayList(); - feedModules.add(feedInfo); - feed.setModules(feedModules); - //feedInfo.setImage(new java.net.URL(this.getProperty('imageUrl'))); - feedInfo.setSubtitle(this.tagline); - feedInfo.setSummary(this.description); - feedInfo.setAuthor(this.creator.name); - feedInfo.setOwnerName(this.creator.name); - //feedInfo.setOwnerEmailAddress(this.getProperty('email')); - */ + var entry, entryInfo, entryModules; var enclosure, enclosures, keywords; var entries = new java.util.ArrayList(); var description; var list = collection.constructor === Array ? collection : collection.list(0, 25); + for each (var item in list) { entry = new rome.SyndEntryImpl(); entry.setTitle(item.title || formatDate(item.created, 'date')); entry.setLink(item.href()); entry.setAuthor(item.creator.name); entry.setPublishedDate(item.created); + if (item.text) { description = new rome.SyndContentImpl(); description.setType('text/html'); // FIXME: Work-around for org.jdom.IllegalDataException caused by some ASCII control characters - description.setValue(item.format_filter(item.text).replace(/[\x00-\x1f^\x0a^\x0d]/g, String.EMPTY)); + description.setValue(item.format_filter(item.text, {}, 'markdown').replace(/[\x00-\x1f^\x0a^\x0d]/g, String.EMPTY)); entry.setDescription(description); } + entries.add(entry); - /* - entryInfo = new rome.EntryInformationImpl(); - entryModules = new java.util.ArrayList(); - entryModules.add(entryInfo); - entry.setModules(entryModules); - - enclosure = new rome.SyndEnclosureImpl(); - enclosure.setUrl(episode.getProperty('fileUrl')); - enclosure.setType(episode.getProperty('contentType')); - enclosure.setLength(episode.getProperty('filesize') || 0); - enclosures = new java.util.ArrayList(); - enclosures.add(enclosure); - entry.setEnclosures(enclosures); - - entryInfo.setAuthor(entry.getAuthor()); - entryInfo.setBlock(false); - entryInfo.setDuration(new rome.Duration(episode.getProperty('length') || 0)); - entryInfo.setExplicit(false); - entryInfo.setKeywords(episode.getProperty('keywords')); - entryInfo.setSubtitle(episode.getProperty('subtitle')); - entryInfo.setSummary(episode.getProperty('description')); - */ } + feed.setEntries(entries); + var output = new rome.SyndFeedOutput(); - res.servletResponse.setCharacterEncoding('utf-8'); - output.output(feed, res.servletResponse.writer); - return; - // FIXME: Ugly hack for adding PubSubHubbub and rssCloud elements to XML - /* var xml = output.outputString(feed); - xml = xml.replace('', '\n '); - xml = xml.replace('', '\n '); - return xml; - */ + + return res.write(xml); } Site.prototype.rss_xsl_action = function() { @@ -671,10 +645,11 @@ Site.prototype.referrers_action = function() { var urls = req.data.permanent_array; res.push(); res.write(this.getMetadata('spamfilter')); - for (var i in urls) { - res.write('\n'); - res.write(urls[i].replace(/\?/g, '\\\\?')); - } + res.write( + urls.map(function(url) { + return url.replace(/\?/g, '\\\\?'); + }).join('\n') + ); this.setMetadata('spamfilter', res.pop()); res.redirect(req.data.http_referer); return; @@ -761,39 +736,36 @@ Site.prototype.unsubscribe_action = function() { } Site.prototype.export_action = function() { - var job = this.job && new Admin.Job(this.job); + const data = req.postParams; + const param = {}; + const href = this.href(req.action); + let job = new Admin.Job(this.job || {}); - var data = req.postParams; - if (data.submit === 'start') { + if (data.submit === 'export') { try { - if (!job) { - this.job = Admin.queue(this, 'export'); - res.message = gettext('Site is scheduled for export.'); - } else { - if (job.method !== 'export') { - throw Error(gettext('There is already another job queued for this site: {0}', - job.method)); - } + if (job.method && job.method !== 'export') { + throw Error(gettext('There is already another job queued for this site: {0}', job.method)); } + this.job = Admin.queue(this, 'export'); + res.message = gettext('The site is queued for export.'); } catch (ex) { res.message = ex.toString(); app.log(res.message); } - res.redirect(this.href(req.action)); - } else if (data.submit === 'stop') { - job && job.remove(); - this.job = null; - res.redirect(this.href(req.action)); + res.redirect(href); + } else if (data.submit === 'cancel') { + this.job = job.remove(); + res.redirect(href); } - var param = { - status: (job && job.method === 'export') ? - gettext('A Blogger export file (.xml) will be created and available for download from here within 24 hours.') : - null + if (job.method === 'export') { + param.status = gettext('The site data will be available for download from here, soon.'); } - res.handlers.file = File.getById(this.export_id) || {}; + + res.data.title = 'Export Site ' + this.name; + res.handlers.file = File.getById(this.export) || {}; res.data.body = this.renderSkinAsString('$Site#export', param); - this.renderSkin('Site#page'); + res.handlers.site.renderSkin('Site#page'); return; } @@ -940,30 +912,15 @@ Site.prototype.static_macro = function(param, name, mode) { return this.getStaticUrl(name); } -/** - * - */ -Site.prototype.deleted_macro = function() { - return new Date(this.deleted.getTime() + Date.ONEDAY * Admin.SITEREMOVALGRACEPERIOD); -} /** * */ Site.prototype.spamfilter_macro = function() { - var str = this.getMetadata('spamfilter'); - if (!str) { - return; - } - var items = str.replace(/\r/g, '').split('\n'); - for (var i in items) { - res.write('"'); - res.write(items[i]); - res.write('"'); - if (i < items.length-1) { - res.write(','); - } - } + const str = this.getMetadata('spamfilter'); + if (!str) return; + const urls = str.replace(/\r/g, '').split('\n'); + res.write(JSON.stringify(urls)); return; }; @@ -1071,16 +1028,20 @@ Site.prototype.getDiskSpace = function(quota) { * @param {String} href */ Site.prototype.processHref = function(href) { - var parts, domain, - scheme = (req.servletRequest ? req.servletRequest.scheme : 'http') + '://'; - if (domain = getProperty('domain.' + this.name)) { + var parts; + var scheme = getHrefScheme(); + var domain = getProperty('domain.' + this.name); + if (domain) { parts = [scheme, domain, href]; - } else if (domain = getProperty('domain.*')) { - parts = [scheme, this.name, '.', domain, href]; } else { - var mountpoint = app.appsProperties.mountpoint; - (mountpoint === '/') && (mountpoint = ''); // Prevents double slashes - parts = [scheme, req.data.http_host, mountpoint, href]; + domain = getProperty('domain.*'); + if (domain) { + parts = [scheme, this.name, '.', domain, href]; + } else { + var mountpoint = app.appsProperties.mountpoint; + if (mountpoint === '/') mountpoint = ''; // Prevents double slashes + parts = [scheme, req.data.http_host, mountpoint, href]; + } } return parts.join(''); } @@ -1135,11 +1096,11 @@ Site.prototype.getStaticFile = function(tail) { * @returns {String} */ Site.prototype.getStaticUrl = function(href) { - href || (href = ''); - var scheme = (req.servletRequest ? req.servletRequest.scheme : 'http') + '://'; + if (!href) href = ''; + var scheme = getHrefScheme(); var host = getProperty('domain.' + this.name); - host || (host = getProperty('domain.*')); - host || (host = req.data.http_host); + if (!host) host = getProperty('domain.*'); + if (!host) host = req.data.http_host; return [scheme, host, app.appsProperties.staticMountpoint, '/sites/', this.name, '/', href].join(''); } diff --git a/code/Site/Site.skin b/code/Site/Site.skin index a846c088..baa36a0f 100644 --- a/code/Site/Site.skin +++ b/code/Site/Site.skin @@ -63,18 +63,19 @@ prefix="Last update: " default="None so far" %>) <% response.links %> - - + + - + <% site.skin $Site#header %> -
-
+
+
<% response.message prefix="
" suffix=
%> <% response.body %>
-
-
+
+ <% site.skin $Site#menuButton %> +
<% membership.status %>
  • diff --git a/code/Skin/$Skin.skin b/code/Skin/$Skin.skin index 908be496..f9ccc0d1 100644 --- a/code/Skin/$Skin.skin +++ b/code/Skin/$Skin.skin @@ -15,7 +15,7 @@ <% #edit %> -
    +

    <% response.title %>

    @@ -35,16 +35,19 @@
    <% skin.textarea source %>
    - <% #compare %> diff --git a/code/Skins/$Skins.skin b/code/Skins/$Skins.skin index 99fff8ee..57b912e0 100644 --- a/code/Skins/$Skins.skin +++ b/code/Skins/$Skins.skin @@ -30,8 +30,8 @@ background-color: #f2fae3; } - - + + diff --git a/code/Stories/Stories.js b/code/Stories/Stories.js index 63c74798..8ca4d964 100644 --- a/code/Stories/Stories.js +++ b/code/Stories/Stories.js @@ -78,7 +78,7 @@ Stories.prototype.create_action = function() { (function (images, videos) { this.setMetadata('og:image', images ? Array.prototype.slice.call(images) : null); this.setMetadata('og:video', videos ? Array.prototype.slice.call(videos) : null); - }).call(story, req.postParams['og:image_array'], req.postParams['og:video_array']); + }).call(story, req.data['og:image_array'], req.data['og:video_array']); story.notify(req.action); JSON.sendPaddedResponse(story._id); delete session.data.backup; @@ -129,10 +129,10 @@ Stories.prototype.top_action = function() { } Stories.prototype.render_json_action = function () { - var content = String(req.postParams.http_post_remainder); + var content = String(req.postParams.content); var story = new Story; story.site = res.handlers.site; - var result = Story.prototype.format_filter.call(story, content); + var result = Story.prototype.format_filter.call(story, content, {}, 'markdown'); res.write(result); }; diff --git a/code/Story/$Story.skin b/code/Story/$Story.skin index 1f13f700..590a4148 100644 --- a/code/Story/$Story.skin +++ b/code/Story/$Story.skin @@ -47,7 +47,7 @@ else
    Posted <% this.created text %> by <% this.creator %>.
    <% #update %> -
    <% gettext '{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”' <% story.site.modified text prefix= suffix= %> <% story.creator %> <% if <% story.created %> is <% story.modified %> then <% gettext 'posted // has posted' %> else <% gettext 'updated // has updated' %> %><% if <% story.type %> is Story then <% gettext 'a story // accusative' %> else <% gettext 'a comment // accusative' %> %> <% story.site.title | story.site.link %> %>
    +
    <% gettext '{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”' <% story.site.modified text prefix= suffix= %> <% story.modifier %> <% if <% story.created %> is <% story.modified %> then <% gettext 'posted // has posted' %> else <% gettext 'updated // has updated' %> %><% if <% story.type %> is Story then <% gettext 'a story // accusative' %> else <% gettext 'a comment // accusative' %> %> <% story.site.title | story.site.link %> %>
    <% story.abstract | story.link class='av-concealed-link' %>
    <% #embed %> @@ -60,220 +60,241 @@ else
<% #editor %> - diff --git a/code/Story/Story.js b/code/Story/Story.js index b7021cac..931e560d 100644 --- a/code/Story/Story.js +++ b/code/Story/Story.js @@ -134,6 +134,7 @@ Story.prototype.getPermission = function(action) { switch (action) { case '.': case 'main': + case 'amp.html': return this.status !== Story.CLOSED || this.creator === session.user || Membership.require(Membership.MANAGER) || @@ -176,7 +177,8 @@ Story.prototype.main_action = function() { description: description, body: this.renderSkinAsString('Story#main'), images: this.getMetadata('og:image'), - videos: this.getMetadata('og:video') + videos: this.getMetadata('og:video'), + links: "" }); this.site.log(); this.count(); @@ -207,7 +209,10 @@ Story.prototype.getDescription = function(limit) { var key = this + ':text:' + limit; if (!res.meta[key]) { if (this.text) { - res.meta[key] = stripTags(this.format_filter(this.text, {}, 'markdown')).clip(limit, String.ELLIPSIS, '\\s').replace(/\s+/g, String.SPACE).trim(); + res.meta[key] = stripTags(this.format_filter(this.text, {}, 'markdown')) + .clip(limit, String.ELLIPSIS, '\\s') + .replace(/\s+/g, String.SPACE) + .trim(); } } return res.meta[key] || String.EMPTY; @@ -489,18 +494,24 @@ Story.prototype.getMacroHandler = function(name) { Story.prototype.getAbstract = function (param) { param || (param = {}); + var limit = param.limit || 10; var ratio = 0.5; // Use title and text equivalently - var result = [], raw = []; - raw.push(this.title, this.text); + var raw = [this.title, this.text]; + var result = []; + + var text = this.format_filter(this.text, {}, 'markdown'); var titleLimit = Math[ratio >= 0.5 ? 'ceil' : 'floor'](limit * ratio); var title = this.title && stripTags(this.title).clip(titleLimit, null, '\\s'); var titleLength = title ? title.split(/\s/).length : 0; + if (titleLength < titleLimit) { ratio = titleLength / limit; } + var textLimit = Math[ratio < 0.5 ? 'ceil' : 'floor'](limit * (1 - ratio)); - var text = this.text && stripTags(this.text).clip(textLimit, null, '\\s').trim(); + text = stripTags(text).clip(textLimit, null, '\\s').trim(); + title && result.push('' + title + ' '); text && result.push(text); @@ -509,6 +520,7 @@ Story.prototype.getAbstract = function (param) { /* if (result.length < 1) { var contentArgs = Array.prototype.slice.call(arguments, 1); // Remove first argument (param) + if (!contentArgs.length) { for (var key in this.getMetadata()) { if (key !== 'title' && key !== 'text') { @@ -516,7 +528,9 @@ Story.prototype.getAbstract = function (param) { } } } + ratio = 1 / contentArgs.length; + for (var i = 0, buffer, key = contentArgs[i]; i < contentArgs.length; i += 1) { if (key && (buffer = this.getMetadata(key))) { raw.push(buffer); @@ -530,6 +544,7 @@ Story.prototype.getAbstract = function (param) { if (result.length < 1 && typeof param['default'] !== 'string') { return '' + ngettext('{0} character', '{0} characters', raw.join(String.EMPTY).length) + ''; } + return result.join(String.SPACE); }; @@ -661,12 +676,15 @@ Story.prototype.format_filter = function(value, param, mode) { } break; - default: - value = this.linebreak_filter(value, param, 'markdown'); + case 'markdown': value = this.macro_filter(value, param); value = this.markdown_filter(value, param); - value = this.url_filter(value, param); - return value; + return this.url_filter(value, param); + + default: + value = this.macro_filter(value, param); + value = this.linebreak_filter(value, param); + return this.url_filter(value, param); } } @@ -675,12 +693,13 @@ Story.prototype.format_filter = function(value, param, mode) { Story.prototype.linebreak_filter = function (value, param, mode) { if (mode === 'markdown') { + // FIXME: should be obsolete var mdLineBreakMarker = new RegExp('', 'g'); var mdQuoteMarker = new RegExp('', 'g'); var mdCodeMarker = new RegExp('', 'g'); return value - // Prevent Markdown for linebreaks (lines ending with 2 spaces) - // as well as code segments (4 spaces) to be removed by Helma’s format() method + // Prevent Markdown for linebreaks (lines ending with 2 spaces) as well as + // code segments (4 spaces) to be removed by Helma’s format() method .replace(/ {2}$/gm, mdLineBreakMarker.source) .replace(/^ {4}/gm, mdCodeMarker.source) // Prevent Markdown for quote segments (lines starting with ‘>’) @@ -689,8 +708,12 @@ Story.prototype.linebreak_filter = function (value, param, mode) { return mdQuoteMarker.source.repeat(item.length); }) // Apply Helma’s format() method for good - // FIXME: This should go into the compat layer + // FIXME: This should probably be moved to the compat layer .format(value) + // Replace trailing HTML linebreaks with Markdown ones + .replace(/]*>$/gm, String.SPACE.repeat(2)) + // Replace trailing HTML linebreaks inserted by Helma’s format() method with Markdown ones + //.replace(//g, String.SPACE.repeat(2)) // Restore Markdown quote segments .replace(mdQuoteMarker, '>') // Restore Markdown linebreaks and code segments @@ -763,13 +786,13 @@ Story.prototype.url_filter = function(value, param, mode) { }; Story.prototype.markdown_filter = function (value, param) { - return marked(value); + return renderMarkdown(value); }; /** * @returns {String} */ Story.prototype.getConfirmText = function() { - return gettext("You are about to delete a story by user {0}.", + return gettext("You are about to delete a story by {0}.", this.creator ? this.creator.name : 'null'); } diff --git a/code/Story/Story.skin b/code/Story/Story.skin index b986fbb6..ed6bde05 100644 --- a/code/Story/Story.skin +++ b/code/Story/Story.skin @@ -83,7 +83,6 @@ <% gettext Cancel %>
- <% #comment %> <% story.skin Story#date %> diff --git a/code/Tag/$Tag.skin b/code/Tag/$Tag.skin index e078d29b..338082d7 100644 --- a/code/Tag/$Tag.skin +++ b/code/Tag/$Tag.skin @@ -6,41 +6,52 @@ <% tag.link rss.xml "" %> - <% tag.link delete "" class='av-delete-tag uk-hidden' data-av-tag-url=<% tag.href delete %> %> - <% tag.link rename "" class='av-rename-tag uk-hidden' data-av-tag-url=<% tag.href rename %> %> + <% tag.link delete "" @click.prevent=<% tag.name prefix='remove(\'' suffix='\', $event)' %> hidden=hidden :hidden='false' %> + <% tag.link rename "" @click.prevent=<% tag.name prefix='rename(\'' suffix='\', $event)' %> hidden=hidden :hidden='false' %> <% #main %> -
+
<% list.render skin="$TagHub#main" %>
+
    <% list.prevLink text="" prefix=
  • suffix=
  • default="
  • " %> <% list.nextLink text="" prefix=
  • suffix=
  • default="
  • " %>
- <% #simple %> diff --git a/code/Tags/$Tags.skin b/code/Tags/$Tags.skin index 4cddf4b7..a2e4d19f 100644 --- a/code/Tags/$Tags.skin +++ b/code/Tags/$Tags.skin @@ -1,41 +1,36 @@ <% #main %>

<% response.title %>

+ <% site.skin $Site#noscript %> <% response.pager %> - - - - - - - - - - <% response.list %> - -
- <% if <% tags.self __name__ %> is tags then - "" - else - "" - %> - <% gettext Name %>
-<% response.pager %> - + }'> + <% response.list %> + + + +<% response.pager %> diff --git a/code/User/$User.skin b/code/User/$User.skin index ab0ffe8e..d2f40f0b 100644 --- a/code/User/$User.skin +++ b/code/User/$User.skin @@ -45,14 +45,15 @@ <% #edit %>

<% response.title %>

-
+
+ <% context.link timeline <% gettext Timeline %> %> + <% context.link export <% gettext Export %> prefix='| ' %> +
+ - +
@@ -74,7 +75,7 @@
<% user.input url type=url class='uk-form uk-width-2-3' %> @@ -82,11 +83,11 @@
- - <% #admin %>
@@ -131,7 +120,7 @@ -
<% ngettext "{0} Site" "{0} Sites" <% count <% user.self sites %> %> %>
+
<% ngettext "{0} Site" "{0} Sites" <% count <% user.self ownerships %> %> %>
<% ngettext "{0} Story" "{0} Stories" <% count <% user.self stories %> %> %>
<% ngettext "{0} Comment" "{0} Comments" <% count <% user.self comments %> %> %>
<% ngettext "{0} Image" "{0} Images" <% count <% user.self images %> %> %>
@@ -147,6 +136,61 @@
+<% #export %> +

<% gettext "Export Account Data" %>

+

+ <% if <% param.status %> is null then <% if <% this.export %> is null then '' else <% gettext "{0}Download the archive{1} or click “Export” to create a new one." <% this.export prefix="" %> "" %> %> else <% param.status %> %> +

+
+ + <% gettext Account %> +
+ +<% #timeline %> +

<% gettext Timeline %>

+<% response.pager %> + + + + + + + + + + + <% response.list %> + +
<% gettext Site %><% gettext Created %><% gettext Reference %>
+<% response.pager %> + +<% #delete %> +
+ <% gettext 'You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.' + <% ngettext '{0} site' '{0} sites' <% count <% user.self ownerships %> %> %> + <% ngettext '{0} story' '{0} stories' <% count <% user.self stories %> %> %> + <% ngettext '{0} comment' '{0} comments' <% count <% user.self comments %> %> %> + <% ngettext '{0} image' '{0} images' <% count <% user.self images %> %> %> + <% ngettext '{0} file' '{0} files' <% count <% user.self files %> %> %> + <% ngettext '{0} poll' '{0} polls' <% count <% user.self polls %> %> %> %> + <% gettext 'All of this will be deleted irreversibly.' %> + <% gettext 'Are you sure you want to proceed?' %> +
+ +<% #meta %> +<% gettext 'Created on {0}' <% user.created short %> %> +<% if <% user.created %> is <% user.modified %> then '' else + <% gettext 'Last modified on {0}' <% this.modified short %> prefix=
%> +%> + +<% #deleted %> +<% if <% user.deleted %> is null then + <% gettext 'Account is being deleted' %> +else + <% gettext 'Deleted on {0}' <% user.created short %> %> +%> <% #notify_reset %> <% gettext 'Hello {0}.' <% user.name %> %> diff --git a/code/User/User.js b/code/User/User.js index 657207bc..f8ca6f1a 100644 --- a/code/User/User.js +++ b/code/User/User.js @@ -23,7 +23,11 @@ markgettext('Account'); markgettext('account'); markgettext('a account // accusative'); +this.handleMetadata('accepted'); +this.handleMetadata('deleted'); +this.handleMetadata('export'); this.handleMetadata('hash'); +this.handleMetadata('job'); this.handleMetadata('notes'); this.handleMetadata('salt'); this.handleMetadata('url'); @@ -59,14 +63,122 @@ User.add = function(data) { return user; } -/** - * FIXME: Still needs a solution whether and how to remove a user’s sites - */ User.remove = function() { - // FIXME: Removing an account is non-trivial as even one single modifier_id could break things if the corresponding account relation simply was removed. Thus, we might need a `deleted` property or similar to flag a removal and then take appropriate measures for related objects. - throw Error(gettext('Currently, it is not possible to remove an account. Please accept our humble apologies.')); - return; -} + if (this.constructor !== User) return; + + const deleteMetadata = (type, table, id) => { + app.log('Removing ' + table + ' metadata for User #' + id); + sql.execute("delete from metadata where parent_type = '$0' and parent_id in (select id from $1 where creator_id = $2)", type, table, id); + }; + + const getNewCreator = site => { + if (!site) return null; + const owners = site.members.owners; + if (owners.size() < 1) return null; + return owners.list().filter(owner => owner.name !== this.name)[0].creator; + }; + + const sql = new Sql(); + const id = this._id; + + app.log('Removing data from account #' + id); + sql.execute("delete from metadata where parent_type = 'User' and parent_id = $0", id); + + // Remove sites + this.ownerships.forEach(function() { + const owners = this.site.members.owners; + if (owners.size() < 2) { + // Delegate deletion of Sites which user is the only owner of + Site.remove.call(this.site); + } + }); + + // Re-assign site creators and modifiers + sql.retrieve('select id from site where creator_id = $0', id); + sql.traverse(function() { + const site = Site.getById(this.id); + const creator = getNewCreator(site); + sql.execute('update site set creator_id = $0 where creator_id = $1', creator._id, id); + }); + sql.execute('update site set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign memberships + sql.execute("delete from membership where name = '$0'", this.name); + sql.execute('update membership set modifier_id = creator_id where modifier_id = $0', id); + + // Remove tags + sql.execute("delete from tag_hub where tagged_type = 'Story' and tagged_id in (select id from content where creator_id = $0)", id); + sql.execute("delete from tag_hub where tagged_type = 'Image' and tagged_id in (select id from image where creator_id = $0)", id); + sql.execute('delete from tag where id not in (select tag_id from tag_hub)'); + + // Remove and re-assign polls, choices and votes + let subQuery = 'select id from poll where creator_id'; + sql.execute('delete from vote where choice_id in (select id from choice where poll_id in ($0 = $1))', subQuery, id); + sql.execute('delete from choice where poll_id in ($0 = $1)', subQuery, id); + sql.execute('delete from poll where creator_id = $0', id); + sql.execute('update poll set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign stories and comments + deleteMetadata('Story', 'content', id); + sql.execute('delete from content where creator_id = $0', id); + sql.execute('update content set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign files + sql.retrieve('select id from file where creator_id = $0', id); + sql.traverse(function() { + app.log('Removing file #' + this.id + ' from file system'); + const file = File.getById(this.id); + file.getFile().remove(); + }); + deleteMetadata('File', 'file', id); + sql.execute('delete from file where creator_id = $0', id); + sql.execute('update file set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign images + sql.retrieve('select id from image where creator_id = $0', id); + sql.traverse(function() { + const image = Image.getById(this.id); + if (image.parent_type === 'Layout') { + if (!image.parent) return; + // Instead of deleting, assign layout images to another site owner + app.log('Assigning new creator: layout image #' + this.id); + const creator = getNewCreator(image.parent.site); + sql.execute('update image set creator_id = $0 where creator_id = $1', creator._id, id); + } else { + app.log('Removing image #' + this.id + ' from file system') + image.getFile().remove(); + } + }); + deleteMetadata('Image', 'image', id); + sql.execute('delete from image where creator_id = $0', id); + sql.execute('update image set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign skins + sql.retrieve('select id from skin where creator_id = $0', id); + sql.traverse(function() { + // Instead of deleting, assign skins to another site owner + app.log('Assigning new creator: skin #' + this.id); + const skin = Skin.getById(this.id); + const creator = getNewCreator(skin.layout.site); + sql.execute('update skin set creator_id = $0 where creator_id = $1', creator._id, id); + }); + sql.execute('update skin set modifier_id = creator_id where modifier_id = $0', id); + + // Remove and re-assign layouts + sql.retrieve('select id from layout where creator_id = $0', id); + sql.traverse(function() { + // Instead of deleting, assign layouts to another site owner + app.log('Assigning new creator: layout #' + this.id); + const layout = Layout.getById(this.id); + const creator = getNewCreator(layout.site); + sql.execute('update layout set creator_id = $0 where creator_id = $1', creator._id, id); + }); + sql.execute('update layout set modifier_id = creator_id where modifier_id = $0', id); + + this.deleted = new Date(); + this.email = String.EMPTY; + return User.require(User.PRIVILEGED) ? this.href('edit') : root.href(); +}; /** * @@ -82,7 +194,7 @@ User.getByName = function(name) { * @returns {String[]} * @see defineConstants */ -User.getStatus = defineConstants(User, markgettext('Blocked'), markgettext('Regular'), markgettext('Trusted'), markgettext('Privileged')); +User.getStatus = defineConstants(User, markgettext('Deleted'), markgettext('Blocked'), markgettext('Regular'), markgettext('Trusted'), markgettext('Privileged')); /** * @returns {String} @@ -91,7 +203,7 @@ User.getSalt = function() { var salt = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 8); var random = java.security.SecureRandom.getInstance('SHA1PRNG'); random.nextBytes(salt); - return Packages.sun.misc.BASE64Encoder().encode(salt); + return new java.lang.String(java.util.Base64.getMimeEncoder().encode(salt), 'utf-8'); } /** @@ -111,7 +223,7 @@ User.register = function(data) { } else if (data.name !== stripTags(data.name) || NAMEPATTERN.test(data.name)) { throw Error(gettext('Please avoid special characters or HTML code in the name field.')); } else if (data.name !== root.users.getAccessName(data.name)) { - throw Error(gettext('Sorry, the user name you entered already exists. Please enter a different one.')); + throw Error(gettext('Sorry, the username you entered already exists. Please enter a different one.')); } data.email && (data.email = data.email.trim()); @@ -146,14 +258,16 @@ User.register = function(data) { * @returns {Boolean} */ User.isBlacklisted = function(data) { - var url; - var name = encodeURIComponent(data.name); + if (getProperty('enableBlacklistChecks') !== 'true') return false; + + var url, mime; + var key = getProperty('botscout.apikey'); var email = encodeURIComponent(data.email); var ip = encodeURIComponent(data.http_remotehost); - var key = getProperty('botscout.apikey'); if (key) { url = ['http://botscout.com/test/?multi', '&key=', key, '&mail=', email, '&ip=', ip]; + try { mime = getURL(url.join(String.EMPTY)); if (mime && mime.text && mime.text.startsWith('Y')) { @@ -164,25 +278,28 @@ User.isBlacklisted = function(data) { app.log(ex); } } + // We only get here if botscout.com does not already blacklist the ip or email address url = ['http://www.stopforumspam.com/api?f=json', '&email=', email]; - if (ip.match(/^(?:\d{1,3}\.){3}\d{1,3}$/)) { - url.push('&ip=', ip); - } + + if (ip.match(/^(?:\d{1,3}\.){3}\d{1,3}$/)) url.push('&ip=', ip); + try { mime = getURL(url.join(String.EMPTY)); } catch (ex) { app.log('Exception while trying to check blacklist URL ' + url); app.log(ex); } - if (mime && mime.text) { - var result = JSON.parse(mime.text); + + if (mime && mime.content) { + var result = JSON.parse(new java.lang.String(mime.content)); if (result.success) { return !!(result.email.appears || (result.ip && result.ip.appears)); } } + return false; -} +}; /** * @@ -260,10 +377,11 @@ User.logout = function() { * @param {String} requiredStatus * @returns {Boolean} */ -User.require = function(requiredStatus) { - var status = [User.BLOCKED, User.REGULAR, User.TRUSTED, User.PRIVILEGED]; - if (requiredStatus && session.user) { - return status.indexOf(session.user.status) >= status.indexOf(requiredStatus); +User.require = function(requiredStatus, user) { + if (!user) user = session.user; + var status = [User.BLOCKED, User.REGULAR, User.DELETED, User.TRUSTED, User.PRIVILEGED]; + if (requiredStatus && user) { + return status.indexOf(user.status) >= status.indexOf(requiredStatus); } return false; } @@ -379,23 +497,32 @@ User.prototype.onLogout = function() { /* ... */ } * @returns {Boolean} */ User.prototype.getPermission = function(action) { - if (action === 'delete') return false; - return User.require(User.PRIVILEGED); + switch (action) { + case 'delete': + return this.status !== User.PRIVILEGED && this.status !== User.DELETED; + + default: + return User.require(User.PRIVILEGED); + } } User.prototype.edit_action = function () { + if (!res.handlers.context) res.handlers.context = this; + if (req.postParams.save) { try { this.update(req.postParams); res.message = gettext('The changes were saved successfully.'); - res.redirect(this.href(req.action)); + res.redirect(res.handlers.context.href(req.action)); } catch (err) { res.message = err.toString(); } } + session.data.token = User.getSalt(); - session.data.salt = session.user.salt; - res.data.title = 'Account ' + this.name; + session.data.salt = this.salt; + + res.data.title = this.name; res.data.body = this.renderSkinAsString('$User#edit'); res.handlers.site.renderSkin('Site#page'); }; @@ -405,9 +532,108 @@ User.prototype.block_action = function () { res.redirect(req.data.http_referer); }; +User.prototype.export_action = function() { + if (!res.handlers.context) res.handlers.context = this; + + const data = req.postParams; + const param = {}; + const href = res.handlers.context.href(req.action); + let job = new Admin.Job(this.job || {}); + + if (data.submit === 'export') { + try { + if (job.method && job.method !== 'export') { + throw Error(gettext('There is already another job queued for this account: {0}', job.method)); + } + this.job = Admin.queue(this, 'export'); + res.message = gettext('The account is queued for export.'); + } catch (ex) { + res.message = ex.toString(); + app.log(res.message); + } + res.redirect(href); + } else if (data.submit === 'cancel') { + this.job = job.remove(); + res.redirect(href); + } + + if (job.method === 'export') { + param.status = gettext('The account data will be available for download from here within the next days.'); + } + + res.data.title = 'Export Account ' + this.name; + res.data.body = this.renderSkinAsString('$User#export', param); + res.handlers.site.renderSkin('Site#page'); +}; + +User.prototype.timeline_action = function() { + if (!res.handlers.context) res.handlers.context = this; + + const collection = []; + const sql = new Sql(); + const page = req.queryParams.page; + const pageSize = 25; + const offset = (req.data.page || 0) * pageSize; + let count = 0; + + sql.retrieve("select (select count(*) from content where creator_id = $0) + (select count(*) from image where creator_id = $0) + (select count(*) from file where creator_id = $0) + (select count(*) from poll where creator_id = $0) as count", this._id); + + sql.traverse(function() { + count = this.count; + }); + + // MySQL needs the limit parameter -> https://stackoverflow.com/questions/255517/mysql-offset-infinite-rows + sql.retrieve("select created, id, 'Story' as prototype from content where creator_id = $0 union select created, id, 'Image' as prototype from image where creator_id = $0 union select created, id, 'File' as prototype from file where creator_id = $0 union select created, id, 'Poll' as prototype from poll where creator_id = $0 order by created desc limit $1 offset $2", this._id, pageSize, offset); + + sql.traverse(function() { + const object = HopObject.getById(this.id, this.prototype); + collection.push(object); + }); + + res.data.list = renderList(collection, this.renderTimelineItem, null, page); + res.data.pager = renderPager(count, this.href(req.action), pageSize, page); + res.data.title = gettext('Timeline'); + res.data.body = this.renderSkinAsString('$User#timeline'); + root.renderSkin('Site#page'); +}; + +User.prototype.delete_action = function() { + if (!res.handlers.context) res.handlers.context = this; + res.data.action = res.handlers.context.href(req.action); + if (req.postParams.proceed) { + this.hash = String.EMPTY; + this.status = User.DELETED; + this.deleted = null; + if (this.countContributions() < 1) { + // If an account contains no content, delete it immediately + HopObject.prototype.delete_action.call(this); + } else { + // Otherwise, queue for deletion + res.message = gettext('The account {0} is being deleted.', this.name); + } + this.log(root, 'Deleted account ' + this.name); + res.redirect(User.require(User.PRIVILEGED) ? res.handlers.context.href('edit') : root.href()); + } else { + HopObject.prototype.delete_action.call(this); + } +}; + User.prototype.getConfirmText = function () { - return gettext('You are about to delete the account {0}.', - this.getTitle()); + return gettext('You are about to delete the account {0}.', this.getTitle()); +}; + +User.prototype.getConfirmExtra = function () { + return this.renderSkinAsString('$User#delete'); +}; + +User.prototype.renderTimelineItem = function(item) { + Admin.prototype.renderActivity(item, '$Admin#timelineItem'); +}; + +User.prototype.countContributions = function() { + return [this.stories, this.images, this.files, this.polls, this.comments, this.votes].reduce((total, collection) => { + return total + collection.size(); + }, 0); }; /** @@ -418,28 +644,43 @@ User.prototype.update = function(data) { if (!data.hash && data.password) { data.hash = (data.password + session.data.token).md5(); } + if (data.hash) { this.hash = data.hash; this.salt = session.data.token; } + if (!(data.email = validateEmail(data.email))) { throw Error(gettext('Please enter a valid e-mail address')); } + if (data.url && !(data.url = validateUrl(data.url))) { throw Error(gettext('Please enter a valid URL')); } + if (this.getPermission('edit')) { if (this.status === User.PRIVILEGED && data.status !== User.PRIVILEGED && root.admins.count() < 2) { - throw Error(gettext('You cannot revoke permissions from the only privileged user.')); + throw Error(gettext('You cannot revoke permissions from the only privileged account.')); } + if (this.status === User.PRIVILEGED && data.status === User.DELETED) { + throw Error(gettext('You cannot delete a privileged account.')); + } + + // Remove the corresponding job if site deletion is cancelled + if (this.job && this.status === User.DELETED && this.status !== data.status) { + let job = new Admin.Job(this.job); + if (job.method === 'remove') job.remove(); + this.deleted = null; + this.created = new Date(); + } + this.status = data.status; this.notes = data.notes; } + this.email = data.email; this.url = data.url; - if (this === session.user) { - this.touch(); - } + if (this === session.user) this.touch(); return this; } @@ -448,6 +689,7 @@ User.prototype.update = function(data) { */ User.prototype.touch = function() { this.modified = new Date; + if (session.user) this.modifier = session. return; } diff --git a/code/User/User.properties b/code/User/User.properties index 90441857..5337e0e3 100644 --- a/code/User/User.properties +++ b/code/User/User.properties @@ -40,6 +40,13 @@ _children.local = id _children.foreign = creator_id _children.order = role asc, created desc +ownerships = collection(Membership) +ownerships.local = id +ownerships.foreign = creator_id +ownerships.filter.additionalTables = site +ownerships.filter = site.id = membership.site_id and role = 'owner' +ownerships.order = site.name asc + memberships = collection(Membership) memberships.local = id memberships.foreign = creator_id diff --git a/code/app.properties b/code/app.properties index 0662ff17..06133f0c 100644 --- a/code/app.properties +++ b/code/app.properties @@ -15,6 +15,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +# The current build version and date +version = 0.0.0 +buildDate = 18 Oct 1971 + # The root site rootId = 1 rootPrototype = Root @@ -31,11 +35,16 @@ cron.scheduler.function = scheduler cron.nightly.function = nightly cron.nightly.hour = 0 cron.nightly.minute = 0 +cron.nightly.timeout = 3600 # Cookie names #userCookie = antvilleUser #hashCookie = antvilleHash +# The path to CommonJS modules +commonjs.dir = ../node_modules +rhino.optlevel = -1 + # Performance tweaks #cacheSize = 50000 #minThreads = 10 @@ -43,10 +52,11 @@ cron.nightly.minute = 0 #sessionTimeout = 30 #requestTimeout = 10 -# Options for rewriting URL output; +# Options for rewriting URL output baseUri = / hrefFunction = processHref #hrefRootPrototype = Site +#hrefScheme = https # List of default and individual domain mappings #domain.* = antville.org diff --git a/compat/File/File.js b/compat/File/File.js index 44a42e69..63987104 100644 --- a/compat/File/File.js +++ b/compat/File/File.js @@ -30,15 +30,6 @@ File.prototype.alias_macro = function(param) { return; } -File.prototype.description_macro = function(param) { - if (param.as === "editor") { - this.input_macro(param, "description"); - } else { - res.write(this.description); - } - return; -} - File.prototype.filesize_macro = function(param) { return this.contentLength_macro(param); } diff --git a/compat/Global/aspects.js b/compat/Global/aspects.js index b9bb35a5..d24569cc 100644 --- a/compat/Global/aspects.js +++ b/compat/Global/aspects.js @@ -234,7 +234,8 @@ Members.prototype.onCodeUpdate = function() { }); helma.aspects.addBefore(this, 'search_action', function (args, func, site) { - if (getProperty('google-search') === 'true') { + const provider = getProperty('search.provider'); + if (provider === 'google') { if (req.data.q) { if (!req.data.q.contains('site:')) { res.redirect(site.href(req.action) + '?q=' + encodeURIComponent(req.data.q + ' site:' + site.href().replace('test.www.', ''))); @@ -270,3 +271,14 @@ Stories.prototype.onCodeUpdate = function() { return helma.aspects.addBefore(this, "create_action", aspects.fixStoryEditorParams); } + +File.prototype.onCodeUpdate = function() { + return helma.aspects.addAround(this, 'description_macro', function(args, func, file) { + var param = args[0]; + if (param.as === "editor") { + file.input_macro(param, "description"); + } else { + func.apply(file, args); + } + }) +}; diff --git a/compat/Members/Members.js b/compat/Members/Members.js index 925f15ed..b054f898 100644 --- a/compat/Members/Members.js +++ b/compat/Members/Members.js @@ -17,7 +17,7 @@ Members.prototype.sendpwd_action = function() { res.data.title = gettext("Recover your password"); - res.data.body = gettext("Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore."); + res.data.body = gettext("Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore."); res.data.body += "

" + gettext('If you should really have forgotten your password, you can use the password reset option.', this.href("reset")) + "

"; this._parent.renderSkin("Site#page"); diff --git a/compat/Site/$Site.skin b/compat/Site/$Site.skin index fc0a6497..8766efd8 100644 --- a/compat/Site/$Site.skin +++ b/compat/Site/$Site.skin @@ -1,5 +1,6 @@ <% #googleSearch %>

<% response.title %>

+
@@ -9,7 +10,11 @@ <% gettext Cancel %>
+ + + - diff --git a/compat/Site/Site.js b/compat/Site/Site.js index d219d89c..a2e5ee73 100644 --- a/compat/Site/Site.js +++ b/compat/Site/Site.js @@ -327,7 +327,7 @@ Site.prototype.skin_macro = function (param, name) { case 'Site#javascript': case 'javascript': if (!res.meta.javascript) { - res.writeln(""); + res.writeln(""); res.meta.javascript = true; } break; diff --git a/compat/Story/Story.js b/compat/Story/Story.js index 402fb083..ab32d639 100644 --- a/compat/Story/Story.js +++ b/compat/Story/Story.js @@ -83,7 +83,7 @@ Story.prototype.allowTextMacros = function(skin) { } Story.prototype.commentform_macro = function(param) { - if (this.commentMode === "closed") { + if (this.site.commentMode === Site.DISABLED || this.commentMode === Story.CLOSED) { return; } if (session.user) { diff --git a/compat/User/User.js b/compat/User/User.js index defe7e22..d2e17b12 100644 --- a/compat/User/User.js +++ b/compat/User/User.js @@ -41,19 +41,6 @@ User.prototype.__defineSetter__("sysadmin", function(privileged) { this.status = privileged ? User.PRIVILEGED : User.DEFAULT; }); -User.prototype.status_macro = function(param) { - // This macro is allowed for privileged users only - if (!User.require(User.PRIVILEGED)) { - return; - } - if (param.as === "editor") { - this.select_macro(param, "status"); - } else { - res.write(this.status); - } - return; -} - User.prototype.name_macro = function(param) { if (param.as === "link" && this.url) { link_filter(this.name, param, this.url); diff --git a/db/h2.compat/db.properties b/db/h2.compat/db.properties index 09305aac..7223f5bf 100644 --- a/db/h2.compat/db.properties +++ b/db/h2.compat/db.properties @@ -15,7 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -antville.url = jdbc:h2:./db/antville;ifexists=true;schema=antville;mode=postgresql +antville.url = jdbc:h2:./db/antville;ifexists=true;mode=postgresql antville.driver = org.h2.Driver -antville.user = sa -antville.password = +antville.user = antville +antville.password = antville diff --git a/db/my.compat/db.properties b/db/my.compat/db.properties index 0f093774..cb109b58 100644 --- a/db/my.compat/db.properties +++ b/db/my.compat/db.properties @@ -15,7 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -antville.url = jdbc:mysql://localhost/antville?useUnicode=true&characterEncoding=utf8 +antville.url = jdbc:mysql://localhost/antville?useUnicode=true antville.driver = com.mysql.jdbc.Driver antville.user = antville antville.password = antville diff --git a/db/my.sql b/db/my.sql index 6f848fc9..39989867 100644 --- a/db/my.sql +++ b/db/my.sql @@ -15,8 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -create database if not exists antville character set latin1 - collate latin1_general_ci; +create database if not exists antville character set utf8mb4 + collate utf8mb4_unicode_ci; use antville; @@ -27,15 +27,14 @@ set foreign_key_checks = 0; create table account ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, - metadata mediumtext, - email varchar(255) character set utf8 collate utf8_general_ci, - status varchar(20), + name varchar(500), + email varchar(500), + status varchar(50), created datetime, modified datetime, primary key (id), - key name (name(20)), - key email (email(20)), + key name (name(191)), + key email (email(191)), key status (status), key created (created), key modified (modified) @@ -44,7 +43,7 @@ create table account ( create table choice ( id int(10) unsigned not null default '0', poll_id int(10) unsigned, - title text character set utf8 collate utf8_general_ci, + title text, created datetime, modified datetime, primary key (id), @@ -53,101 +52,97 @@ create table choice ( create table content ( id int(10) unsigned not null default '0', - prototype varchar(20), - name varchar(255) character set utf8 collate utf8_general_ci, + prototype varchar(50), + name varchar(500), site_id int(10) unsigned, story_id int(10) unsigned, parent_id int(10) unsigned, - parent_type varchar(20), - metadata mediumtext, - status varchar(20), - mode varchar(20), - comment_mode varchar(20), + parent_type varchar(50), + status varchar(50), + mode varchar(50), + comment_mode varchar(50), requests int(10) unsigned, created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key story_id (story_id), key parent_id (parent_id), key creator_id (creator_id), - key type (site_id,prototype,status,created,modified,id), - key modified (site_id,modified,status,prototype,id) + key type (site_id, prototype, status, created, modified, id), + key modified (site_id, modified, status, prototype,id) ); create table file ( id int(10) unsigned not null default '0', - prototype varchar(20), - name varchar(255) character set utf8 collate utf8_general_ci, + prototype varchar(50), + name varchar(500), site_id int(10) unsigned, parent_id int(10) unsigned, - parent_type varchar(20), - metadata mediumtext, + parent_type varchar(50), requests int(10) unsigned, created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key site_id (site_id), - key name (name(20)), + key name (name(191)), key creator_id (creator_id) ); create table image ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, - prototype varchar(20), + name varchar(500), + prototype varchar(50), parent_id int(10) unsigned, - parent_type varchar(20), - metadata mediumtext, + parent_type varchar(50), created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key creator_id (creator_id), - key type (name,prototype) + key type (name(191), prototype) ); create table layout ( id int(10) unsigned not null default '0', site_id int(10) unsigned, - metadata mediumtext, - mode varchar(20), + mode varchar(50), created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key site_id (site_id) ); create table log ( id int(10) unsigned not null auto_increment, context_id int(10) unsigned, - context_type varchar(20), + context_type varchar(50), referrer text, - action varchar(255) character set utf8 collate utf8_general_ci, + action varchar(500), created datetime, creator_id int(10) unsigned, - primary key (id) + primary key (id) ); create table membership ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, + name varchar(500), site_id int(10) unsigned, - role varchar(20), + role varchar(50), created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key site_id (site_id), key creator_id (creator_id), - key name (name(20)) + key name (name(191)) ); #!helma <% #metadata %> @@ -155,14 +150,14 @@ create table membership ( create table metadata ( id int(10) unsigned not null default '0', parent_id int(10) unsigned, - parent_type varchar(20), - name varchar(255) character set utf8 collate utf8_general_ci, - value mediumtext character set utf8 collate utf8_general_ci, - type varchar(255), + parent_type varchar(50), + name varchar(500), + value mediumtext, + type varchar(500), primary key (id), key parent (parent_type, parent_id), - key name (name), - key value (value(255)) + key name (name(191)), + key value (value(191)) ); #!helma <% #end_of_metadata %> @@ -170,79 +165,78 @@ create table metadata ( create table poll ( id int(10) unsigned not null default '0', site_id int(10) unsigned, - question text character set utf8 collate utf8_general_ci, - status varchar(20), + question text, + status varchar(50), closed datetime, created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), + primary key (id), key site_id (site_id), key creator_id (creator_id) ); create table site ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, + name varchar(500), layout_id int(10) unsigned, - metadata mediumtext, - status varchar(20), - mode varchar(20), + status varchar(50), + mode varchar(50), created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), - key name (name(20)), + primary key (id), + key name (name(191)), key creator_id (creator_id) ); create table skin ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, - prototype varchar(30), + name varchar(500), + prototype varchar(50), source mediumtext, layout_id int(10) unsigned, created datetime, creator_id int(10) unsigned, modified datetime, modifier_id int(10) unsigned, - primary key (id), - key type (layout_id,prototype(10),name(10)) + primary key (id), + key type (layout_id, prototype, name(191)) ); create table tag ( id int(10) unsigned not null default '0', - name varchar(255) character set utf8 collate utf8_general_ci, + name varchar(500), site_id int(10) unsigned, - type varchar(20), - primary key (id), - key tags (site_id,type,name) + type varchar(50), + primary key (id), + key tags (site_id, type, name(191)) ); create table tag_hub ( id int(10) unsigned not null default '0', tag_id int(10) unsigned, tagged_id int(10) unsigned, - tagged_type varchar(20), - primary key (id), - key tagged (tag_id,tagged_type,tagged_id) + tagged_type varchar(50), + primary key (id), + key tagged (tag_id, tagged_type, tagged_id) ); create table vote ( id int(10) unsigned not null default '0', poll_id int(10) unsigned, choice_id int(10) unsigned, - creator_name varchar(255) character set utf8 collate utf8_general_ci, + creator_name varchar(500), created datetime, creator_id int(10) unsigned, modified datetime, - primary key (id), + primary key (id), key poll_id (poll_id), key creator_id (creator_id), key choice_id (choice_id), - key creator_name (creator_name(20)) + key creator_name (creator_name(191)) ); set foreign_key_checks = 1; diff --git a/db/postgre.sql b/db/postgre.sql index bb84152c..c4a617b8 100644 --- a/db/postgre.sql +++ b/db/postgre.sql @@ -2,7 +2,7 @@ -- The Antville Project -- http://code.google.com/p/antville -- --- Copyright 2001–2014 by the Workers of Antville. +-- Copyright 2001–2014 by the Workers of -- -- Licensed under the Apache License, Version 2.0 (the License''); -- you may not use this file except in compliance with the License. @@ -23,29 +23,26 @@ create user antville password 'antville'; alter user antville admin true; -- These return errors in H2 database -create database antville owner antville; +create database antville; \connect antville; -create schema antville authorization antville; - -create table antville.account ( +create table account ( -- "user" is a reserved keyword in PostgreSql id int4 primary key, name varchar(255), - metadata text, email varchar(255), status varchar(20), created timestamp, modified timestamp ); -create index account_name_idx on antville.account (name); -create index account_email_idx on antville.account (email); -create index account_status_idx on antville.account (status); -create index account_created_idx on antville.account (created); -create index account_modified_idx on antville.account (modified); +create index account_name_idx on account (name); +create index account_email_idx on account (email); +create index account_status_idx on account (status); +create index account_created_idx on account (created); +create index account_modified_idx on account (modified); -create table antville.choice ( +create table choice ( id int4 primary key, poll_id int4, title varchar(255), @@ -53,9 +50,9 @@ create table antville.choice ( modified timestamp ); -create index poll_choice_idx on antville.choice (poll_id); +create index poll_choice_idx on choice (poll_id); -create table antville.content ( +create table content ( id int4 primary key, prototype varchar(20), name varchar(255), @@ -63,7 +60,6 @@ create table antville.content ( story_id int4, parent_id int4, parent_type varchar(20), - metadata text, status varchar(20), mode varchar(20), comment_mode varchar(20), @@ -74,24 +70,23 @@ create table antville.content ( modifier_id int4 ); -create index content_prototype_idx on antville.content (prototype); -create index content_site_idx on antville.content (site_id); -create index content_story_idx on antville.content (story_id); -create index content_parent_idx on antville.content (parent_id, parent_type); -create index content_status_idx on antville.content (status); -create index content_mode_idx on antville.content (mode); -create index content_requests_idx on antville.content (requests); -create index content_created_idx on antville.content (created); -create index content_creator_idx on antville.content (creator_id); +create index content_prototype_idx on content (prototype); +create index content_site_idx on content (site_id); +create index content_story_idx on content (story_id); +create index content_parent_idx on content (parent_id, parent_type); +create index content_status_idx on content (status); +create index content_mode_idx on content (mode); +create index content_requests_idx on content (requests); +create index content_created_idx on content (created); +create index content_creator_idx on content (creator_id); -create table antville.file ( +create table file ( id int4 primary key, prototype varchar(20), name varchar(255), site_id int4, parent_id int4, parent_type varchar(20), - metadata text, requests int4, created timestamp, creator_id int4, @@ -99,35 +94,33 @@ create table antville.file ( modifier_id int4 ); -create index file_name_idx on antville.file (name); -create index file_site_idx on antville.file (site_id); -create index file_requests_idx on antville.file (requests); -create index file_created_idx on antville.file (created); -create index file_creator_idx on antville.file (creator_id); +create index file_name_idx on file (name); +create index file_site_idx on file (site_id); +create index file_requests_idx on file (requests); +create index file_created_idx on file (created); +create index file_creator_idx on file (creator_id); -create table antville.image ( +create table image ( id int4 primary key, name varchar(255), prototype varchar(20), parent_id int4, parent_type varchar(20), - metadata text, created timestamp, creator_id int4, modified timestamp, modifier_id int4 ); -create index image_name_idx on antville.image (name); -create index image_prototype_idx on antville.image (prototype); -create index image_parent_idx on antville.image (parent_id, parent_type); -create index image_created_idx on antville.image (created); -create index image_creator_idx on antville.image (creator_id); +create index image_name_idx on image (name); +create index image_prototype_idx on image (prototype); +create index image_parent_idx on image (parent_id, parent_type); +create index image_created_idx on image (created); +create index image_creator_idx on image (creator_id); -create table antville.layout ( +create table layout ( id int4 primary key, site_id int4, - metadata text, mode varchar(20), created timestamp, creator_id int4, @@ -135,12 +128,12 @@ create table antville.layout ( modifier_id int4 ); -create index layout_site_idx on antville.layout (site_id); +create index layout_site_idx on layout (site_id); -create sequence antville.log_id_seq; +create sequence log_id_seq; -create table antville.log ( - id int4 not null default nextval('antville.log_id_seq'), +create table log ( + id int4 not null default nextval('log_id_seq'), context_id int4, context_type varchar(20), referrer text, @@ -150,12 +143,12 @@ create table antville.log ( ); -- This returns an error in H2 database -alter sequence antville.log_id_seq owned by antville.log.id; +alter sequence log_id_seq owned by log.id; -create index log_context_idx on antville.log (context_id, context_type); -create index log_created_idx on antville.log (created); +create index log_context_idx on log (context_id, context_type); +create index log_created_idx on log (created); -create table antville.membership ( +create table membership ( id int4 primary key, name varchar(255), site_id int4, @@ -166,14 +159,14 @@ create table antville.membership ( modifier_id int4 ); -create index membership_name_idx on antville.membership (name); -create index membership_site_idx on antville.membership (site_id); -create index membership_role_idx on antville.membership (role); -create index membership_creator_idx on antville.membership (creator_id); +create index membership_name_idx on membership (name); +create index membership_site_idx on membership (site_id); +create index membership_role_idx on membership (role); +create index membership_creator_idx on membership (creator_id); --!helma <% #metadata %> -create table antville.metadata ( +create table metadata ( id int4 primary key, parent_id int4, parent_type varchar, @@ -182,13 +175,15 @@ create table antville.metadata ( type varchar(255) ); -create index metadata_parent_idx on antville.metadata (parent_type, parent_id); -create index metadata_name_idx on antville.metadata (name); -create index metadata_value_idx on antville.metadata using hash (value); +create index metadata_parent_idx on metadata (parent_type, parent_id); +create index metadata_name_idx on metadata (name); + +-- This returns an error in H2 database +create index metadata_value_idx on metadata using hash (value); --!helma <% #end_of_metadata %> -create table antville.poll ( +create table poll ( id int4 primary key, site_id int4, question text, @@ -200,16 +195,15 @@ create table antville.poll ( modifier_id int4 ); -create index poll_site_idx on antville.poll (site_id); -create index poll_status_idx on antville.poll (status); -create index poll_created_idx on antville.poll (created); -create index poll_creator_idx on antville.poll (creator_id); +create index poll_site_idx on poll (site_id); +create index poll_status_idx on poll (status); +create index poll_created_idx on poll (created); +create index poll_creator_idx on poll (creator_id); -create table antville.site ( +create table site ( id int4 primary key, name varchar(255), layout_id int4, - metadata text, status varchar(20), mode varchar(20), created timestamp, @@ -218,12 +212,12 @@ create table antville.site ( modifier_id int4 ); -create index site_name_idx on antville.site (name); -create index site_status_idx on antville.site (status); -create index site_created_idx on antville.site (created); -create index site_creator_idx on antville.site (creator_id); +create index site_name_idx on site (name); +create index site_status_idx on site (status); +create index site_created_idx on site (created); +create index site_creator_idx on site (creator_id); -create table antville.skin ( +create table skin ( id int4 primary key, name varchar(255), prototype varchar(30), @@ -235,30 +229,30 @@ create table antville.skin ( modifier_id int4 ); -create index skin_layout_index on antville.skin (layout_id); -create index skin_created_index on antville.site (created); +create index skin_layout_index on skin (layout_id); +create index skin_created_index on site (created); -create table antville.tag ( +create table tag ( id int4 primary key, name varchar(255), site_id int4, type varchar(20) ); -create index tag_name_idx on antville.tag (name); -create index tag_site_idx on antville.tag (site_id); -create index tag_type_idx on antville.tag (type); +create index tag_name_idx on tag (name); +create index tag_site_idx on tag (site_id); +create index tag_type_idx on tag (type); -create table antville.tag_hub ( +create table tag_hub ( id int4 primary key, tag_id int4, tagged_id int4, tagged_type varchar(20) ); -create index tagged_idx on antville.tag_hub (tag_id, tagged_id, tagged_type); +create index tagged_idx on tag_hub (tag_id, tagged_id, tagged_type); -create table antville.vote ( +create table vote ( id int4 primary key, poll_id int4, choice_id int4, @@ -268,17 +262,13 @@ create table antville.vote ( modified timestamp ); -create index vote_poll_idx on antville.vote (poll_id, choice_id); +create index vote_poll_idx on vote (poll_id, choice_id); -insert into antville.layout (id, site_id, mode) values ('1', '1', 'default'); +insert into layout (id, site_id, mode) values ('1', '1', 'default'); -insert into antville.site (id, name, layout_id, status, mode) +insert into site (id, name, layout_id, status, mode) values ('1', 'www', '1', 'trusted', 'public'); -grant select, insert, update, delete on antville.choice, antville.content, - antville.file, antville.image, antville.layout, antville.log, - antville.metadata, antville.membership, antville.poll, antville.site, antville.skin, - antville.tag, antville.tag_hub, antville.account, antville.vote to antville; - --- This returns an error in H2 database -grant usage on antville.log_id_seq to antville; +-- These return errors in H2 database +grant select, insert, update, delete on all tables in schema public to antville; +grant usage on log_id_seq to antville; diff --git a/docs/css/all.css b/docs/css/all.css deleted file mode 100644 index 26f336c6..00000000 --- a/docs/css/all.css +++ /dev/null @@ -1,358 +0,0 @@ -/* TABLE OF CONTENTS: - * - Browser reset - * - HTML elements - * - JsDoc styling - */ - - - - - - -/* - * BEGIN BROWSER RESET - */ - -body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,p,pre,form,fieldset,input,textarea,p,blockquote,th,td { - margin:0; - padding:0 -} -html { - height:100%; - overflow:-moz-scrollbars-vertical; - overflow-x:auto -} -table { - border:0; - border-collapse:collapse; - border-spacing:0 -} -fieldset,img { - border:0 -} -address,caption,cite,code,dfn,em,strong,th,var { - font-style:normal; - font-weight:normal -} -em,cite { - font-style:italic -} -strong { - font-weight:bold -} -ol,ul { - list-style:none -} -caption,th { - text-align:left -} -h1,h2,h3,h4,h5,h6 { - font-size:100%; - font-weight:normal; - margin:0; - padding:0 -} -q:before,q:after { - content:'' -} -abbr,acronym { - border:0 -} -section,article,header,footer,nav,aside,hgroup { - display:block -} - -/* - * END BROWSER RESET - */ - - - - - - -/* - * HTML ELEMENTS - */ - -@font-face { - font-family: 'M1m'; - src: url('fonts/mplus-1m-regular-webfont.eot'); - src: local('☺'), url('fonts/mplus-1m-regular-webfont.woff') format('woff'), url('fonts/mplus-1m-regular-webfont.ttf') format('truetype'), url('fonts/mplus-1m-regular-webfont.svg#webfontVd14f4NN') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'M1m'; - src: url('fonts/mplus-1m-bold-webfont.eot'); - src: local('☺'), url('fonts/mplus-1m-bold-webfont.woff') format('woff'), url('fonts/mplus-1m-bold-webfont.ttf') format('truetype'), url('fonts/mplus-1m-bold-webfont.svg#webfontIjI5mZqE') format('svg'); - font-weight: bold; - font-style: normal; -} - - - -* { - line-height: 1.4em; -} - -html { - font-size: 100%; -} - -body { - font-size: 0.75em; - padding: 15px 0; - background: #eee; - background-image: -moz-linear-gradient(left, #dddddd, #f9f9f9) fixed; - background-image: -webkit-gradient(linear,left bottom,right bottom,color-stop(0, #dddddd),color-stop(1, #f9f9f9)) fixed; - } - -body, -input, -select, -textarea { - color: #000; - font-family: Arial, Geneva, sans-serif; -} - -a:link, -a:hover, -a:active, -a:visited { - color: #19199e; -} -a:hover, -a:focus { - color: #00f; - text-decoration: none; -} - -p { - margin: 0 0 1.5em 0; -} - -/* - * END HTML ELEMENTS - */ - - - -/* - * BEGIN HACK - */ - -div.containerMain:after, -div.safeBox:after { - content:""; - display:block; - height:0; - clear:both; -} - -/* - * END HACK - */ - - - -/* - * BEGIN JSDOC - */ - -/* Start menu */ -div.index *.heading1 { - margin-bottom: 0.5em; - border-bottom: 1px solid #999999; - font-family: M1m, Arial, sans-serif; - font-size: 1.6em; - letter-spacing: 1px; - line-height: 1.3em; -} - -div.index div.menu { - background-color: #FFFFFF; -} -*+html div.index div.menu { - background-color: #FFFFFF; -} -* html div.index div.menu { - background-color: #FFFFFF; -} - -div.index div.menu div { - text-align: left; -} - -div.index div.menu a { - text-decoration: none; -} -div.index div.menu a:hover { - text-decoration: underline; -} - -div.index ul.classList { - padding-left: 0; -} - -div.index ul.classList a { - display: block; - margin: 1px 0; - padding: 4px 0 2px 10px; - text-indent: -10px; -} - -div.index div.fineprint { - color: #777; - font-size: 0.9em; -} -div.index div.fineprint a { - color: #777; -} -/* End menu */ - - - -/* Start content */ -div.content ul { - padding-left: 0; -} - -div.content *.classTitle { - font-size: 1.2em; - font-weight: bold; - line-height: 1em; -} - -div.content *.classTitle span { - display: block; - font-size: 2em; - letter-spacing: 2px; - line-height: 1em; - padding-top: 5px; - text-shadow: 1px 1px 1px #999999; - word-wrap: break-word; -} - -div.content p.summary { - font-size: 1.25em; -} - -div.content ul *.classname a, -div.content ul *.filename a { - font-family: Consolas, "Courier New", Courier, monospace; - text-decoration: none; - font-weight: bold; -} -div.content ul *.classname a:hover, -div.content ul *.filename a:hover { - text-decoration: underline; -} - -div.content div.props { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - background: #fff; - background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.2)); /* FF3.6 */ - background: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255, 255, 255, 0.7)),color-stop(1, rgba(255, 255, 255, 0.2))); - -moz-box-shadow: 0px 0px 10px #ccc; - -webkit-box-shadow: 0px 0px 5px #bbb; - box-shadow: 0px 0px 5px #bbb; -} - - - -*.sectionTitle { - font-family: M1m, sans-serif; - font-size: 1.6em; - letter-spacing: 1px; -} - -table.summaryTable td, -table.summaryTable th { - vertical-align: top; -} -table.summaryTable tr:last-child td { - padding-bottom: 0; -} - -table.summaryTable th { - font-weight: bold; -} - -table.summaryTable td.attributes { - font-family: Consolas, "Courier New", Courier, monospace; - color: #666; -} - -table.summaryTable td.nameDescription div.fixedFont { - font-weight: bold; -} - -table.summaryTable div.description { - color: #333; -} - - - -dl.detailList dt { - font-weight: bold; -} - -dl.inheritsList dd + dt { - margin-top: 10px; -} - -dl.inheritsList dd { - display: inline; -} - - - -.fixedFont { - font-family: Consolas, "Courier New", Courier, monospace; -} - -.fixedFont.heading { - font-size: 1.25em; - line-height: 1.1em -} - -.fixedFont.heading + .description { - font-size: 1.2em; -} - -.fixedFont.heading .light, -.fixedFont.heading .lighter { - font-weight: bold; -} - -pre.code { - overflow: auto; - font-family: Consolas, "Courier New", Courier, monospace; - background: #eee; -} -/* Start content */ - - - -/* Start general styles */ -.light { - color: #666; -} - -.lighter { - color: #999; -} - -span.break { - font-size: 1px; - line-height: 1px; -} -/* End general styles */ - -/* - * END JSDOC - */ \ No newline at end of file diff --git a/docs/css/fonts/mplus-1m-bold-webfont.eot b/docs/css/fonts/mplus-1m-bold-webfont.eot deleted file mode 100644 index 6c64f8d7..00000000 Binary files a/docs/css/fonts/mplus-1m-bold-webfont.eot and /dev/null differ diff --git a/docs/css/fonts/mplus-1m-bold-webfont.svg b/docs/css/fonts/mplus-1m-bold-webfont.svg deleted file mode 100644 index 51295128..00000000 --- a/docs/css/fonts/mplus-1m-bold-webfont.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Foundry URL : http://mplus-fonts.sourceforge.jp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/css/fonts/mplus-1m-bold-webfont.ttf b/docs/css/fonts/mplus-1m-bold-webfont.ttf deleted file mode 100644 index 0cf54cbb..00000000 Binary files a/docs/css/fonts/mplus-1m-bold-webfont.ttf and /dev/null differ diff --git a/docs/css/fonts/mplus-1m-bold-webfont.woff b/docs/css/fonts/mplus-1m-bold-webfont.woff deleted file mode 100644 index f90475d8..00000000 Binary files a/docs/css/fonts/mplus-1m-bold-webfont.woff and /dev/null differ diff --git a/docs/css/fonts/mplus-1m-regular-webfont.eot b/docs/css/fonts/mplus-1m-regular-webfont.eot deleted file mode 100644 index a53f8b54..00000000 Binary files a/docs/css/fonts/mplus-1m-regular-webfont.eot and /dev/null differ diff --git a/docs/css/fonts/mplus-1m-regular-webfont.svg b/docs/css/fonts/mplus-1m-regular-webfont.svg deleted file mode 100644 index 3c835a31..00000000 --- a/docs/css/fonts/mplus-1m-regular-webfont.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Foundry URL : http://mplus-fonts.sourceforge.jp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/css/fonts/mplus-1m-regular-webfont.ttf b/docs/css/fonts/mplus-1m-regular-webfont.ttf deleted file mode 100644 index 684abfd1..00000000 Binary files a/docs/css/fonts/mplus-1m-regular-webfont.ttf and /dev/null differ diff --git a/docs/css/fonts/mplus-1m-regular-webfont.woff b/docs/css/fonts/mplus-1m-regular-webfont.woff deleted file mode 100644 index 49585d82..00000000 Binary files a/docs/css/fonts/mplus-1m-regular-webfont.woff and /dev/null differ diff --git a/docs/css/handheld.css b/docs/css/handheld.css deleted file mode 100644 index 073c0d1d..00000000 --- a/docs/css/handheld.css +++ /dev/null @@ -1,217 +0,0 @@ -/* - * TABLE OF CONTENTS: - * - Browser reset - * - HTML elements - * - JsDoc styling - * - Media query check - */ - - - - - - -/* - * HTML ELEMENTS - */ - -body { - padding: 1% 4% 1% 4%; -} - -/* - * HTML ELEMENTS - */ - - - - - -/* - * BEGIN JSDOC - */ - -/* Start menu */ -div.index div.menu { - position: fixed; - top: 0; - right: 0; - -moz-border-radius-bottomleft: 15px; - -webkit-border-bottom-left-radius: 15px; - -border-bottom-left-radius: 15px; - padding: 4px 5px 8px 10px; - -moz-box-shadow: 0px 0px 10px #c4c4c4; - -webkit-box-shadow: 0px 0px 10px #c4c4c4; - box-shadow: 0px 0px 10px #c4c4c4; - background-color: rgba(255, 255, 255, 0.9); -} - -div.index input.classFilter { - display: none; -} - -div.index div.indexLinks a { - float: right; - clear: both; - font-size: 1.1em; -} - -div.index *.heading1 { - display:none; -} - -div.index ul.classList { - display:none; -} - -div.index div.fineprint { - display:none; -} - -div.indexStatic { - display: none; -} -/* End menu */ - - - -/* Start content */ -div.content *.classTitle { - margin-right: 60px; - margin-bottom: 15px; -} - -div.content div.intro { - margin: 15px 0 35px; -} - -div.content p.description.summary { - margin-bottom: 0.2em; -} - -div.content div.props { - margin: 1.5em -2% 0 -2%; - padding: 2%; -} - -table.summaryTable { - position: relative; - left: -10px; - width: 100%; - border-collapse: collapse; - box-sizing: content-box; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - -ms-box-sizing: content-box; - -o-box-sizing: content-box; - -icab-box-sizing: content-box; - -khtml-box-sizing: content-box; -} - -*.sectionTitle { - padding: 0 10px 10px 0; -} -caption.sectionTitle { - padding-left: 10px; -} - -table.summaryTable td, -table.summaryTable th { - padding: 0px 10px 10px 10px; -} -table.summaryTable tr:last-child td { - padding-bottom: 0; -} - -table.summaryTable td.attributes { - width: 35%; -} - -table.summaryTable td.nameDescription { - width: 65% -} - - - -dl.detailList { - margin-top: 0.5em; -} - -dl.detailList.nomargin + dl.detailList.nomargin { - margin-top: 0; -} - -dl.detailList dt { - display: inline; - margin-right: 5px; -} - -dl.detailList dt:before { - display: block; - content: ""; -} - -dl.detailList dd { - display: inline; -} - -dl.detailList.params dt { - display: block; -} -dl.detailList.params dd { - display: block; - padding-left: 2em; - padding-bottom: 0.4em; -} - - - - -ul.fileList li { - margin-bottom: 1.5em; -} - - - -.fixedFont.heading { - margin-bottom: 0.5em; -} - -pre.code { - margin: 10px 0 10px 0; - padding: 10px; - border: 1px solid #ccc; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} -/* End content */ - -/* - * END JSDOC - */ - - - - - - - -/* - * START MEDIA QUERY CHECK - */ - -.cssLoadCheck { - position: absolute; - top: -99999px; - left: -99999px; - border: 0; - width: 100px; - padding: 0; - overflow: hidden; -} - -/* - * END MEDIA QUERY CHECK - */ - diff --git a/docs/css/screen.css b/docs/css/screen.css deleted file mode 100644 index 8cb4bba3..00000000 --- a/docs/css/screen.css +++ /dev/null @@ -1,297 +0,0 @@ -/* - * TABLE OF CONTENTS: - * - JsDoc styling - * - Media query check - */ - - - - - - -/* - * BEGIN JSDOC - */ - -/* Start menu */ -div.index { - position: fixed; - top: 0; - bottom: 0; - float: left; - width: 30%; - min-width: 100px; - max-width: 300px; - padding: 0 0 10px 0; - overflow: auto; -} - -div.index *.heading1 { - padding: 8px 0 0 0; -} - -div.index div.menu { - margin: 0 15px 0 -15px; - -moz-border-radius-bottomright: 15px; - -webkit-border-bottom-right-radius: 15px; - -border-bottom-right-radius: 15px; - padding: 15px 15px 15px 30px; - -moz-box-shadow: 0px 0px 10px #c4c4c4; - -webkit-box-shadow: 0px 0px 10px #c4c4c4; - box-shadow: 0px 0px 10px #c4c4c4; - background-color: rgba(255, 255, 255, 0.5); -} - -div.index div.indexLinks { - margin-top: 13px; - position: absolute; - right: 30px; -} - -div.index div.indexLinks a { - color: #999999; - text-transform: lowercase; -} - -div.index div.indexLinks a:first-child { - margin-right: 3px; - border-right: 1px solid #999999; - padding-right: 5px; -} - -div.index input.classFilter { - margin-bottom: 4px; - width: 100%; - border-width: 1px; - border-style: solid; - border-color: #CCCCCC #999999 #999999 #CCCCCC; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - -border-radius: 3px; -} - -div.index ul.classList a { - line-height: 1.3em; -} - -div.index ul.classList a + a { - margin-left: 0.5em; -} - -div.index div.fineprint { - margin: 1em 0 0 15px; - color: #777; - font-size: 0.9em; -} - -div.index div.fineprint a { - color: #777; -} - -div.indexStatic { - position: static; - min-height: 1em; -} -/* End menu */ - - -/* Start content */ -div.content { - float: left; - width: 70%; - min-width: 300px; - max-width: 600px; -} -div.innerContent { - padding: 0 0 0 2.5em; -} - -div.content ul, -div.content ol { - margin-bottom: 3em; -} - -div.content ul.methodDetail { - margin-bottom: 0; -} - -div.content *.classTitle { - position: relative; - left: -10px; - margin: -30px 0 15px 0; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - border-radius: 15px; - padding: 25px 15px 15px 15px; - background-color: #FFFFFF; - background-color: rgba(255, 255, 255, 0.5); - -moz-box-shadow: 0px 0px 10px #c4c4c4; - -webkit-box-shadow: 0px 0px 10px #c4c4c4; - box-shadow: 0px 0px 10px #c4c4c4; -} - -div.content div.intro { - margin: 15px 0 45px -} - -div.content p.summary { - margin-bottom: 0.5em; -} - -div.content ul.summary { - margin-bottom: 1.5em; -} - -div.content ul *.classname a, -div.content ul *.filename a { - font-family: Consolas, "Courier New", Courier, monospace; - text-decoration: none; - font-weight: bold; -} -div.content ul *.classname a:hover, -div.content ul *.filename a:hover { - text-decoration: underline; -} - -div.content div.props { - position: relative; - left: -10px; - margin-bottom: 2.5em; - padding: 10px 15px 15px 15px; - overflow: hidden; -} - -div.content div.hr { - margin: 0 10px 0 0; - height: 4em; -} - - - -table.summaryTable { - position: relative; - left: -10px; - width: 100%; - border-collapse: collapse; - box-sizing: content-box; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - -ms-box-sizing: content-box; - -o-box-sizing: content-box; - -icab-box-sizing: content-box; - -khtml-box-sizing: content-box; -} - -*.sectionTitle { - padding: 0 10px 10px 0; -} -caption.sectionTitle { - padding-left: 10px; -} - -table.summaryTable td, -table.summaryTable th { - padding: 0px 10px 10px 10px; -} -table.summaryTable tr:last-child td { - padding-bottom: 0; -} - -table.summaryTable td.attributes { - width: 35%; -} - -table.summaryTable td.nameDescription { - width: 65% -} - - - -dl.detailList { - margin-top: 0.5em; -} - -dl.detailList.nomargin + dl.detailList.nomargin { - margin-top: 0; -} - -dl.detailList dt { - display: inline; - margin-right: 5px; -} - -dl.detailList dt:before { - display: block; - content: ""; -} - -dl.detailList dd { - display: inline; -} - -dl.detailList.params dt { - display: block; -} -dl.detailList.params dd { - display: block; - padding-left: 2em; - padding-bottom: 0.4em; -} - - - - -ul.fileList li { - margin-bottom: 1.5em; -} - - - -.fixedFont.heading { - margin-bottom: 0.5em; -} - -pre.code { - margin: 10px 0 10px 0; - padding: 10px; - border: 1px solid #ccc; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} -/* End content */ - -.clear { - clear: both; - width: 100%; - min-height: 0; -} - -/* - * END JSDOC - */ - - - - - - - -/* - * START MEDIA QUERY CHECK - */ - -.cssLoadCheck { - position: absolute; - top: -99999px; - left: -99999px; - border: 0; - width: 100px; - padding: 0; - overflow: hidden; -} - -/* - * END MEDIA QUERY CHECK - */ - diff --git a/docs/files.html b/docs/files.html deleted file mode 100644 index 5c5d1035..00000000 --- a/docs/files.html +++ /dev/null @@ -1,849 +0,0 @@ - - - - - - - File Index | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

File Index

- -
    - -
  • -

    Api.antville.js

    - - -Methods that implement Antville’s own API. - -
    - - - - - - -
    -
  • - -
  • -

    Admin.js

    - - -Defines the Admin prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Api.js

    - - -Defines the Api prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Api.metaWeblog.js

    - - -Methods that implement the MetaWeblog XML-RPC API. -See http://www.xmlrpc.com/metaWeblogApi for further details. - -
    - - - - - - -
    -
  • - -
  • -

    Api.blogger.js

    - - -Methods that implement Blogger's XML-RPC API. -See http://goo.gl/u8lZZ for further details. -The blogger.getTemplate and blogger.setTemplate methods are not supported - -
    - - - - - - -
    -
  • - -
  • -

    Archive.js

    - - -Defines the Archive prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Choice.js

    - - -Defines the Choice prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Comment.js

    - - -Defines the Comment prototype. - -
    - - - - - - -
    -
  • - -
  • -

    File.js

    - - -Defines the Comment prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Files.js

    - - -Defines the Comment prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Api.mt.js

    - - -Methods that implement Movable Type's XML-RPC API. -See http://www.sixapart.com/pronet/breese/xmlrpc/movable_type_api/ for details. - -
    - - - - - - -
    -
  • - -
  • -

    DropboxClient.js

    - - -Defines the DropboxClient prototype similar to node-dropbox. - -
    - - - - - - -
    -
  • - -
  • -

    Exporter.js

    - - -Defines the Exporter namespace. - -
    - - - - - - -
    -
  • - -
  • -

    Feature.js

    - - -Defines the Feature prototype. -Another trial to implement modular features. - -
    - - - - - - -
    -
  • - -
  • -

    FlexiPath.js

    - - -Defines the FlexiPath prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Global.js

    - - -Defines global variables and functions. - -
    - - - - - - -
    -
  • - -
  • -

    i18n.js

    - - -Contains redefined or additional methods for -internationalization and localization. - -
    - - - - - - -
    -
  • - -
  • -

    Importer.js

    - - -Defines the Importer namespace. - -
    - - - - - - -
    -
  • - -
  • -

    JSON.js

    - - -Douglas Crockford’s JSON parser and serializer. - -
    - - - - - - -
    -
  • - -
  • -

    Sql.js

    - - -Defines the Sql prototype, a utility for relational queries - -
    - - - - - - -
    -
  • - -
  • -

    HopObject.js

    - - -Defines the extensions of Helma’s built-in -HopObject prototype. - -
    - - - - - - -
    -
  • - -
  • -

    metadata.js

    - - -Defines metadata extensions of Helma’s built-in -HopObject prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Image.js

    - - -Defines the Image prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Images.js

    - - -Defines the Images prototype - -
    - - - - - - -
    -
  • - -
  • -

    Layout.js

    - - -Defines the Layout prototype - -
    - - - - - - -
    -
  • - -
  • -

    LogEntry.js

    - - -Defines the LogEntry prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Members.js

    - - -Defines the Members prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Membership.js

    - - -Defines the Membership prototype - -
    - - - - - - -
    -
  • - -
  • -

    Metadata.js

    - - -Defines the Metadata prototype (version 2). - -
    - - - - - - -
    -
  • - -
  • -

    Poll.js

    - - -Defines the Poll prototype - -
    - - - - - - -
    -
  • - -
  • -

    Polls.js

    - - -Defines the Polls prototype - -
    - - - - - - -
    -
  • - -
  • -

    Root.js

    - - -Defines the Root prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Site.js

    - - -Defines the Site prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Skin.js

    - - -Defines the Skin prototype - -
    - - - - - - -
    -
  • - -
  • -

    Skins.js

    - - -Defines the Skins prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Stories.js

    - - -Defines the Stories prototype - -
    - - - - - - -
    -
  • - -
  • -

    Story.js

    - - -Defines the Story prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Tag.js

    - - -Defines the Tag prototype. - -
    - - - - - - -
    -
  • - -
  • -

    TagHub.js

    - - -Defines the TagHub prototype - -
    - - - - - - -
    -
  • - -
  • -

    Tags.js

    - - -Defines the Tags prototype. - -
    - - - - - - -
    -
  • - -
  • -

    User.js

    - - -Defines the User prototype. - -
    - - - - - - -
    -
  • - -
  • -

    Vote.js

    - - -Defines the Vote prototype. - -
    - - - - - - -
    -
  • - -
  • -

    /Users/tobi/Projects/helma/apps/antville/code/Global/5.less-helma-1.3.0.js

    - - - -
    - - - - - - -
    -
  • - -
-
-
- - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 88374c5b..00000000 --- a/docs/index.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - - - Class Index | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

Class Index

- - -
-
- - - - diff --git a/docs/javascript/all.js b/docs/javascript/all.js deleted file mode 100644 index 5b6876af..00000000 --- a/docs/javascript/all.js +++ /dev/null @@ -1,326 +0,0 @@ -/** - * @fileOverview Contains standard code in the namespace 'wbos' and code specifically written for Codeview in the namespace 'codeview' - * @author Wouter Bos (www.thebrightlines.com) - * @since 1.0 - 2010-09-10 - * @version 1.0 - 2010-09-10 - */ - - - - - - -if (typeof(wbos) == "undefined") { - /** - * @namespace Standard code of Wouter Bos (wbos) - */ - wbos = {} -} -if (typeof(wbos.CssTools) == "undefined") { - /** - * @namespace Namespace for CSS-related functionality - */ - wbos.CssTools = {} -} - - - - -/** - * @namespace Fallback for CSS advanced media query - * @class - * @since 1.0 - 2010-09-10 - * @version 1.0 - 2010-09-10 - */ -wbos.CssTools.MediaQueryFallBack = ( function() { - var config = { - cssScreen: "/css/screen.css", - cssHandheld: "/css/handheld.css", - mobileMaxWidth: 660, - testDivClass: "cssLoadCheck", - dynamicCssLinkId: "DynCssLink", - resizeDelay: 30 - } - var noMediaQuery = false; - var delay; - var currentCssMediaType; - - // Adding events to elements in the DOM without overwriting it - function addEvent(element, newFunction, eventType) { - var oldEvent = eval("element." + eventType); - var eventContentType = eval("typeof element." + eventType) - - if ( eventContentType != 'function' ) { - eval("element." + eventType + " = newFunction") - } else { - eval("element." + eventType + " = function(e) { oldEvent(e); newFunction(e); }") - } - } - - // Get the the inner width of the browser window - function getWindowWidth() { - if (window.innerWidth) { - return window.innerWidth; - } else if (document.documentElement.clientWidth) { - return document.documentElement.clientWidth; - } else if (document.body.clientWidth) { - return document.body.clientWidth; - } else{ - return 0; - } - } - - function addCssLink(cssHref) { - var cssNode = document.createElement('link'); - var windowWidth; - cssNode.type = 'text/css'; - cssNode.rel = 'stylesheet'; - cssNode.media = 'screen, handheld, fallback'; - cssNode.href = cssHref; - document.getElementsByTagName("head")[0].appendChild(cssNode); - } - - - - /* Start public */ - return { - /** - * Adds link to CSS in the head if no CSS is loaded - * - * @since 1.0 - 2010-08-21 - * @version 1.0 - 2010-08-21 - * @param {String|Object} cssScreen URL to CSS file for larger screens - * @param {String|Object} cssHandheld URL to CSS file for smaller screens - * @param {Number} mobileMaxWidth Maximum width for handheld devices - * @example - * wbos.CssTools.MediaQueryFallBack.LoadCss(['screen.css', 'screen2.css'], 'mobile.css', 480) - */ - LoadCss: function(cssScreen, cssHandheld, mobileMaxWidth) { - // Set config values - if (typeof(cssScreen) != "undefined") { - config.cssScreen = cssScreen; - } - if (typeof(cssHandheld) != "undefined") { - config.cssHandheld = cssHandheld; - } - if (typeof(mobileMaxWidth) != "undefined") { - config.mobileMaxWidth = mobileMaxWidth; - } - - // Check if CSS is loaded - var cssloadCheckNode = document.createElement('div'); - cssloadCheckNode.className = config.testDivClass; - document.getElementsByTagName("body")[0].appendChild(cssloadCheckNode); - if (cssloadCheckNode.offsetWidth != 100 && noMediaQuery == false) { - noMediaQuery = true; - } - cssloadCheckNode.parentNode.removeChild(cssloadCheckNode) - - if (noMediaQuery == true) { - // Browser does not support Media Queries, so JavaScript will supply a fallback - var cssHref = ""; - - // Determines what CSS file to load - if (getWindowWidth() <= config.mobileMaxWidth) { - cssHref = config.cssHandheld; - newCssMediaType = "handheld"; - } else { - cssHref = config.cssScreen; - newCssMediaType = "screen"; - } - - // Add CSS link to of page - if (cssHref != "" && currentCssMediaType != newCssMediaType) { - var currentCssLinks = document.styleSheets - for (var i = 0; i < currentCssLinks.length; i++) { - for (var ii = 0; ii < currentCssLinks[i].media.length; ii++) { - if (typeof(currentCssLinks[i].media) == "object") { - if (currentCssLinks[i].media.item(ii) == "fallback") { - currentCssLinks[i].ownerNode.parentNode.removeChild(currentCssLinks[i].ownerNode) - i-- - break; - } - } else { - if (currentCssLinks[i].media.indexOf("fallback") >= 0) { - currentCssLinks[i].owningElement.parentNode.removeChild(currentCssLinks[i].owningElement) - i-- - break; - } - } - } - } - if (typeof(cssHref) == "object") { - for (var i = 0; i < cssHref.length; i++) { - addCssLink(cssHref[i]) - } - } else { - addCssLink(cssHref) - } - - currentCssMediaType = newCssMediaType; - } - - - // Check screen size again if user resizes window - addEvent(window, wbos.CssTools.MediaQueryFallBack.LoadCssDelayed, 'onresize') - } - }, - - /** - * Runs LoadCSS after a short delay - * - * @since 1.0 - 2010-08-21 - * @version 1.0 - 2010-08-21 - * @example - * wbos.CssTools.MediaQueryFallBack.LoadCssDelayed() - */ - LoadCssDelayed: function() { - clearTimeout(delay); - delay = setTimeout( "wbos.CssTools.MediaQueryFallBack.LoadCss()", config.resizeDelay) - } - - } - /* End public */ -})(); - - - - - - -/** - * @namespace Adds a function to an event of a single element. Use this if - * you don't want to use jQuery - * @class - * @since 1.0 - 2010-02-23 - * @version 1.0 - 2010-02-23 - */ -wbos.Events = ( function() { - /* Start public */ - return { - /** - * Adds a function to an event of a single element - * - * @since 1.0 - 2010-02-23 - * @version 1.0 - 2010-02-23 - * @param {Object} element The element on which the event is placed - * @param {Function} newFunction The function that has to be linked to the event - * @param {String} eventType Name of the event - * @example - * wbos.Events.AddEvent( document.getElementById('elementId'), functionName, "onclick" ) - */ - AddEvent: function( element, newFunction, eventType ) { - var oldEvent = eval("element." + eventType); - var eventContentType = eval("typeof element." + eventType) - - if ( eventContentType != 'function' ) { - eval("element." + eventType + " = newFunction") - } else { - eval("element." + eventType + " = function(e) { oldEvent(e); newFunction(e); }") - } - } - } - /* End public */ -})(); - - - - - - -if (typeof(codeview) == "undefined") { - /** - * @namespace Code written for the Codeview template - */ - codeview = {} -} - - - - - - - -/** - * @namespace Enables filtering in class lists - * @class - * @since 1.0 - 2010-11-08 - * @version 1.0 - 2010-11-08 - */ -codeview.classFilter = ( function() { - function onkeyup_ClassFilter() { - var listItems - var search = document.getElementById('ClassFilter').value - search = search.toLowerCase() - if (document.getElementById('ClassList')) { - listItems = document.getElementById('ClassList').getElementsByTagName('li') - filterList(listItems, search) - } - if (document.getElementById('ClassList2')) { - listItems = document.getElementById('ClassList2').getElementsByTagName('li') - filterList(listItems, search) - } - if (document.getElementById('FileList')) { - listItems = document.getElementById('FileList').getElementsByTagName('li') - filterList(listItems, search) - } - if (document.getElementById('MethodsListInherited')) { - var links = document.getElementById('MethodsListInherited').getElementsByTagName('a') - var linksSelected = new Array() - for (var i=0; i < links.length; i++) { - if (links[i].parentNode.parentNode.tagName == "DD") { - linksSelected.push(links[i]) - } - } - filterList(linksSelected, search) - } - if (document.getElementById('MethodsList')) { - listItems = document.getElementById('MethodsList').getElementsByTagName('tbody')[0].getElementsByTagName('tr') - filterList(listItems, search, document.getElementById('MethodDetail').getElementsByTagName('li')) - } - } - - function filterList(listItems, search, relatedElements) { - var itemContent = "" - for (var i=0; i < listItems.length; i++) { - itemContent = listItems[i].textContent||listItems[i].innerText - if (itemContent != undefined) { - itemContent = itemContent.toLowerCase() - itemContent = itemContent.replace(/\s/g, "") - if (itemContent.indexOf(search) >= 0 || itemContent == "") { - listItems[i].style.display = "" - } else { - listItems[i].style.display = "none" - } - if (relatedElements != null) { - filterRelatedList(listItems[i], search, relatedElements) - } - } - } - } - - function filterRelatedList(listItem, search, relatedElements) { - var itemIndex = parseInt(listItem.className.replace('item', '')) - if (itemIndex <= relatedElements.length) { - if (relatedElements[itemIndex].className == "item"+ itemIndex) { - relatedElements[itemIndex].style.display = listItem.style.display - } - } - } - - - - - - /* Start public */ - return { - Init: function() { - wbos.Events.AddEvent( - document.getElementById('ClassFilter'), - onkeyup_ClassFilter, - "onkeyup" - ) - } - } - /* End public */ -})(); diff --git a/docs/javascript/html5.js b/docs/javascript/html5.js deleted file mode 100644 index 3587bf73..00000000 --- a/docs/javascript/html5.js +++ /dev/null @@ -1,6 +0,0 @@ -// html5shiv MIT @rem remysharp.com/html5-enabling-script -// iepp v1.6.2 MIT @jon_neal iecss.com/print-protector -/*@cc_on(function(m,c){var z="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video";function n(d){for(var a=-1;++ai";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", -"gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, -g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++d - - - - - Admin.Job | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Admin.Job -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Admin.Job(target, method, user) -
-
-
-
- - - - - - - - - - -
-
-

- Class Detail -

- -
- Admin.Job(target, method, user) -
- -
- - -
- - - - -
-
Parameters:
- -
- {HopObject} target - -
-
- -
- {String} method - -
-
- -
- {User} user - -
-
- -
- - - -
-
- - - - - - - - -
-
- - - - diff --git a/docs/symbols/Admin.html b/docs/symbols/Admin.html deleted file mode 100644 index 77247f6a..00000000 --- a/docs/symbols/Admin.html +++ /dev/null @@ -1,1970 +0,0 @@ - - - - - - - Admin | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Admin -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Admin() -
-
The Admin prototype is mounted at root and provides actions needed -for system administration.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  - -
Contains sites scheduled for deletion
-
  -
- entries -
-
Contains administrative log entries only
-
  - -
Contains sites which are restricted but not blocked
-
  -
- sites -
-
Contains all available sites
-
  -
- users -
-
Contains all available users
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Admin.commitEntries() -
-
-
<static>   -
Admin.commitRequests() -
-
-
  -
count_macro(param, object) -
-
-
<static>   -
Admin.dequeue() -
-
-
  -
dropdown_macro(param) -
-
-
  -
filterLog(data) -
-
-
  -
filterSites(data) -
-
-
  -
filterUsers(data) -
-
-
<static>   - -
-
<static>   - -
-
  -
getPermission(action) -
-
-
<static>   -
Admin.getPhaseOutModes() -
-
-
<static>   -
Admin.invokeCallbacks() -
-
-
  -
items_macro(param, object, name) -
-
-
  -
link_macro(param, action, id, text) -
-
-
  -
log(context, action) -
-
-
  - -
-
  - -
-
<static>   -
Admin.purgeReferrers() -
-
-
<static>   -
Admin.purgeSites() -
-
-
<static>   -
Admin.queue(target, method, user) -
-
Convenience method for easily queueing jobs.
-
  -
renderItem(item) -
-
-
  -
skin_macro(param, name) -
-
-
  -
update(data) -
-
-
<static>   -
Admin.updateDomains() -
-
-
<static>   -
Admin.updateHealth() -
-
-
  -
updateSite(data) -
-
-
  -
updateUser(data) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Admin() -
- -
- The Admin prototype is mounted at root and provides actions needed -for system administration. A user needs the User.PRIVILEGED permission -to gain access or modify settings. - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Sites[]} - - deletedSites -
- -
- Contains sites scheduled for deletion - - - -
- - - - -
- -
- - - - - {LogEntry[]} - - entries -
- -
- Contains administrative log entries only - - - -
- - - - -
- -
- - - - - {Sites[]} - - restrictedSites -
- -
- Contains sites which are restricted but not blocked - - - -
- - - - -
- -
- - - - - {Sites[]} - - sites -
- -
- Contains all available sites - - - -
- - - - -
- -
- - - - - {Users[]} - - users -
- -
- Contains all available users - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Admin.commitEntries() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.commitRequests() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - count_macro(param, object) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {HopObject} object - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.dequeue() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - filterLog(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - filterSites(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - filterUsers(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Admin.getCreationScopes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Admin.getNotificationScopes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Admin.getPhaseOutModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.invokeCallbacks() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - items_macro(param, object, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {HopObject} object - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} action - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} text - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - log(context, action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} context - -
    -
    - -
    - {String} action - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - onRequest() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - onUnhandledMacro(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.purgeReferrers() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.purgeSites() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - {String} - - Admin.queue(target, method, user) -
    - -
    - Convenience method for easily queueing jobs. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} target - -
    -
    - -
    - {String} method - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - -
    See:
    - -
    Admin.Job
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - renderItem(item) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} item - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - skin_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.updateDomains() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - Admin.updateHealth() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - updateSite(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - updateUser(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Api.blogger.html b/docs/symbols/Api.blogger.html deleted file mode 100644 index 291235ea..00000000 --- a/docs/symbols/Api.blogger.html +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - Api.blogger | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Api.blogger -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  - -
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<private> <static>   -
Api.blogger._getContentParts(content) -
-
-
<static>   -
Api.blogger.deletePost(appKey, id, name, password) -
-
-
<static>   -
Api.blogger.editPost(appKey, id, name, password, content, publish) -
-
-
<static>   -
Api.blogger.getPost(appKey, id, name, password) -
-
-
<static>   -
Api.blogger.getRecentPosts(appKey, id, name, password, limit) -
-
-
<static>   -
Api.blogger.getUserInfo(appKey, name, password) -
-
-
<static>   -
Api.blogger.getUsersBlogs(appKey, name, password) -
-
-
<static>   -
Api.blogger.newPost(appKey, id, name, password, content, publish) -
-
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- Api.blogger -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <private> <static> - - - - - Api.blogger._getContentParts(content) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} content - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Api.blogger.deletePost(appKey, id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Boolean} Always true
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Api.blogger.editPost(appKey, id, name, password, content, publish) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String} content - -
    -
    - -
    - {Boolean} publish - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Boolean} Always true
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - Api.blogger.getPost(appKey, id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object} Properties: content, userid, postid, dateCreated
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.blogger.getRecentPosts(appKey, id, name, password, limit) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {Number} limit - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]} A list of objects with the properties postid, userid, -dateCreated and content
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - Api.blogger.getUserInfo(appKey, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object} Properties: userid, nickname and url
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.blogger.getUsersBlogs(appKey, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object[]} A list of objects with the properties blogid, blogName and -url
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Number} - - Api.blogger.newPost(appKey, id, name, password, content, publish) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} appKey - -
    -
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String} content - -
    -
    - -
    - {Boolean} publish - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Number} The ID of the new story
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Api.html b/docs/symbols/Api.html deleted file mode 100644 index 5aa6e0b0..00000000 --- a/docs/symbols/Api.html +++ /dev/null @@ -1,789 +0,0 @@ - - - - - - - Api | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Api -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Api() -
-
-
-
- - - - - - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Api.constrain(site, user) -
-
-
  - -
-
  - -
-
<static>   -
Api.getSite(name) -
-
-
<static>   -
Api.getStory(id) -
-
-
<static>   -
Api.getUser(name, password) -
-
-
  -
main_action_xmlrpc(methodName) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Api() -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Api.constrain(site, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Site} site - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - getChildElement(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Site} - - Api.getSite(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Site}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Story} - - Api.getStory(id) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Story}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {User} - - Api.getUser(name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {User}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - main_action_xmlrpc(methodName) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} methodName - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Api.metaWeblog.html b/docs/symbols/Api.metaWeblog.html deleted file mode 100644 index 0831cafd..00000000 --- a/docs/symbols/Api.metaWeblog.html +++ /dev/null @@ -1,944 +0,0 @@ - - - - - - - Api.metaWeblog | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Api.metaWeblog -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  - -
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<private> <static>   -
Api.metaWeblog._getStruct(story) -
-
-
<static>   -
Api.metaWeblog.editPost(id, name, password, content, publish) -
-
-
<static>   -
Api.metaWeblog.getCategories(id, name, password) -
-
-
<static>   -
Api.metaWeblog.getPost(id, name, password) -
-
-
<static>   -
Api.metaWeblog.getRecentPosts(id, name, password, limit) -
-
-
<static>   -
Api.metaWeblog.newMediaObject(id, name, password, media) -
-
-
<static>   -
Api.metaWeblog.newPost(id, name, password, content, publish) -
-
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- Api.metaWeblog -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <private> <static> - - - {Object} - - Api.metaWeblog._getStruct(story) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Story} story - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Api.metaWeblog.editPost(id, name, password, content, publish) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String} content - -
    -
    - -
    - {Boolean} publish - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.metaWeblog.getCategories(id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - Api.metaWeblog.getPost(id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.metaWeblog.getRecentPosts(id, name, password, limit) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {Number} limit - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - Api.metaWeblog.newMediaObject(id, name, password, media) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String} media - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Number} - - Api.metaWeblog.newPost(id, name, password, content, publish) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String} content - -
    -
    - -
    - {Boolean} publish - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Api.mt.html b/docs/symbols/Api.mt.html deleted file mode 100644 index 7b82c39f..00000000 --- a/docs/symbols/Api.mt.html +++ /dev/null @@ -1,939 +0,0 @@ - - - - - - - Api.mt | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Api.mt -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- Api.mt -
-
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Api.mt.getCategoryList(id, name, password) -
-
-
<static>   -
Api.mt.getPostCategories(id, name, password) -
-
-
<static>   -
Api.mt.getRecentPostTitles(id, name, password, limit) -
-
-
<static>   -
Api.mt.getTrackbackPings() -
-
-
<static>   -
Api.mt.publishPost(id, name, password) -
-
-
<static>   -
Api.mt.setPostCategories(id, name, password, categories) -
-
-
<static>   -
Api.mt.supportedMethods() -
-
-
<static>   - -
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- Api.mt -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Object[]} - - Api.mt.getCategoryList(id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.mt.getPostCategories(id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object[]} - - Api.mt.getRecentPostTitles(id, name, password, limit) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {Number} limit - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Array} - - Api.mt.getTrackbackPings() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Array}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Api.mt.publishPost(id, name, password) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Api.mt.setPostCategories(id, name, password, categories) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} password - -
    -
    - -
    - {String[]} categories - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Api.mt.supportedMethods() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Array} - - Api.mt.supportedTextFilters() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Array}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Archive.html b/docs/symbols/Archive.html deleted file mode 100644 index a5c3c54f..00000000 --- a/docs/symbols/Archive.html +++ /dev/null @@ -1,1133 +0,0 @@ - - - - - - - Archive | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Archive -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Archive(name, type, parent) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- name -
-
-
  -
- parent -
-
-
  -
- type -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  - -
-
  -
getDate() -
-
-
  - -
-
  -
getPage() -
-
-
  - -
-
  -
getPermission(action) -
-
-
  -
getSize() -
-
-
  -
href(action) -
-
-
  -
link_macro(param, action, text) -
-
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Archive(name, type, parent) -
- -
- - -
- - - - -
-
Parameters:
- -
- {Object} name - -
-
- -
- {Object} type - -
-
- -
- {Object} parent - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Story[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - parent -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - type -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {HopObject} - - getChildElement(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Date} - - getDate() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Date}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getFilter() -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {boolean} - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getPage() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getPageSize() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getSize() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} action - -
    -
    - -
    - {String} text - -
    -
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    renderLink
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - stories_macro() -
    - -
    - - - - - -
    - - - - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Choice.html b/docs/symbols/Choice.html deleted file mode 100644 index a7bcd08c..00000000 --- a/docs/symbols/Choice.html +++ /dev/null @@ -1,691 +0,0 @@ - - - - - - - Choice | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Choice -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Choice(title) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- created -
-
-
  -
- modified -
-
-
  -
- poll -
-
-
  -
- title -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Choice.add(title, poll) -
-
-
<static>   -
Choice.remove() -
-
-
  - -
-
  -
votes_macro(param, variant) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getPermission
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Choice(title) -
- -
- - -
- - - - -
-
Parameters:
- -
- {String} title - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Vote[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {Poll} - - poll -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - title -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Choice.add(title, poll) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - title - -
    -
    - -
    - poll - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Choice.remove() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - selected_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - votes_macro(param, variant) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} variant - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Comment.html b/docs/symbols/Comment.html deleted file mode 100644 index a65ea6d1..00000000 --- a/docs/symbols/Comment.html +++ /dev/null @@ -1,1160 +0,0 @@ - - - - - - - Comment | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Comment -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Comment() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
<static>   -
- Comment.getStatus -
-
-
  -
- name -
-
-
  -
- parent -
-
-
  -
- story -
-
-
-
- - - -
-
Fields borrowed from class Story:
commentMode, comments, created, creator, metadata, mode, modified, modifier, parent_id, parent_type, prototype, requests, site, status, tags, text, title
-
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Comment.add(data, parent) -
-
Convenience method for easily adding a new comment to an existing story or comment.
-
  - -
-
  - -
-
  - -
-
  -
getPermission(action) -
-
-
  -
href(action) -
-
-
  -
link_macro(param, action, text) -
-
-
  - -
-
<static>   -
Comment.remove(options) -
-
-
  - -
-
  -
update(data) -
-
-
- - - -
-
Methods borrowed from class Story:
comments_macro
count
format_filter
getDelta
getFormOptions
getFormValue
getTitle
isCustomContent
macro_filter
referrers_macro
setCustomContent
summary_macro
tags_macro
url_filter
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
deleteMetadata
getMetadata
getTags
handleMetadata
input_macro
kind_macro
link_filter
log
macro_macro
map
metadata_macro
modified_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Comment() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Comment[]} - - _children -
- -
- - - - -
- - - - -
- -
- - <static> - - - - - Comment.getStatus -
- -
- - - - -
- - - -
- - - - -
See:
- -
defineConstants
- - - -
- - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Story|Comment} - - parent -
- -
- - - - -
- - - - -
- -
- - - - - {Story} - - story -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Comment} - - Comment.add(data, parent) -
    - -
    - Convenience method for easily adding a new comment to an existing story or comment. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - {Story|Comment} parent - -
    -
    The story or comment this comment belongs to.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Comment}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - creator_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {Object} action - -
    -
    - -
    - {Object} text - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - modifier_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - {String} - - Comment.remove(options) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - options - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - text_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Exporter.html b/docs/symbols/Exporter.html deleted file mode 100644 index 5b85d85f..00000000 --- a/docs/symbols/Exporter.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - Exporter | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Exporter -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- Exporter -
-
The Exporter namespace provides methods for exporting a site.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Exporter.run(site, user) -
-
Exports a site with the specified user’s content -The created XML file will be added to the site’s file collection.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- Exporter -
- -
- The Exporter namespace provides methods for exporting a site. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Exporter.run(site, user) -
    - -
    - Exports a site with the specified user’s content -The created XML file will be added to the site’s file collection. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Site} site - -
    -
    The site to export.
    - -
    - {User} user - -
    -
    The user whose content will be exported.
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Feature.html b/docs/symbols/Feature.html deleted file mode 100644 index 32ad2f9f..00000000 --- a/docs/symbols/Feature.html +++ /dev/null @@ -1,815 +0,0 @@ - - - - - - - Feature | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Feature -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Feature(id, url, feature) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- id -
-
The feature’s unique identifier.
-
-
- - - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Feature.add(id, url, feature) -
-
Adds a feature to the registry.
-
<static>   -
Feature.get(id) -
-
Retrieves a feature from the registry.
-
<static>   -
Feature.getPermission(action) -
-
Wrapper for the Feature._getPermission method.
-
<static>   -
Feature.invoke(id, callback) -
-
Invokes a (callback) function for a feauture.
-
<static>   -
Feature.list() -
-
Lists all available features in the registry.
-
<static>   -
Feature.remove(feature) -
-
Removes a feature from the registry.
-
- - - -
- - - - - - -
-
-

- Class Detail -

- -
- Feature(id, url, feature) -
- -
- - -
- - - - -
-
Parameters:
- -
- {String} id - -
-
A unique identifier for the feature.
- -
- {String} url - -
-
The URL of the website providing further information about the feature.
- -
- {Object} feature - -
-
The initial properties of the feature.
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {String} - - id -
- -
- The feature’s unique identifier. - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Feature} - - Feature.add(id, url, feature) -
    - -
    - Adds a feature to the registry. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - url - -
    -
    - -
    - feature - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Feature}
    - - - - - - -
    See:
    - -
    Feature
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Feature} - - Feature.get(id) -
    - -
    - Retrieves a feature from the registry. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} id - -
    -
    The identifier of the desired feature.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Feature}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Feature.getPermission(action) -
    - -
    - Wrapper for the Feature._getPermission method. All registered features will be evaluated. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    The desired action to be invoked.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - Feature.invoke(id, callback) -
    - -
    - Invokes a (callback) function for a feauture. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} id - -
    -
    The identifier of the desired feature. '*' can be used to address all available features.
    - -
    - {Function|String} callback - -
    -
    The callback function or the name of method of the feature.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Feature[]} - - Feature.list() -
    - -
    - Lists all available features in the registry. - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Feature[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Number} - - Feature.remove(feature) -
    - -
    - Removes a feature from the registry. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Feature} feature - -
    -
    The feature object to be removed.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number} The resulting number of features still in the registry.
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/File.html b/docs/symbols/File.html deleted file mode 100644 index 29f0df81..00000000 --- a/docs/symbols/File.html +++ /dev/null @@ -1,1382 +0,0 @@ - - - - - - - File | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class File -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- File() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- created -
-
-
  -
- creator -
-
-
  -
- metadata -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- name -
-
-
  -
- parent_id -
-
-
  - -
-
  -
- prototype -
-
-
  -
- requests -
-
-
  -
- site -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
File.add(data, site, user) -
-
-
  - -
-
  - -
-
  -
getFile() -
-
-
  -
getFormValue(name) -
-
-
<static>   -
File.getName(name) -
-
-
  -
getPermission(action) -
-
-
  -
getUrl() -
-
-
<static>   - -
-
<static>   - -
-
<static>   -
File.remove() -
-
-
  -
update(data) -
-
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- File() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - parent_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - parent_type -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - prototype -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - requests -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {File} - - File.add(data, site, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - {Site} site - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {File}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - contentLength_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - getFile() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormValue(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - File.getName(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - getUrl() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - File.redirectOnExceededQuota(url) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} url - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - File.redirectOnUploadError(url) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} url - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - File.remove() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - url_macro() -
    - -
    - - - - - -
    - - - - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Files.html b/docs/symbols/Files.html deleted file mode 100644 index 6902352f..00000000 --- a/docs/symbols/Files.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - - Files | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Files -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Files() -
-
-
-
- - - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- Files() -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/HopObject.html b/docs/symbols/HopObject.html deleted file mode 100644 index f15557fe..00000000 --- a/docs/symbols/HopObject.html +++ /dev/null @@ -1,2557 +0,0 @@ - - - - - - - HopObject | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class HopObject -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- HopObject() -
-
Helma’s built-in HopObject with Antville’s extensions.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  -
addTag(name) -
-
-
  -
checkbox_macro(param, name) -
-
-
<static>   -
HopObject.confirmConstructor(ref) -
-
Debugging method to detect direct constructor calls which -should be replaced with static add() method.
-
  -
created_macro(param, format) -
-
-
  -
creator_macro(param, mode) -
-
-
  - -
-
  - -
-
  -
getFormValue(name) -
-
-
<static>   -
HopObject.getFromPath(name, collection) -
-
-
  -
getMetadata(name) -
-
-
  - -
-
  -
getTags() -
-
-
  - -
-
  - -
-
  -
input_macro(param, name) -
-
-
  - -
-
  -
link_filter(text, param, action) -
-
-
  -
link_macro(param, url, text) -
-
-
  -
log() -
-
-
  -
macro_macro(param, handler) -
-
-
  -
map(values) -
-
-
  -
metadata_macro(param, name) -
-
-
  -
modified_macro(param, format) -
-
-
  -
modifier_macro(param, mode) -
-
-
  -
notify(action) -
-
-
  - -
-
  - -
-
  -
radiobutton_macro(param, name) -
-
-
<static>   -
HopObject.remove(collection, options) -
-
-
  -
removeTag(tag) -
-
-
  -
select_macro(param, name) -
-
-
  -
self_macro(param, property) -
-
-
  -
setMetadata(name, value) -
-
-
  -
setTags(tags) -
-
-
  -
skin_macro(param, name) -
-
-
  -
textarea_macro(param, name) -
-
-
  - -
-
  -
touch() -
-
-
  - -
-
  -
upload_macro(param, name) -
-
-
- - - -
- - - - - - -
-
-

- Class Detail -

- -
- HopObject() -
- -
- Helma’s built-in HopObject with Antville’s extensions. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - - - addTag(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - checkbox_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - HopObject.confirmConstructor(ref) -
    - -
    - Debugging method to detect direct constructor calls which -should be replaced with static add() method. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - ref - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - created_macro(param, format) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} format - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - creator_macro(param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - deleteMetadata(name) -
    - -
    - - - -
    - Defined in: metadata.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Object[]} - - getFormOptions() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number|String} - - getFormValue(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number|String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - HopObject.getFromPath(name, collection) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {HopObject} collection - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Object} - - getMetadata(name) -
    - -
    - - - -
    - Defined in: metadata.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - getPermission() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    Boolean
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Tag[]} - - getTags() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Tag[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getTitle() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - handleMetadata(name) -
    - -
    - - - -
    - Defined in: metadata.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - input_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - kind_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} text - -
    -
    - -
    - {Object} param - -
    -
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} url - -
    -
    - -
    - {String} text - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - log() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - macro_macro(param, handler) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {HopObject} handler - Optional -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - map(values) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} values - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - metadata_macro(param, name) -
    - -
    - - - -
    - Defined in: metadata.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - modified_macro(param, format) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} format - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - modifier_macro(param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - notify(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - onCodeUpdate() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - onRequest() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - radiobutton_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - HopObject.remove(collection, options) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} collection - -
    -
    - -
    - {Object} options - -
    -
    Optional flags, e.g. to force or prevent any -conditional checks of individual prototype’s remove() methods
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - removeTag(tag) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} tag - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - select_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {HopObject} - - self_macro(param, property) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} property - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - setMetadata(name, value) -
    - -
    - - - -
    - Defined in: metadata.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {Object} value - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - setTags(tags) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Tag[]|String} tags - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - skin_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - textarea_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - touch() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - type_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - upload_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Image.html b/docs/symbols/Image.html deleted file mode 100644 index 450d6973..00000000 --- a/docs/symbols/Image.html +++ /dev/null @@ -1,2372 +0,0 @@ - - - - - - - Image | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Image -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Image(data) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  - -
-
  - -
-
  -
- created -
-
-
  -
- creator -
-
-
  - -
-
  -
- fileName -
-
-
  -
- height -
-
-
<static> <constant>   -
- Image.KEYS -
-
-
  -
- metadata -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- name -
-
-
  -
- origin -
-
-
  -
- parent -
-
-
  -
- parent_id -
-
-
  - -
-
  -
- prototype -
-
-
  -
- tags -
-
-
  - -
-
  - -
-
<static> <constant>   -
- Image.THUMBNAILWIDTH -
-
-
  - -
-
  -
- width -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Image.add(data, parent, user) -
-
-
  - -
-
  - -
-
  -
getConstraint(mime, maxWidth, maxHeight) -
-
-
  -
getFile(name) -
-
-
<static>   -
Image.getFileExtension(type) -
-
-
  -
getFormValue(name) -
-
-
  -
getJSON() -
-
-
  -
getPermission(action) -
-
-
  - -
-
  -
getUrl(name) -
-
-
  -
href(action) -
-
-
  - -
-
<static>   -
Image.remove() -
-
-
  - -
-
  -
render_macro(param) -
-
-
  - -
-
  -
thumbnail_macro(param) -
-
-
  -
update(data) -
-
-
  - -
-
  -
writeFiles(data, thumbnail) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Image(data) -
- -
- - -
- - - - -
-
Parameters:
- -
- {Object} data - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Number} - - contentLength -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - contentType -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - description -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - fileName -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - height -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Image.KEYS -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - - - origin -
- -
- - - - -
- - - - -
- -
- - - - - {HopObject} - - parent -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - parent_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - parent_type -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - prototype -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - tags -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - thumbnailHeight -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - thumbnailName -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Image.THUMBNAILWIDTH -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - thumbnailWidth -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - width -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Image} - - Image.add(data, parent, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - {Site|Layout} parent - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Image}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - contentLength_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getConstraint(mime, maxWidth, maxHeight) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {helma.util.MimePart} mime - -
    -
    - -
    - {Number} maxWidth - -
    -
    - -
    - {Number} maxHeight - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {helma.File} - - getFile(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {helma.File}
    - - - - - - -
    See:
    - -
    Site#getStaticFile
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String} - - Image.getFileExtension(type) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} type - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormValue(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getJSON() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {helma.File} - - getThumbnailFile() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {helma.File}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getUrl(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - -
    See:
    - -
    Site#getStaticUrl
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - macro_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - Image.remove() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - removeFiles() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - render_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - tags_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - thumbnail_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - url_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - writeFiles(data, thumbnail) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {helma.Image|helma.util.MimePart} data - -
    -
    - -
    - {Object} thumbnail - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Images.Default.html b/docs/symbols/Images.Default.html deleted file mode 100644 index 508a90ae..00000000 --- a/docs/symbols/Images.Default.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - Images.Default | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Images.Default -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  - -
-
-
- - - - - - - - - - -
-
-

- Namespace Detail -

- -
- Images.Default -
- -
- - -
- - - - - - -
-
- - - - - - - - -
-
- - - - diff --git a/docs/symbols/Images.html b/docs/symbols/Images.html deleted file mode 100644 index cee1782c..00000000 --- a/docs/symbols/Images.html +++ /dev/null @@ -1,664 +0,0 @@ - - - - - - - Images | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Images -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Images() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  - -
-
  -
- galleries -
-
-
  - -
-
-
- - - -
- -
- - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- Images() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Image} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - alphabeticalGalleries -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - galleries -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - otherGalleries -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Tag[]} - - getTags(group) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Tag[]}
    - - - - - - -
    See:
    - -
    Site#getTags
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Image[]} - - mergeImages() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Image[]}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Importer.html b/docs/symbols/Importer.html deleted file mode 100644 index 90debf69..00000000 --- a/docs/symbols/Importer.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - - Importer | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace Importer -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- Importer -
-
The Importer namespace provides methods for importing a site.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Importer.run(site, user) -
-
Imports a site and its content for the specified user.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- Importer -
- -
- The Importer namespace provides methods for importing a site. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Importer.run(site, user) -
    - -
    - Imports a site and its content for the specified user. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Site} site - -
    -
    The site to import.
    - -
    - {User} user - -
    -
    The user who will become the creator of the site’s imported content.
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/JSON.html b/docs/symbols/JSON.html deleted file mode 100644 index 14594196..00000000 --- a/docs/symbols/JSON.html +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - - JSON | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace JSON -

- -
-

- -

- - -
    - - - -
  • Defined in: JSON.js
  • - - -
- -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- JSON -
-
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
JSON.pad(callback, data) -
-
Create a JSONP-compatible response from the callback name and the desired data.
-
<static>   -
JSON.parse(text, reviver) -
-
This method parses a JSON text to produce an object or array.
-
<static>   -
JSON.sendPaddedResponse(data, key, resume) -
-
Send a JSONP-compatible response if a the request contains callback data.
-
<static>   -
JSON.stringify(value, replacer, space) -
-
This method produces a JSON text from a JavaScript value.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- JSON -
- -
- - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - JSON.pad(callback, data) -
    - -
    - Create a JSONP-compatible response from the callback name and the desired data. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} callback - -
    -
    The name of the JSONP callback method
    - -
    - {Object} data - -
    -
    An arbitrary JavaScript object
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {Object} - - JSON.parse(text, reviver) -
    - -
    - This method parses a JSON text to produce an object or array. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} text - -
    -
    The JSON text.
    - -
    - {Function} reviver - -
    -
    A function that can filter and -transform the results. It receives each of the keys and values, -and its return value is used instead of the original value. -If it returns what it received, then the structure is not modified. -If it returns undefined then the member is deleted.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - JSON.sendPaddedResponse(data, key, resume) -
    - -
    - Send a JSONP-compatible response if a the request contains callback data. -This works out-of-the-box with jQuery but can be customized using the key argument. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    An arbitrary JavaScript object
    - -
    - {String} key - -
    -
    The name of the property in req.data containing the JSONP callback method name
    - -
    - {Boolean} resume - -
    -
    Switch to define whether further processing should be continued or not
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {String} - - JSON.stringify(value, replacer, space) -
    - -
    - This method produces a JSON text from a JavaScript value. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    Any JavaScript value, usually an object or array.
    - -
    - {Function|String[]} replacer - Optional -
    -
    An optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings.
    - -
    - {String|Number} space - Optional -
    -
    An optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Layout.html b/docs/symbols/Layout.html deleted file mode 100644 index 82f10715..00000000 --- a/docs/symbols/Layout.html +++ /dev/null @@ -1,1881 +0,0 @@ - - - - - - - Layout | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Layout -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Layout() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- created -
-
-
  -
- creator -
-
-
  -
- images -
-
-
  -
- metadata -
-
-
  -
- mode -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- origin -
-
-
  - -
-
  - -
-
  -
- site -
-
-
  -
- skins -
-
-
<static> <constant>   -
- Layout.VALUES -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Layout.add(site, user) -
-
-
  -
getArchive(skinPath) -
-
-
  - -
-
  -
getFile(name) -
-
-
  - -
-
  -
getImage(name, fallback) -
-
-
  - -
-
<static>   -
Layout.getModes() -
-
-
  -
getPermission(action) -
-
-
  - -
-
  -
href(action) -
-
-
  -
image_macro(param, name, mode) -
-
-
<static>   -
Layout.remove(layout, includeSelf) -
-
-
  -
reset() -
-
-
<static>   -
Layout.sandbox(value) -
-
-
  - -
-
  -
update(data) -
-
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Layout() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {Images} - - images -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - mode -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - origin -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - originated -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - originator -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - -
- -
- - - - - {Skins} - - skins -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Layout.VALUES -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Layout} - - Layout.add(site, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Site} site - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Layout}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {helma.Zip} - - getArchive(skinPath) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} skinPath - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {helma.Zip}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {helma.File} - - getFile(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {helma.File}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Image} - - getImage(name, fallback) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {String} fallback - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Image}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Layout.getModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String[]} - - getSkinPath() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - image_macro(param, name, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Layout.remove(layout, includeSelf) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Layout} layout - -
    -
    - -
    - {Boolean} includeSelf - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - reset() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Layout.sandbox(value) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Boolean} value - Optional -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - sandbox_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - values_macro() -
    - -
    - - - - - -
    - - - - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/LogEntry.html b/docs/symbols/LogEntry.html deleted file mode 100644 index 455b09ee..00000000 --- a/docs/symbols/LogEntry.html +++ /dev/null @@ -1,751 +0,0 @@ - - - - - - - LogEntry | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class LogEntry -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- LogEntry(context, action) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- action -
-
-
  -
- context -
-
-
  - -
-
  - -
-
  -
- created -
-
-
  -
- creator -
-
-
  -
- referrer -
-
-
-
- - - -
- -
- - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- LogEntry(context, action) -
- -
- - -
- - - - -
-
Parameters:
- -
- {HopObject} context - -
-
- -
- {String} action - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {String} - - action -
- -
- - - - -
- - - - -
- -
- - - - - {HopObject} - - context -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - context_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - context_type -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - referrer -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - label_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Members.html b/docs/symbols/Members.html deleted file mode 100644 index cf4525bc..00000000 --- a/docs/symbols/Members.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - Members | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Members -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Members() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  - -
-
  -
- managers -
-
-
  -
- owners -
-
-
  - -
-
-
- - - -
- -
- - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- Members() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Membership[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - contributors -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - managers -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - owners -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - subscribers -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Membership} - - addMembership(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Membership}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} searchString - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Membership.html b/docs/symbols/Membership.html deleted file mode 100644 index 2704c7bf..00000000 --- a/docs/symbols/Membership.html +++ /dev/null @@ -1,1843 +0,0 @@ - - - - - - - Membership | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Membership -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Membership(user, role) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- comments -
-
-
  -
- content -
-
-
  -
- created -
-
-
  -
- creator -
-
-
  -
- files -
-
-
  -
- images -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- name -
-
-
  -
- polls -
-
-
  -
- role -
-
-
  -
- site -
-
-
  -
- stories -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Membership.add(user, role, site) -
-
-
<static>   -
Membership.getByName(name, site) -
-
-
  - -
-
  - -
-
  - -
-
  -
getPermission(action) -
-
-
<static>   -
Membership.getRoles() -
-
-
  -
link_filter(value, param) -
-
-
  -
notify(action, recipient, subject) -
-
-
<static>   -
Membership.remove(membership, options) -
-
-
  -
require(role) -
-
-
<static>   -
Membership.require(role) -
-
-
  - -
-
  - -
-
  - -
-
  -
update(data) -
-
-
  -
valueOf() -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Membership(user, role) -
- -
- - -
- - - - -
-
Parameters:
- -
- {User} user - -
-
- -
- {String} role - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Comment[]} - - comments -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - content -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {File[]} - - files -
- -
- - - - -
- - - - -
- -
- - - - - {Image[]} - - images -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Poll[]} - - polls -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - role -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - stories -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Membership.add(user, role, site) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {User} user - -
    -
    - -
    - {String} role - -
    -
    - -
    - {Site} site - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {Membership} - - Membership.getByName(name, site) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {Site} site - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Membership}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Membership.getRoles() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    - -
    - {Object} param - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - -
    See:
    - -
    HopObject#link_filter
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - notify(action, recipient, subject) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - {String} recipient - -
    -
    - -
    - {String} subject - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Membership.remove(membership, options) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Membership} membership - -
    -
    - -
    - {Object} options - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - require(role) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} role - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Membership.require(role) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} role - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - role_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - status_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - valueOf() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - - - - - -
    See:
    - -
    #toString
    - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Metadata.html b/docs/symbols/Metadata.html deleted file mode 100644 index 8db0e29c..00000000 --- a/docs/symbols/Metadata.html +++ /dev/null @@ -1,857 +0,0 @@ - - - - - - - Metadata | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Metadata -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Metadata() -
-
The Metadata prototype provides means to store one metadata key-value -pair per record in the metadata database table.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- name -
-
The name (key) of the metadata object.
-
  -
- parent -
-
The HopObject the metadata belongs to.
-
  -
- type -
-
The type of the metadata object.
-
  -
- value -
-
The value of the metadata object.
-
-
- - - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Metadata.getTypeProperties() -
-
Get an object representing the type properties settings suitable for -defining prototypes with the definePrototype() method.
-
  - -
Get the value of a metadata object.
-
<static>   -
Metadata.normalize(value) -
-
Prepare a value for writing it to the metadata database table.
-
  - -
Handle macros which are not defined elsewhere.
-
  -
setValue(value) -
-
Set the value of a metadata object.
-
  - -
Get a textual representation of the metadata object.
-
- - - -
- - - - - - -
-
-

- Class Detail -

- -
- Metadata() -
- -
- The Metadata prototype provides means to store one metadata key-value -pair per record in the metadata database table. Each record is assigned to a -parent HopObject which is fitted with convenient methods to easily retrieve -and modify the attached metadata objects. - -
- - - - - - -
- - - - - - - - - - - -
See:
- -
HopObject#handleMetadata
- - -
- -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {String} - - name -
- -
- The name (key) of the metadata object. - - - -
- - - - -
- -
- - - - - {HopObject} - - parent -
- -
- The HopObject the metadata belongs to. - - - -
- - - - -
- -
- - - - - {String} - - type -
- -
- The type of the metadata object. - - - -
- - - - -
- -
- - - - - {Object} - - value -
- -
- The value of the metadata object. - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Object} - - Metadata.getTypeProperties() -
    - -
    - Get an object representing the type properties settings suitable for -defining prototypes with the definePrototype() method. - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object} The type properties settings as object.
    - - - - - - -
    See:
    - -
    Helma documentation
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getValue() -
    - -
    - Get the value of a metadata object. - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object} The value of the metadata object.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Array} - - Metadata.normalize(value) -
    - -
    - Prepare a value for writing it to the metadata database table. -The type of each metadata is stored along with its value. -The normalize() method determines the type and possibly modifies -the value accordingly. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Array} Compound value consisting of two elements, -the (normalized) metadata value and its type.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - onUnhandledMacro(name) -
    - -
    - Handle macros which are not defined elsewhere. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    The name of the macro.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object} The resulting value.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - setValue(value) -
    - -
    - Set the value of a metadata object. If the value equals null -the metadata object will be removed. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    The desired metadata value.
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - Get a textual representation of the metadata object. - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} A textual representation of the metadata object.
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Poll.html b/docs/symbols/Poll.html deleted file mode 100644 index 02f375f8..00000000 --- a/docs/symbols/Poll.html +++ /dev/null @@ -1,1397 +0,0 @@ - - - - - - - Poll | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Poll -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Poll(question) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- closed -
-
-
  -
- created -
-
-
  -
- creator -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- question -
-
-
  -
- site -
-
-
  -
- status -
-
-
  -
- votes -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Poll.add(question, site) -
-
-
  -
closed_macro(param, format) -
-
-
  - -
-
  - -
-
  -
getPermission(action) -
-
-
<static>   -
Poll.getStatus(ctor) -
-
-
  -
input_macro(param, name) -
-
-
  -
link_macro(param, action, text) -
-
-
<static>   -
Poll.remove() -
-
-
  -
update(data) -
-
-
  -
vote(data) -
-
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTags
getTitle
handleMetadata
kind_macro
link_filter
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Poll(question) -
- -
- - -
- - - - -
-
Parameters:
- -
- {String} question - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Choice[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - closed -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - question -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - status -
- -
- - - - -
- - - - -
- -
- - - - - {Vote[]} - - votes -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Poll.add(question, site) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} question - -
    -
    - -
    - site - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - closed_macro(param, format) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} format - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Poll.getStatus(ctor) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} ctor - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - input_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    HopObject#link_macro
    - - - -
    - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} action - -
    -
    - -
    - {String} text - -
    -
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    HopObject#link_macro
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - Poll.remove() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - vote(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - votes_macro() -
    - -
    - - - - - -
    - - - - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Polls.html b/docs/symbols/Polls.html deleted file mode 100644 index 1a79c156..00000000 --- a/docs/symbols/Polls.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - Polls | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Polls -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Polls() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- open -
-
-
-
- - - -
- -
- - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- Polls() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Poll[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Poll[]} - - open -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Root.html b/docs/symbols/Root.html deleted file mode 100644 index c7ae0c30..00000000 --- a/docs/symbols/Root.html +++ /dev/null @@ -1,1281 +0,0 @@ - - - - - - - Root | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Root -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Root() -
-
Antville’s Root prototype is an extent of the Site prototype.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- admin -
-
-
  -
- admins -
-
-
  -
- api -
-
-
  - -
-
  - -
-
  - -
-
  - -
-
  - -
-
  - -
-
  - -
-
  -
- quote -
-
-
  -
- replyTo -
-
-
  -
- sites -
-
-
  -
- updates -
-
-
  -
- users -
-
-
<static> <constant>   -
- Root.VERSION -
-
-
-
- - - -
-
Fields borrowed from class Site:
$tags, archive, archiveMode, commentMode, created, creator, deleted, export_id, files, galleries, images, import_id, job, layout, locale, members, metadata, mode, modified, modifier, notificationMode, notified, pageMode, pageSize, polls, status, stories, tagline, tags, timeZone
-
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  -
extractMessages(script, scanDirs, potFile) -
-
This method is called from the build script to extract gettext call strings from scripts and skins.
-
  - -
-
  - -
-
  - -
Catch some undefined macro handlers, then delegate to the super prototype.
-
  -
getPermission(action) -
-
The permission framework handler for the Root prototype.
-
  -
static_macro(param, name) -
-
-
- - - -
-
Methods borrowed from class Site:
age_macro
calendar_macro
callback
deleted_macro
diskspace_macro
getAdminHeader
getDiskSpace
getLocale
getQuota
getStaticFile
getStaticUrl
getTags
getTimeZone
getXml
processHref
referrers_macro
spamfilter_macro
stories_macro
update
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Root() -
- -
- Antville’s Root prototype is an extent of the Site prototype. -The singleton instance root is the first created site (“www”). - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Site[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Admin} - - admin -
- -
- - - - -
- - - - -
- -
- - - - - {User[]} - - admins -
- -
- - - - -
- - - - -
- -
- - - - - {Api} - - api -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - creationDelay -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - creationScope -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - notificationScope -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - phaseOutGracePeriod -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - phaseOutMode -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - phaseOutNotificationPeriod -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - probationPeriod -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - quote -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - replyTo -
- -
- - - - -
- - - - -
- -
- - - - - {Site[]} - - sites -
- -
- - - - -
- - - - -
- -
- - - - - {Site[]} - - updates -
- -
- - - - -
- - - - -
- -
- - - - - {User[]} - - users -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Root.VERSION -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - - - extractMessages(script, scanDirs, potFile) -
    - -
    - This method is called from the build script to extract gettext call strings from scripts and skins. - - -
    - Defined in: i18n.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} script - -
    -
    The filename of the script containing the MessageParser code.
    - -
    - {String} scanDirs - -
    -
    The list of directory names to be scanned for i18n.
    - -
    - {String} potFile - -
    -
    The filename for the output POT file.
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getCreationPermission() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - -
    See:
    - -
    Site#getFormOptions
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - Catch some undefined macro handlers, then delegate to the super prototype. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - -
    See:
    - -
    Site#getMacroHandler
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - The permission framework handler for the Root prototype. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - static_macro(param, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Site.html b/docs/symbols/Site.html deleted file mode 100644 index 8ac18805..00000000 --- a/docs/symbols/Site.html +++ /dev/null @@ -1,3279 +0,0 @@ - - - - - - - Site | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Site -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Site() -
-
A Site object is the basic container of Antville.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- $tags -
-
-
  -
- archive -
-
-
  - -
The way the archive of a site is displayed
-
  - -
The way comments of a site are displayed
-
  -
- created -
-
The date and time of site creation
-
  -
- creator -
-
A reference to a user who created a site
-
  -
- deleted -
-
-
  -
- export_id -
-
-
  -
- files -
-
-
  -
- galleries -
-
-
  -
- images -
-
-
  -
- import_id -
-
-
  -
- job -
-
-
  -
- layout -
-
-
  -
- locale -
-
The place and language settings of a site
-
  -
- members -
-
-
  -
- metadata -
-
-
  -
- mode -
-
The access level of a site
-
  -
- modified -
-
The date and time when a site was last modified
-
  -
- modifier -
-
A reference to a user who modified a site
-
  - -
The way notifications are sent from a site
-
  -
- notified -
-
The date and time of the last notification sent to -the owners of a site
-
  -
- pageMode -
-
The way stories of a site are displayed
-
  -
- pageSize -
-
The amount of stories to be displayed simultaneously
-
  -
- polls -
-
-
  -
- status -
-
The trust level of a site
-
  -
- stories -
-
-
  -
- tagline -
-
An arbitrary text describing a site
-
  -
- tags -
-
-
  -
- timeZone -
-
The time and date settings of a site
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Site.add(name, title, user) -
-
-
  -
age_macro(param) -
-
-
  -
calendar_macro(param) -
-
-
  -
callback(ref) -
-
-
  - -
-
  - -
-
  - -
-
<static>   -
Site.getArchiveModes() -
-
-
<static>   -
Site.getByName(name) -
-
-
<static>   - -
-
<static>   -
Site.getCommentModes() -
-
-
  -
getDiskSpace(quota) -
-
-
  - -
-
  - -
-
  - -
-
<static>   -
Site.getModes() -
-
-
<static>   - -
-
<static>   -
Site.getPageModes() -
-
-
  -
getPermission(action) -
-
-
  - -
-
  -
getStaticFile(tail) -
-
-
  -
getStaticUrl(tail) -
-
-
<static>   -
Site.getStatus() -
-
-
  -
getTags(type, group) -
-
-
  - -
-
  -
getXml(collection) -
-
-
  -
processHref(href) -
-
-
  - -
-
<static>   -
Site.remove(site) -
-
-
<static>   -
Site.require(mode) -
-
-
  - -
-
  - -
-
  -
update(data) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Site() -
- -
- A Site object is the basic container of Antville. - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Tag[]} - - $tags -
- -
- - - - -
- - - - -
- -
- - - - - {Archive} - - archive -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - archiveMode -
- -
- The way the archive of a site is displayed - - - -
- - - - -
- -
- - - - - {String} - - commentMode -
- -
- The way comments of a site are displayed - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- The date and time of site creation - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- A reference to a user who created a site - - - -
- - - - -
- -
- - - - - {Date} - - deleted -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - export_id -
- -
- - - - -
- - - - -
- -
- - - - - {Files} - - files -
- -
- - - - -
- - - - -
- -
- - - - - {Tags} - - galleries -
- -
- - - - -
- - - - -
- -
- - - - - {Images} - - images -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - import_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - job -
- -
- - - - -
- - - - -
- -
- - - - - {Layout} - - layout -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - locale -
- -
- The place and language settings of a site - - - -
- - - - -
- -
- - - - - {Members} - - members -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - mode -
- -
- The access level of a site - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- The date and time when a site was last modified - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- A reference to a user who modified a site - - - -
- - - - -
- -
- - - - - {String} - - notificationMode -
- -
- The way notifications are sent from a site - - - -
- - - - -
- -
- - - - - {Date} - - notified -
- -
- The date and time of the last notification sent to -the owners of a site - - - -
- - - - -
- -
- - - - - {String} - - pageMode -
- -
- The way stories of a site are displayed - - - -
- - - - -
- -
- - - - - {Number} - - pageSize -
- -
- The amount of stories to be displayed simultaneously - - - -
- - - - -
- -
- - - - - {Polls} - - polls -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - status -
- -
- The trust level of a site - - - -
- - - - -
- -
- - - - - {Stories} - - stories -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - tagline -
- -
- An arbitrary text describing a site - - - -
- - - - -
- -
- - - - - {Tags} - - tags -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - timeZone -
- -
- The time and date settings of a site - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Site.add(name, title, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    A unique identifier also used in the URL of a site
    - -
    - {String} title - -
    -
    An arbitrary string branding a site
    - -
    - {User} user - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - age_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - calendar_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - callback(ref) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} ref - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - deleted_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - diskspace_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String[]} - - getAdminHeader(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getArchiveModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Site} - - Site.getByName(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Site}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getCallbackModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getCommentModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {float} - - getDiskSpace(quota) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} quota - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {float}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {java.util.Locale} - - getLocale() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {java.util.Locale}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getNotificationModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getPageModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getQuota() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {helma.File} - - getStaticFile(tail) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} tail - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {helma.File}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getStaticUrl(tail) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} tail - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Site.getStatus() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Tag[]} - - getTags(type, group) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} type - -
    -
    - -
    - {String} group - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Tag[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {java.util.TimeZone} - - getTimeZone() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {java.util.TimeZone}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - getXml(collection) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Story[]} collection - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - processHref(href) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} href - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - referrers_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - Site.remove(site) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Site} site - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - Site.require(mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} mode - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - spamfilter_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - stories_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Skin.html b/docs/symbols/Skin.html deleted file mode 100644 index 4f707d43..00000000 --- a/docs/symbols/Skin.html +++ /dev/null @@ -1,1785 +0,0 @@ - - - - - - - Skin | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Skin -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Skin(prototype, name) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- created -
-
-
  -
- creator -
-
-
  -
- layout -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- prototype -
-
-
  -
- source -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Skin.add(prototype, name, layout) -
-
-
  - -
-
  -
equals(source) -
-
-
<static>   -
Skin.getByName(group, name) -
-
-
  - -
-
  - -
-
  -
getMainSkin(prototype) -
-
-
  -
getPermission(action) -
-
-
<static>   - -
-
  - -
-
  - -
-
  -
getSubskin(prototype, name) -
-
-
  - -
-
  -
href(action) -
-
-
<static>   -
Skin.remove(skin) -
-
-
  -
render() -
-
-
  -
setSource(source) -
-
-
  - -
-
  - -
-
  -
update(data) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTags
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Skin(prototype, name) -
- -
- - -
- - - - -
-
Parameters:
- -
- {String} prototype - -
-
- -
- {String} name - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {Layout} - - layout -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - prototype -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - source -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Skin.add(prototype, name, layout) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} prototype - -
    -
    - -
    - {String} name - -
    -
    - -
    - {Layout} layout - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - content_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - equals(source) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} source - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Skin} - - Skin.getByName(group, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Skin}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Skin} - - getMainSkin(prototype) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} prototype - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Skin}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Skin.getPrototypeOptions() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getSource() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {java.io.File} - - getStaticFile() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {java.io.File}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Skin} - - getSubskin(prototype, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - prototype - -
    -
    - -
    - name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Skin}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getTitle() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - Skin.remove(skin) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Skin} skin - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - render() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - setSource(source) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} source - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - status_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Skins.html b/docs/symbols/Skins.html deleted file mode 100644 index 3daeed29..00000000 --- a/docs/symbols/Skins.html +++ /dev/null @@ -1,786 +0,0 @@ - - - - - - - Skins | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Skins -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Skins(name, parent) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- custom -
-
-
  -
- modified -
-
-
  -
- name -
-
-
  -
- parent -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  - -
-
  - -
-
  -
getPermission(action) -
-
-
  -
getSkin(group, name) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Skins(name, parent) -
- -
- - -
- - - - -
-
Parameters:
- -
- {String} name - -
-
- -
- {Skins} parent - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Skin[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Skin[]} - - custom -
- -
- - - - -
- - - - -
- -
- - - - - {Skin[]} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Skins} - - parent -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Skins|Skin} - - getChildElement(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Skins|Skin}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getOutline() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Skin} - - getSkin(group, name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Skin}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Sql.html b/docs/symbols/Sql.html deleted file mode 100644 index f51857d3..00000000 --- a/docs/symbols/Sql.html +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - Sql | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Sql -

- -
-

- -

- - -
    - - - -
  • Defined in: Sql.js
  • - - -
- -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Sql(options) -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<static> <constant>   -
- Sql.ARCHIVE -
-
SQL query for retrieving all story IDs in a site’s archive.
-
<static> <constant>   -
- Sql.ARCHIVEORDER -
-
SQL part for applying an order to the archive query.
-
<static> <constant>   -
- Sql.ARCHIVEPART -
-
SQL part filtering the archive query.
-
<static> <constant>   -
- Sql.ARCHIVESIZE -
-
SQL command for retrieving the size of a site’s archive.
-
<static> <constant>   -
- Sql.COUNT -
-
SQL query for retrieving the amount of records in a table.
-
<static> <constant>   -
- Sql.MEMBERSEARCH -
-
SQL query for searching members.
-
<static> <constant>   -
- Sql.PURGEREFERRERS -
-
SQL command for deleting all log entries older than 2 days.
-
<static> <constant>   -
- Sql.REFERRERS -
-
SQL query for retrieving the referrers of a site or a story.
-
<static> <constant>   -
- Sql.SEARCH -
-
SQL query for searching stories and comments.
-
-
- - - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  -
execute(sql) -
-
Executes an SQL command.
-
  - -
Retrieves an SQL query.
-
  - -
-
  -
traverse(callback) -
-
Traverses over the results of an SQL query.
-
- - - -
- - - - - - -
-
-

- Class Detail -

- -
- Sql(options) -
- -
- - -
- - - - -
-
Parameters:
- -
- options - -
-
- -
- - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <static> <constant> - - - - - Sql.ARCHIVE -
- -
- SQL query for retrieving all story IDs in a site’s archive. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.ARCHIVEORDER -
- -
- SQL part for applying an order to the archive query. - - - -
- - - -
- - - - -
See:
- -
Archive#stories_macro
- - - -
- - -
- -
- - <static> <constant> - - - - - Sql.ARCHIVEPART -
- -
- SQL part filtering the archive query. - - - -
- - - -
- - - - -
See:
- -
Archive#getFilter
- - - -
- - -
- -
- - <static> <constant> - - - - - Sql.ARCHIVESIZE -
- -
- SQL command for retrieving the size of a site’s archive. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.COUNT -
- -
- SQL query for retrieving the amount of records in a table. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.MEMBERSEARCH -
- -
- SQL query for searching members. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.PURGEREFERRERS -
- -
- SQL command for deleting all log entries older than 2 days. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.REFERRERS -
- -
- SQL query for retrieving the referrers of a site or a story. - - - -
- - - - -
- -
- - <static> <constant> - - - - - Sql.SEARCH -
- -
- SQL query for searching stories and comments. - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {Object} - - execute(sql) -
    - -
    - Executes an SQL command. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} sql - -
    -
    The SQL command.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object} The result of the SQL command.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - retrieve() -
    - -
    - Retrieves an SQL query. - - - - -
    - - - -
    sql.retrieve('select $1 from $2 order by $1', 'date', 'foo')
    -===> 'select date from foo order by date'
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - traverse(callback) -
    - -
    - Traverses over the results of an SQL query. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Function} callback - -
    -
    The callback function executed for each record.
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Stories.html b/docs/symbols/Stories.html deleted file mode 100644 index aed643c6..00000000 --- a/docs/symbols/Stories.html +++ /dev/null @@ -1,924 +0,0 @@ - - - - - - - Stories | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Stories -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Stories() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  - -
-
  -
- closed -
-
-
  -
- comments -
-
-
  -
- featured -
-
-
  -
- otherTags -
-
-
  -
- recent -
-
-
  -
- tags -
-
-
  -
- top -
-
-
  -
- union -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  - -
-
  -
getPermission(action) -
-
-
  -
getTags(group) -
-
-
  -
list_macro(param, type) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Stories() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Story[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - alphabeticalTags -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - closed -
- -
- - - - -
- - - - -
- -
- - - - - {Comment[]} - - comments -
- -
- - - - -
- - - - -
- - - -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - otherTags -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - recent -
- -
- - - - -
- - - - -
- -
- - - - - {Tag[]} - - tags -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - top -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - union -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {String[]} - - getAdminHeader(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Tag[]} - - getTags(group) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Tag[]}
    - - - - - - -
    See:
    - -
    Site#getTags
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - list_macro(param, type) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} type - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Story.html b/docs/symbols/Story.html deleted file mode 100644 index 067919fe..00000000 --- a/docs/symbols/Story.html +++ /dev/null @@ -1,2473 +0,0 @@ - - - - - - - Story | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Story -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Story() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  - -
-
  -
- comments -
-
-
  -
- created -
-
-
  -
- creator -
-
-
  -
- metadata -
-
-
  -
- mode -
-
-
  -
- modified -
-
-
  -
- modifier -
-
-
  -
- name -
-
-
  -
- parent_id -
-
-
  - -
-
  -
- prototype -
-
-
  -
- requests -
-
-
  -
- site -
-
-
  -
- status -
-
-
  -
- tags -
-
-
  -
- text -
-
-
  -
- title -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Story.add(data, site, user) -
-
-
  -
comments_macro(param, mode) -
-
-
  -
count() -
-
Increment the request counter
-
  -
format_filter(value, param, mode) -
-
-
<static>   -
Story.getCommentModes() -
-
-
  - -
-
  -
getDelta(data) -
-
Calculate the difference of a story’s current and its updated content
-
  - -
-
  -
getFormValue(name) -
-
-
  - -
-
<static>   -
Story.getModes() -
-
-
  -
getPermission(action) -
-
-
<static>   -
Story.getStatus() -
-
-
  -
getTitle(limit) -
-
-
  - -
-
  -
link_macro(param, action, text) -
-
-
  -
macro_filter(value, param) -
-
-
  -
referrers_macro(param, limit) -
-
-
<static>   -
Story.remove() -
-
-
  - -
-
  -
summary_macro(param) -
-
-
  -
tags_macro(param, mode) -
-
-
  -
update(data) -
-
-
  -
url_filter(value, param, mode) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getMetadata
getTags
handleMetadata
input_macro
kind_macro
link_filter
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Story() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Comment[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - commentMode -
- -
- - - - -
- - - - -
- -
- - - - - {Comment[]} - - comments -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - mode -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - modifier -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - parent_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - parent_type -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - prototype -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - requests -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - status -
- -
- - - - -
- - - - -
- -
- - - - - {TagHub[]} - - tags -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - text -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - title -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Story} - - Story.add(data, site, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - {Site} site - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Story}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - comments_macro(param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - count() -
    - -
    - Increment the request counter - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - format_filter(value, param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Story.getCommentModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getConfirmText() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getDelta(data) -
    - -
    - Calculate the difference of a story’s current and its updated content - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String[]} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormValue(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Story.getModes() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - Story.getStatus() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getTitle(limit) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} limit - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - isCustomContent(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    -
  • - -
  • - - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} action - -
    -
    - -
    - {String} text - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - macro_filter(value, param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String|Skin} value - -
    -
    - -
    - {Object} param - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - referrers_macro(param, limit) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {Number} limit - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - - - Story.remove() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - setCustomContent(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - summary_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - tags_macro(param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - url_filter(value, param, mode) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} value - -
    -
    - -
    - {Object} param - -
    -
    - -
    - {String} mode - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Tag.html b/docs/symbols/Tag.html deleted file mode 100644 index 19a81fec..00000000 --- a/docs/symbols/Tag.html +++ /dev/null @@ -1,1029 +0,0 @@ - - - - - - - Tag | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Tag -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Tag() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
<static> <constant>   -
- Tag.DELIMITER -
-
-
  -
- images -
-
-
<static> <constant>   -
- Tag.MOUNTPOINTS -
-
-
  -
- name -
-
-
  -
- site -
-
-
  -
- stories -
-
-
  -
- type -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
Tag.add(name, site, type) -
-
-
  -
getPermission(action) -
-
-
  - -
-
  - -
-
  -
href(action) -
-
-
  -
permission_macro(param, type) -
-
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Tag() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {TagHub[]} - - _children -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Tag.DELIMITER -
- -
- - - - -
- - - - -
- -
- - - - - {Images[]} - - images -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Tag.MOUNTPOINTS -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {Site} - - site -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - stories -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - type -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - Tag.add(name, site, type) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {Site} site - -
    -
    - -
    - {String} type - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Story[]|Image[]} - - getTagged() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Story[]|Image[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getTitle() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - href(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - permission_macro(param, type) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} type - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/TagHub.html b/docs/symbols/TagHub.html deleted file mode 100644 index d1869244..00000000 --- a/docs/symbols/TagHub.html +++ /dev/null @@ -1,735 +0,0 @@ - - - - - - - TagHub | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class TagHub -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- TagHub() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- tag -
-
-
  -
- tag_id -
-
-
  -
- tagged -
-
-
  -
- tagged_id -
-
-
  - -
-
  -
- user -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
TagHub.add(name, tagged, user) -
-
-
  - -
-
  - -
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getPermission
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- TagHub() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Tag} - - tag -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - tag_id -
- -
- - - - -
- - - - -
- -
- - - - - {Story|Image} - - tagged -
- -
- - - - -
- - - - -
- -
- - - - - {Number} - - tagged_id -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - tagged_type -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - user -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {TagHub} - - TagHub.add(name, tagged, user) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - {Story|Image} tagged - -
    -
    - -
    - {User} user - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {TagHub}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getMacroHandler(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - toString() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Tags.html b/docs/symbols/Tags.html deleted file mode 100644 index f6b3b32c..00000000 --- a/docs/symbols/Tags.html +++ /dev/null @@ -1,1240 +0,0 @@ - - - - - - - Tags | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Tags -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Tags() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<static> <constant>   -
- Tags.ALL -
-
-
<static> <constant>   -
- Tags.ALPHABETICAL -
-
-
<static> <constant>   -
- Tags.OTHER -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  - -
-
  -
get(group) -
-
-
  - -
-
  - -
-
  - -
-
  - -
-
  -
getPage() -
-
-
  - -
-
  -
getPermission(action) -
-
-
  -
header_macro(param) -
-
-
  -
list_macro(param, skin) -
-
-
  - -
-
  -
setGroup(group) -
-
-
  -
setPage(page) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormOptions
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
touch
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- Tags() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <static> <constant> - - - - - Tags.ALL -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Tags.ALPHABETICAL -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - Tags.OTHER -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - - - alphabet_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {TagHub[]} - - get(group) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {TagHub[]}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getAction() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {HopObject} - - getChildElement(id) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} id - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {HopObject}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getGroup() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String[]} - - getHeader() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    Stories#getAdminHeader
    - -
    Images#getAdminHeader
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getPage() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - getPageSize() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - header_macro(param) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - list_macro(param, skin) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - param - -
    -
    - -
    - skin - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - pager_macro() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - setGroup(group) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} group - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - setPage(page) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} page - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/User.html b/docs/symbols/User.html deleted file mode 100644 index 2ad5fbf2..00000000 --- a/docs/symbols/User.html +++ /dev/null @@ -1,2356 +0,0 @@ - - - - - - - User | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class User -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- User() -
-
A User object represents a login to Antville.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<private>   -
- _children -
-
-
  -
- comments -
-
-
<static> <constant>   -
- User.COOKIE -
-
-
  -
- created -
-
-
  -
- email -
-
-
  -
- files -
-
-
  -
- hash -
-
-
<static> <constant>   -
- User.HASHCOOKIE -
-
-
  -
- images -
-
-
  - -
-
  -
- metadata -
-
-
  -
- modified -
-
-
  -
- name -
-
-
  -
- salt -
-
-
  -
- sites -
-
-
  -
- status -
-
-
  -
- stories -
-
-
  - -
-
  -
- url -
-
-
-
- - - -
- -
- - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
User.add(data) -
-
-
<static>   -
User.autoLogin() -
-
-
  - -
Enable <% user.email %> macro for privileged users only
-
<static>   -
User.getByName(name) -
-
-
<static>   - -
-
  -
getDigest(token) -
-
-
  - -
-
<static>   -
User.getLocation() -
-
-
<static>   -
User.getMembership() -
-
-
  -
getPermission(action) -
-
-
<static>   -
User.getSalt() -
-
-
<static>   -
User.getStatus() -
-
-
<static>   -
User.isBlacklisted(data) -
-
-
  -
list_macro(param, type) -
-
-
<static>   -
User.login(data) -
-
-
<static>   -
User.logout() -
-
-
  - -
-
<static>   -
User.register(data) -
-
-
<static>   -
User.remove() -
-
FIXME: Still needs a solution whether and how to remove a user’s sites
-
<static>   -
User.rename(currentName, newName) -
-
Rename a user account.
-
<static>   -
User.require(requiredStatus) -
-
-
<static>   -
User.setLocation(url) -
-
-
  -
touch() -
-
-
  -
update(data) -
-
-
- - - -
-
Methods borrowed from class HopObject:
addTag
checkbox_macro
created_macro
creator_macro
deleteMetadata
getFormValue
getMetadata
getTags
getTitle
handleMetadata
input_macro
kind_macro
link_filter
link_macro
log
macro_macro
map
metadata_macro
modified_macro
modifier_macro
notify
onCodeUpdate
onRequest
radiobutton_macro
removeTag
select_macro
self_macro
setMetadata
setTags
skin_macro
textarea_macro
toString
type_macro
upload_macro
-
- -
- - - - - - -
-
-

- Class Detail -

- -
- User() -
- -
- A User object represents a login to Antville. - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <private> - - - {Membership[]} - - _children -
- -
- - - - -
- - - - -
- -
- - - - - {Comment[]} - - comments -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - User.COOKIE -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - email -
- -
- - - - -
- - - - -
- -
- - - - - {File[]} - - files -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - hash -
- -
- - - - -
- - - - -
- -
- - <static> <constant> - - - - - User.HASHCOOKIE -
- -
- - - - -
- - - - -
- -
- - - - - {Image[]} - - images -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - memberships -
- -
- - - - -
- - - - -
- -
- - - - - {Metadata} - - metadata -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - name -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - salt -
- -
- - - - -
- - - - -
- -
- - - - - {Site[]} - - sites -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - status -
- -
- - - - -
- - - - -
- -
- - - - - {Story[]} - - stories -
- -
- - - - -
- - - - -
- -
- - - - - {Membership[]} - - subscriptions -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - url -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {User} - - User.add(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {User}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - User.autoLogin() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - email_macro() -
    - -
    - Enable <% user.email %> macro for privileged users only - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - {User} - - User.getByName(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {User}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String} - - User.getCurrentStatus() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - getDigest(token) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} token - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - getFormOptions(name) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String} - - User.getLocation() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Membership} - - User.getMembership() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Membership}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Boolean} - - getPermission(action) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} action - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String} - - User.getSalt() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {String[]} - - User.getStatus() -
    - -
    - - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String[]}
    - - - - - - -
    See:
    - -
    defineConstants
    - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - User.isBlacklisted(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - list_macro(param, type) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    - -
    - {String} type - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {User} - - User.login(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {User}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - User.logout() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - onLogout() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - {User} - - User.register(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - -
    - - - - - - -
    Throws:
    - -
    - {Error} -
    -
    - - - - -
    Returns:
    - -
    {User}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - User.remove() -
    - -
    - FIXME: Still needs a solution whether and how to remove a user’s sites - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - <static> - - - - - User.rename(currentName, newName) -
    - -
    - Rename a user account. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} currentName - -
    -
    The current name of the user account.
    - -
    - {String} newName - -
    -
    The desired name of the user account.
    - -
    - - - -
    -
  • - -
  • -
    - - <static> - - - {Boolean} - - User.require(requiredStatus) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} requiredStatus - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - <static> - - - - - User.setLocation(url) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} url - -
    -
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - touch() -
    - -
    - - - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - update(data) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} data - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/Vote.html b/docs/symbols/Vote.html deleted file mode 100644 index cbb5dcae..00000000 --- a/docs/symbols/Vote.html +++ /dev/null @@ -1,596 +0,0 @@ - - - - - - - Vote | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Class Vote -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Class Summary
Constructor AttributesConstructor Name and Description
  -
- Vote() -
-
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- choice -
-
-
  -
- created -
-
-
  -
- creator -
-
-
  - -
-
  -
- modified -
-
-
  -
- poll -
-
-
-
- - - -
- -
- - - - - - - - - - - - - -
-
-

- Class Detail -

- -
- Vote() -
- -
- - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - - - - {Choice} - - choice -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - created -
- -
- - - - -
- - - - -
- -
- - - - - {User} - - creator -
- -
- - - - -
- - - - -
- -
- - - - - {String} - - creator_name -
- -
- - - - -
- - - - -
- -
- - - - - {Date} - - modified -
- -
- - - - -
- - - - -
- -
- - - - - {Poll} - - poll -
- -
- - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - {Vote} - - Vote.add(choice, poll) -
    - -
    - - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Choice} choice - -
    -
    - -
    - poll - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Vote}
    - - - - - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/_global_.html b/docs/symbols/_global_.html deleted file mode 100644 index 672a6deb..00000000 --- a/docs/symbols/_global_.html +++ /dev/null @@ -1,4232 +0,0 @@ - - - - - - - _global_ | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Built-In Namespace _global_ -

- -
-

- -

- - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  -
- html -
-
An instance of Helma’s HTML rendering module.
-
  - -
An instance of the LESS parser.
-
<constant>   - -
Regular Expression according to Jala’s HopObject.getAccessName().
-
  -
- rome -
-
A collection of Java classes and namespaces required for parsing and generating RSS.
-
<constant>   - -
The date format used in SQL queries and commands.
-
-
- - - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  -
age_filter(value, param) -
-
Helma macro filter wrapping the Date#getAge method.
-
  -
breadcrumbs_macro(param, delimiter) -
-
Renders a breadcrumbs navigation from the current HopObject path.
-
  -
cgettext(key, context) -
-
This method is useful for disambiguation of messages (single words most of the time) that have different meanings depending on the context.
-
  -
clip_filter(input, param, limit, clipping, delimiter) -
-
Macro filter for clipping output.
-
  -
default_filter(value, param, defaultValue) -
-
A simple Helma macro filter returning one of two possible values depending on which one is truthy.
-
  - -
Helper method to simultaneously define constants and a corresponding array of localized display names.
-
  -
disableMacro(ctor, name) -
-
Disables a macro with the idle() function.
-
  -
file_macro(param, id, mode) -
-
Renders the URL or an arbitrary skin of a file.
-
  -
fixRssText(rss) -
- -
  -
format_filter(value, param, pattern, type) -
-
Helma macro filter wrapping the global formatting methods.
-
  -
formatDate(date, format) -
-
Formats a date according to a formatting string and the site’s locale and time zone.
-
  -
formatNumber(number, pattern) -
-
Formats a number according to a pattern and the site’s locale setting.
-
  -
getLocale(language) -
-
Retrieves the locale object from a language string.
-
  -
getLocales(language) -
-
Creates an array of all available Java locales sorted by their names.
-
  -
gettext_macro(param, text) -
-
Helma macro wrapper for the gettext() method.
-
  -
getTimeZones(language) -
-
This method returns an array of structs providing two properties each: -value – a unique time zone ID -display – a (more) user-friendly string -Although Java is great in providing all time zones one can imagine, this -vast amount of choices fails to support easy time zone selection.
-
  -
idle() -
-
Shortcut for a function with empty body.
-
  -
if_macro(param, firstValue, _is_, secondValue, _then_, firstResult, _else_, secondResult) -
-
Renders a string depending on the comparison of two values.
-
  -
image_macro(param, id, mode) -
-
Renders the URL, a thumbnail or an HTML element of an image.
-
  - -
Injects the XSLT stylesheet declaration into an XML string until Mozilla developers will have mercy.
-
  -
link_filter(text, param, url) -
-
Helma macro filter wrapping the renderLink method.
-
  - -
Renders a link.
-
  -
list_macro(param, id, limit) -
-
The “swiss army knife” list macro.
-
  -
listItemFlag_macro(param, str) -
-
Renders a string vertically in the global listItemFlag skin.
-
  -
markgettext_macro(param, singular, plural) -
-
Helma macro wrapper for the markgettext() method.
-
  -
ngettext_macro(param, singular, plural) -
-
Helma macro wrapper for the ngettext() method.
-
  -
nightly() -
-
The nightly scheduler.
-
  -
now_macro(param, format) -
-
Renders the current date and time.
-
  -
onStart() -
-
The startup handler Helma is calling automatically shortly after the application has started.
-
  -
onStop() -
-
This handler is called by Helma automatically before the application is stopped.
-
  -
pluralize(singular) -
-
Transforms an english singular form of a noun into its plural form.
-
  -
poll_macro(param, id, mode) -
-
Renders the URL, a link or the visual representation of a poll.
-
  -
quote(str) -
-
Surrounds a string by programmer quotes (").
-
  -
random_macro(param, type, mode) -
-
Renders either a skin or the URL of a random site, story or image.
-
  -
renderLink(param, url, text, handler) -
- -
  -
renderList(collection, funcOrSkin, itemsPerPage, pageIdx) -
-
Renders an HTML list from a HopObject collection or an array.
-
  -
renderPager(collectionOrSize, url, itemsPerPage, pageIdx) -
-
Renders the page navigation for a collection of HopObjects.
-
  - -
Helma’s built-in main scheduler function.
-
  -
sendMail(recipient, subject, body, options) -
-
General mail sending function.
-
  -
singularize(plural) -
-
Transforms an english plural form of a noun into its singular form.
-
  -
skin_macro(param, name) -
-
Renders a skin from within a skin.
-
  -
story_macro(param, id, mode) -
-
Renders the URL of, a link to or an arbitrary skin of a story.
-
  - -
Helper macro for checking if a user session is authenticated (logged in).
-
  - -
Validates if a string is suitable for e-mail messaging.
-
  -
validateUrl(str) -
-
Validates if a string is suitable for requesting a URL.
-
  -
value_macro(param, name, value) -
-
Defines and renders a value.
-
  -
version_macro(param, type) -
-
Renders the Antville version string.
-
  -
wait(millis) -
-
Halts the execution of the thread for the specified amount of milliseconds.
-
- - - -
- - - - - - - - -
-
-

- Field Detail -

- - -
- - - - - {helma.Html} - - html -
- -
- An instance of Helma’s HTML rendering module. - -
- Defined in: Global.js. - - - -
- - - - -
- -
- - - - - {less.Parser} - - lessParser -
- -
- An instance of the LESS parser. - -
- Defined in: Global.js. - - - -
- - - - -
- -
- - <constant> - - - {RegExp} - - NAMEPATTERN -
- -
- Regular Expression according to Jala’s HopObject.getAccessName(). - -
- Defined in: Global.js. - - - -
- - - - -
- -
- - - - - {Object} - - rome -
- -
- A collection of Java classes and namespaces required for parsing and generating RSS. - -
- Defined in: Global.js. - - - -
- - - - -
- -
- - <constant> - - - {String} - - SQLDATEFORMAT -
- -
- The date format used in SQL queries and commands. - -
- Defined in: Global.js. - - - -
- - - - - - -
-
- - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - {String} - - age_filter(value, param) -
    - -
    - Helma macro filter wrapping the Date#getAge method. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Date} value - -
    -
    The original date.
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The resulting age string of the original date.
    - - - - - - -
    See:
    - -
    Date#getAge
    - - - -
    - -
    -
  • - -
  • - - -
    - Renders a breadcrumbs navigation from the current HopObject path. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} delimiter - Optional, Default: ' : ' -
    -
    The string visually separating two navigation items
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - cgettext(key, context) -
    - -
    - This method is useful for disambiguation of messages (single words most of the time) that have different meanings depending on the context. Example: comment – the verb "to comment" vs the noun "a comment". - - -
    - Defined in: i18n.js. - - - -
    - - - -
    cgettext('comment', 'verb')
    - - - - -
    -
    Parameters:
    - -
    - {Object} key - -
    -
    The message ID.
    - -
    - {Object} context - -
    -
    The context of the message.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - clip_filter(input, param, limit, clipping, delimiter) -
    - -
    - Macro filter for clipping output. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} input - -
    -
    The original input.
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {Number} limit - Optional, Default: 20 -
    -
    The maximum amount of text parts to be displayed.
    - -
    - {String} clipping - Optional, Default: '...' -
    -
    The replacement for the clipped portions of the text.
    - -
    - {String} delimiter - Optional, Default: '\\s' -
    -
    The regular expression string used to split the text into parts.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The clipped result.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object} - - default_filter(value, param, defaultValue) -
    - -
    - A simple Helma macro filter returning one of two possible values depending on which one is truthy. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    The original (desired) value.
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {Object} defaultValue - -
    -
    The fallback value for use if the original value should be untruthy.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object} The value argument if truthy, the defaultValue argument otherwise.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Function} - - defineConstants(ctor) -
    - -
    - Helper method to simultaneously define constants and a corresponding array of localized display names. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} ctor - -
    -
    The desired prototype constructor the constants should be defined for.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Function}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Function} - - disableMacro(ctor, name) -
    - -
    - Disables a macro with the idle() function. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject} ctor - -
    -
    The prototype constructor the macro is defined for
    - -
    - {String} name - -
    -
    The macro’s name
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Function}
    - - - - - - -
    See:
    - -
    idle
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - file_macro(param, id, mode) -
    - -
    - Renders the URL or an arbitrary skin of a file. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% file 1810 url %> URL of file #1810
    -<% file blog/text.pdf skin=preview %> File in site “blog” using preview skin
    -<% file /image.raw %> Static file of root site
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} param.skin - Optional, Default: 'main' -
    -
    The name of a file skin
    - -
    - {String} id - -
    -
    The id or path of the desired file
    - -
    - {String} mode - Optional -
    -
    Currently only possible value is 'url'
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - fixRssText(rss) -
    - - - - - - -
    -
    Parameters:
    - -
    - {String} rss - -
    -
    The original RSS output.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The transformed RSS output.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - format_filter(value, param, pattern, type) -
    - -
    - Helma macro filter wrapping the global formatting methods. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} value - -
    -
    The original value.
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} pattern - -
    -
    A formatting pattern suitable for the formatting method.
    - -
    - {String} type - Optional -
    -
    Deprecated.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The formatted string.
    - - - - - - -
    See:
    - -
    formatNumber
    - -
    formatDate
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - formatDate(date, format) -
    - -
    - Formats a date according to a formatting string and the site’s locale and time zone. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Date} date - -
    -
    The original date.
    - -
    - {String} format - Optional, Default: "full" -
    -
    The formatting string. Either a Java SimpleDateFormat pattern//docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html or of “short”, “medium”, “long”, “full”, “date”, “time”, “iso” or “text”.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The formatted date string.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - formatNumber(number, pattern) -
    - -
    - Formats a number according to a pattern and the site’s locale setting. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} number - -
    -
    The original number.
    - -
    - {String} pattern - -
    -
    The formatting pattern.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The formatted number string.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {java.util.Locale} - - getLocale(language) -
    - -
    - Retrieves the locale object from a language string. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} language - -
    -
    The name of the language.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {java.util.Locale} The corresponding locale object.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object[]} - - getLocales(language) -
    - -
    - Creates an array of all available Java locales sorted by their names. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} language - -
    -
    The optional language of the locales
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object[]} A sorted array containing the corresponding locales
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - gettext_macro(param, text) -
    - -
    - Helma macro wrapper for the gettext() method. - - -
    - Defined in: i18n.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} text - -
    -
    The text used as message ID.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} Either the translated or the original text.
    - - - - - - -
    See:
    - -
    jala.i18n.gettext
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Object[]} - - getTimeZones(language) -
    - -
    - This method returns an array of structs providing two properties each: -value – a unique time zone ID -display – a (more) user-friendly string -Although Java is great in providing all time zones one can imagine, this -vast amount of choices fails to support easy time zone selection. -Furthermore, the L10n features of the java.util.TimeZone class are insufficient -as they do only translate the generic string returned by the getDisplayName() -method (e.g. Central European Time), not the more usable time zone IDs -(e.g. Europe/Vienna). Thus, time zone selection in Antville is rather limited. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} language - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Object[]} A sorted array containing the corresponding timezones
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - idle() -
    - -
    - Shortcut for a function with empty body. -Used e.g. in the disableMacro() method. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    - - - - - - - - - - - - -
    See:
    - -
    disableMacro
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - if_macro(param, firstValue, _is_, secondValue, _then_, firstResult, _else_, secondResult) -
    - -
    - Renders a string depending on the comparison of two values. -If the first value equals the second value, the first result will be returned; the second result otherwise. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% if <% macro %> is value then <% yes suffix=! %> else 'no :(' %>;
    -Note that any value or result can be a macro, too. Thus, this can be used as
    -a simple implementation of an if-then-else statement by using Helma macros only.
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} firstValue - -
    -
    The first value
    - -
    - {String} _is_ - -
    -
    Syntactic sugar; should be "is" for legibility
    - -
    - {String} secondValue - -
    -
    The second value
    - -
    - {String} _then_ - -
    -
    Syntactic sugar; should be "then" for legibility
    - -
    - {String} firstResult - -
    -
    The first result, ie. the value that will be -returned if the first value equals the second one
    - -
    - {String} _else_ - -
    -
    Syntactic sugar; should be "else" for legibility
    - -
    - {String} secondResult - -
    -
    The second result, ie. the value that will be -returned if the first value does not equal the second one
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The resulting value
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - image_macro(param, id, mode) -
    - -
    - Renders the URL, a thumbnail or an HTML element of an image. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} id - -
    -
    The id or path of the desired image
    - -
    - {String} mode - Optional -
    -
    Either of 'url' or 'thumbnail'
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    Image#thumbnail_macro
    - -
    Image#render_macro
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - injectXslDeclaration(xml) -
    - -
    - Injects the XSLT stylesheet declaration into an XML string until Mozilla developers will have mercy. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} xml - -
    -
    An XML string
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} An XML string containing the XSLT stylesheet declaration
    - - - - - - - -
    - -
    -
  • - -
  • - - -
    - Helma macro filter wrapping the renderLink method. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} text - -
    -
    The link text.
    - -
    - {String} param - -
    -
    The default Helma macro parameter object.
    - -
    - {Object} url - Optional, Default: text -
    -
    The link URL.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The rendered link element
    - - - - - - -
    See:
    - -
    renderLink
    - - - -
    - -
    -
  • - -
  • - - -
    - Renders a link. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The rendered HTML link element
    - - - - - - -
    See:
    - -
    renderLink
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - list_macro(param, id, limit) -
    - -
    - The “swiss army knife” list macro. Lists collections of HopObjects. -There is hardly a thing it cannot do… but it’s kind of messy, though. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% list sites %>
    -<% list updates 10 %>
    -<% list blog/comments %>
    -<% list featured skin=promotion %>
    -<% list images %>
    -<% list postings %>
    -<% list stories %>
    -<% list tags %>
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} param.skin - Optional, Default: preview -
    -
    The name of a skin suitable for the collection
    - -
    - {String} id - -
    -
    The identifier of the desired collection
    - -
    - {Number} limit - Optional, Default: 25 -
    -
    The maximum amount of items listed
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - listItemFlag_macro(param, str) -
    - -
    - Renders a string vertically in the global listItemFlag skin. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} str - -
    -
    The string to be rendered.
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - markgettext_macro(param, singular, plural) -
    - -
    - Helma macro wrapper for the markgettext() method. - - -
    - Defined in: i18n.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {Object} singular - -
    -
    The text used as the singular message ID.
    - -
    - {Object} plural - -
    -
    The text used as the plural message ID.
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    jala.i18n.markgettext
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - ngettext_macro(param, singular, plural) -
    - -
    - Helma macro wrapper for the ngettext() method. - - -
    - Defined in: i18n.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} singular - -
    -
    The text used as the singular message ID.
    - -
    - {String} plural - -
    -
    The text used as the plural message ID.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    String Either the translated or the original string.
    - - - - - - -
    See:
    - -
    jala.i18n.ngettext
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - nightly() -
    - -
    - The nightly scheduler. -This method is called according to the cron settings in app.properties. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - now_macro(param, format) -
    - -
    - Renders the current date and time. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} format - Optional -
    -
    A date format string
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The formatted current date string
    - - - - - - -
    See:
    - -
    formatDate
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - onStart() -
    - -
    - The startup handler Helma is calling automatically shortly after the application has started. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - - - onStop() -
    - -
    - This handler is called by Helma automatically before the application is stopped. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    -
  • - -
  • -
    - - - - - {String} - - pluralize(singular) -
    - -
    - Transforms an english singular form of a noun into its plural form. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} singular - -
    -
    The noun in singular form.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The english plural form of the original input.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - poll_macro(param, id, mode) -
    - -
    - Renders the URL, a link or the visual representation of a poll. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} id - -
    -
    The id or path of the desired poll
    - -
    - {String} mode - -
    -
    Either of 'url' or 'link'
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {String} - - quote(str) -
    - -
    - Surrounds a string by programmer quotes ("). - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} str - -
    -
    The original string.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The processed string.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - random_macro(param, type, mode) -
    - -
    - Renders either a skin or the URL of a random site, story or image. -The corresponding story and image collections will be retrieved either from res.handlers.site or -from the prefixed “type” argument (e.g. “mySite/story”). -Furthermore, both collections can be reduced to a specific tag or gallery, resp. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% random site skin=preview %> Renders the preview skin of a random site.
    -<% random story tag=essay url %> Renders the URL of a random story tagged with “essay”.
    -<% random foo/image gallery=cat %> Renders the default skin of a random image in the gallery “cat“ of the site “foo”.
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} param.skin - Optional, Default: "preview" -
    -
    The name of the skin to render in default output mode.
    - -
    - {String} param.tag - Optional -
    -
    Reduce the story collection to stories with the specified tag.
    - -
    - {String} param.gallery - Optional -
    -
    Reduce the image collection to images from the specified gallery.
    - -
    - {String} type - -
    -
    The type of object to render. Either of “site”, “story” or “image”. -It can be prepended by a site name delimited by a slash: “mySite/image”.
    - -
    - {String} mode - Optional -
    -
    Set the output mode. Currently, only “url” is supported.
    - -
    - - - -
    -
  • - -
  • - - - - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} param.title - Optional -
    -
    An optional link title for use in the “title” attribute.
    - -
    - {String} url - -
    -
    A complete or partial URL string. Optional if “handler” is specified.
    - -
    - {String} text - Optional -
    -
    An optional link text.
    - -
    - {HopObject} handler - -
    -
    The HopObject used as base URL. Optional if “url” is specified.
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    helma.Html#link
    - -
    HopObject#link_macro
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - renderList(collection, funcOrSkin, itemsPerPage, pageIdx) -
    - -
    - Renders an HTML list from a HopObject collection or an array. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject|Array} collection - -
    -
    The original collection of objects.
    - -
    - {Function|Skin} funcOrSkin - -
    -
    A skin name or a rendering function.
    - -
    - {Number} itemsPerPage - -
    -
    The amount of rendered items per page.
    - -
    - {Number} pageIdx - -
    -
    The current page index.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The rendered list.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - renderPager(collectionOrSize, url, itemsPerPage, pageIdx) -
    - -
    - Renders the page navigation for a collection of HopObjects. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {HopObject|Array|Number} collectionOrSize - -
    -
    A collection or just the size of a collection.
    - -
    - {String} url - -
    -
    The base URL for rendering links.
    - -
    - {Number} itemsPerPage - -
    -
    The amount of rendered items per page.
    - -
    - {Number} pageIdx - -
    -
    The current page index.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The rendered page navigation.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - scheduler() -
    - -
    - Helma’s built-in main scheduler function. -This method is regularly called by Helma after a defined period of time. -The period is either defined by the return value or by the schedulerInterval property in app.properties. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number} The period in milliseconds the scheduler will be called again.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - sendMail(recipient, subject, body, options) -
    - -
    - General mail sending function. Mails will be queued in app.data.mails. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} recipient - -
    -
    The recipient's email addresses
    - -
    - {String} subject - -
    -
    The e-mail's subject
    - -
    - {String} body - -
    -
    The body text of the e-mail
    - -
    - options - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number} The status code of the underlying helma.Mail instance
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - singularize(plural) -
    - -
    - Transforms an english plural form of a noun into its singular form. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} plural - -
    -
    The noun in plural form.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The english singular form of the original input.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String} - - skin_macro(param, name) -
    - -
    - Renders a skin from within a skin. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - param - -
    -
    - -
    - name - -
    -
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String} The rendered skin
    - - - - - - -
    See:
    - -
    HopObject#skin_macro
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - story_macro(param, id, mode) -
    - -
    - Renders the URL of, a link to or an arbitrary skin of a story. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% story 1810 skin=preview %> Story #1810 in preview skin
    -<% story blog/1971 url %> URL of the story of site “blog”
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object
    - -
    - {String} param.skin - Optional, Default: 'embed' -
    -
    The name of a story skin
    - -
    - {String} id - -
    -
    The id or path of the desired story
    - -
    - {String} mode - Optional -
    -
    Either of 'url' or 'link'
    - -
    - - - -
    -
  • - -
  • -
    - - - - - {Boolean} - - user_macro() -
    - -
    - Helper macro for checking if a user session is authenticated (logged in). -Returns true if user is logged in, false otherwise. - - -
    - Defined in: Global.js. - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Boolean}
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - {String|null} - - validateEmail(str) -
    - -
    - Validates if a string is suitable for e-mail messaging. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} str - -
    -
    The string to be validated.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String|null} The e-mail string if valid, null otherwise.
    - - - - - - -
    See:
    - -
    String#isEmail
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {String|null} - - validateUrl(str) -
    - -
    - Validates if a string is suitable for requesting a URL. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} str - -
    -
    The string to be validated.
    - -
    - - - -
    - - - - - - - - -
    Returns:
    - -
    {String|null} The URL string if valid, null otherwise.
    - - - - - - - -
    - -
    -
  • - -
  • -
    - - - - - - - value_macro(param, name, value) -
    - -
    - Defines and renders a value. -This works like a variable that can be set in one skin and rendered in another – -which must be rendered later than the one setting the variable. - - -
    - Defined in: Global.js. - - - -
    - - - -
    <% value foo=bar %> Defines res.meta.values.foo = bar
    - -
    <% value foo %> Renders the value of res.meta.value.foo
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} name - -
    -
    The name of the value.
    - -
    - {String} value - Optional -
    -
    The desired value. -If no value is given, the current value will be rendered.
    - -
    - - - -
    -
  • - -
  • -
    - - - - - - - version_macro(param, type) -
    - -
    - Renders the Antville version string. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Object} param - -
    -
    The default Helma macro parameter object.
    - -
    - {String} type - Optional, Default: 'default' -
    -
    The type of version string.
    - -
    - - - -
    - - - - - - - - - - - - -
    See:
    - -
    Root.VERSION
    - - - -
    - -
    -
  • - -
  • -
    - - - - - - - wait(millis) -
    - -
    - Halts the execution of the thread for the specified amount of milliseconds. -Use only for debugging. - - -
    - Defined in: Global.js. - - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} millis - -
    -
    The amount of milliseconds.
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/app.data.html b/docs/symbols/app.data.html deleted file mode 100644 index 498cad2d..00000000 --- a/docs/symbols/app.data.html +++ /dev/null @@ -1,504 +0,0 @@ - - - - - - - app.data | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace app.data -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- app.data -
-
Helma’s built-in application-wide in-memory store.
-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
<static>   -
- app.data.callbacks -
-
Temporary in-memory store of site callbacks.
-
<static>   -
- app.data.entries -
-
Temporary in-memory store of LogEntry instances.
-
<static>   -
- app.data.features -
-
In-memory registry of Feature instances.
-
<static>   -
- app.data.mails -
-
In-memory e-mail message queue.
-
<static>   -
- app.data.requests -
-
In-memory store of remote requests for counting story hits.
-
-
- - - - - - - - - - - -
-
-

- Namespace Detail -

- -
- app.data -
- -
- Helma’s built-in application-wide in-memory store. - -
- - - - - - -
-
- - - -
-
-

- Field Detail -

- - -
- - <static> - - - - - app.data.callbacks -
- -
- Temporary in-memory store of site callbacks. -They will be invoked asynchronously by an Admin method. - - - -
- - - -
- - - - -
See:
- -
Admin.invokeCallbacks
- -
scheduler
- - - -
- - -
- -
- - <static> - - - {Array} - - app.data.entries -
- -
- Temporary in-memory store of LogEntry instances. -They will be made persistent asynchronously by an Admin method. - - - -
- - - -
- - - - -
See:
- -
Admin.commitEntries
- -
scheduler
- - - -
- - -
- -
- - <static> - - - {Array} - - app.data.features -
- -
- In-memory registry of Feature instances. -Features are defined in the “extra” dir. - - - -
- - - - -
- -
- - <static> - - - {Array} - - app.data.mails -
- -
- In-memory e-mail message queue. -They will be sent asynchronously by an Admin method. - - - -
- - - -
- - - - -
See:
- -
helma.mail.flushQueue
- -
scheduler
- - - -
- - -
- -
- - <static> - - - {Array} - - app.data.requests -
- -
- In-memory store of remote requests for counting story hits. -They will be made persistent asynchronously by an Admin method. - - - -
- - - -
- - - - -
See:
- -
Admin.commitRequests
- -
scheduler
- - - -
- - - - -
-
- - - - - - -
-
- - - - diff --git a/docs/symbols/console.html b/docs/symbols/console.html deleted file mode 100644 index 2fc0fac4..00000000 --- a/docs/symbols/console.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - console | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace console -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- console -
-
A simple and hackish implementation of the console instance of some browsers.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
console.log(text) -
-
Convenience method for bridging log output from the server to the client.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- console -
- -
- A simple and hackish implementation of the console instance of some browsers. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - console.log(text) -
    - -
    - Convenience method for bridging log output from the server to the client. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {String} text - -
    -
    This text will be displayed in the browser’s console (if available).
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/helma.File.html b/docs/symbols/helma.File.html deleted file mode 100644 index 22920228..00000000 --- a/docs/symbols/helma.File.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - helma.File | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace helma.File -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  - -
The helma.File prototype is defined as a module.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
  -
copyDirectory(target) -
-
Helper method for recursively copying a directory and its files.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- helma.File -
- -
- The helma.File prototype is defined as a module. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - - - - - - copyDirectory(target) -
    - -
    - Helper method for recursively copying a directory and its files. - - - - -
    - - - - -
    -
    Parameters:
    - -
    - {helma.File} target - -
    -
    - -
    - - - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/helma.Mail.html b/docs/symbols/helma.Mail.html deleted file mode 100644 index bbdbee31..00000000 --- a/docs/symbols/helma.Mail.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - helma.Mail | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace helma.Mail -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  - -
The helma.Mail prototype is defined in a module.
-
-
- - - - - - - -
-

Method Summary

- - - - - - - - - - - - - - - - - - - - - - - - -
Method AttributesMethod Name and Description
<static>   -
helma.Mail.flushQueue() -
-
Try to send and remove every mail instance collected in the mail queue.
-
  -
queue() -
-
Add an e-mail message to the mail queue for later sending.
-
- - - -
- - - - - - -
-
-

- Namespace Detail -

- -
- helma.Mail -
- -
- The helma.Mail prototype is defined in a module. - -
- - - - - - -
-
- - - - - -
-
-

- Method Detail -

- -
    - - -
  • -
    - - <static> - - - - - helma.Mail.flushQueue() -
    - -
    - Try to send and remove every mail instance collected in the mail queue. - - - - -
    - - - - - - -
    - - - - - - - - - - - - -
    See:
    - -
    app.data.mails
    - - - -
    - -
    -
  • - -
  • -
    - - - - - {Number} - - queue() -
    - -
    - Add an e-mail message to the mail queue for later sending. - - - - -
    - - - - - - -
    - - - - - - - - -
    Returns:
    - -
    {Number} The number of mails waiting in the queue
    - - - - - - -
    See:
    - -
    app.data.mails
    - - - -
    - - -
  • - -
-
-
- - - - -
-
- - - - diff --git a/docs/symbols/jala.i18n.html b/docs/symbols/jala.i18n.html deleted file mode 100644 index 1cb62621..00000000 --- a/docs/symbols/jala.i18n.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - jala.i18n | Antville 1.4 API Reference - - - - - - - - - - - - - - - -
- -
- - Documentation generator: JsDoc Toolkit 2.4.0
- Template: Codeview 1.2
- Generated on: 2012-4-22 10:17 -
-
- -
- -
-
-

- - Namespace jala.i18n -

- -
-

- -

- - - - -
- - -
- - - - - - - - - - - - - - -
Namespace Summary
Constructor AttributesConstructor Name and Description
  -
- jala.i18n -
-
The jala.i18n namespace is defined in a module.
-
-
- - - - - - - - - - -
-
-

- Namespace Detail -

- -
- jala.i18n -
- -
- The jala.i18n namespace is defined in a module. - -
- - - - - - -
-
- - - - - - - - -
-
- - - - diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Admin_Admin.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Admin_Admin.js.html deleted file mode 100644 index bb8007e5..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Admin_Admin.js.html +++ /dev/null @@ -1,865 +0,0 @@ -
  1 //
-  2 // The Antville Project
-  3 // http://code.google.com/p/antville
-  4 //
-  5 // Copyright 2001-2007 by The Antville People
-  6 //
-  7 // Licensed under the Apache License, Version 2.0 (the ``License'');
-  8 // you may not use this file except in compliance with the License.
-  9 // You may obtain a copy of the License at
- 10 //
- 11 //    http://www.apache.org/licenses/LICENSE-2.0
- 12 //
- 13 // Unless required by applicable law or agreed to in writing, software
- 14 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 16 // See the License for the specific language governing permissions and
- 17 // limitations under the License.
- 18 //
- 19 // $Revision:3333 $
- 20 // $LastChangedBy:piefke3000 $
- 21 // $LastChangedDate:2007-09-15 01:25:23 +0200 (Sat, 15 Sep 2007) $
- 22 // $URL$
- 23 //
- 24 
- 25 /**
- 26  * @fileOverview Defines the Admin prototype.
- 27  */
- 28 
- 29 Admin.SITEREMOVALGRACEPERIOD = 14; // days
- 30 
- 31 /**
- 32  * 
- 33  * @param {HopObject} target
- 34  * @param {String} method
- 35  * @param {User} user
- 36  * @constructor
- 37  */
- 38 Admin.Job = function(target, method, user) {
- 39    var file;
- 40    user || (user = session.user);
- 41 
- 42    this.__defineGetter__("target", function() {
- 43       return target;
- 44    });
- 45 
- 46    this.__defineGetter__("method", function() {
- 47       return method;
- 48    });
- 49    
- 50    this.__defineGetter__("user", function() {
- 51       return user;
- 52    });
- 53    
- 54    this.__defineGetter__("name", function() {
- 55       return file.getName();
- 56    });
- 57    
- 58    this.remove = function() {
- 59       return file["delete"]();
- 60    }
- 61 
- 62    if (target && method && user) { 
- 63       file = new java.io.File.createTempFile("job-", String.EMPTY, Admin.queue.dir); 
- 64       serialize({type: target._prototype, id: target._id, method: method, user: user._id}, file);
- 65    } else if (target) {
- 66       file = new java.io.File(Admin.queue.dir, target);
- 67       if (file.exists()) {
- 68          var data = deserialize(file);
- 69          target = global[data.type].getById(data.id);
- 70          method = data.method;
- 71          user = User.getById(data.user);
- 72       }
- 73    } else {
- 74       throw Error("Insufficient arguments");
- 75    }
- 76 
- 77    this.toString = function() {
- 78       return ["[Job: ", method, " ", target, " by ", user, "]"].join(String.EMPTY); 
- 79    }
- 80 
- 81    return this;
- 82 }
- 83 
- 84 /**
- 85  * @function
- 86  * @returns {String[]}
- 87  * @see defineConstants
- 88  */
- 89 Admin.getNotificationScopes = defineConstants(Admin, markgettext("None"), 
- 90       markgettext("Trusted"), markgettext("Regular"));
- 91 
- 92 /**
- 93  * @function
- 94  * @return {String[]}
- 95  * @see defineConstants
- 96  */
- 97 Admin.getPhaseOutModes = defineConstants(Admin, markgettext("Disabled"), 
- 98       markgettext("Restricted"), markgettext("Abandoned"), 
- 99       markgettext("Both"));
-100 
-101 /**
-102  * @function
-103  * @returns {String[]}
-104  * @see defineConstants
-105  */
-106 Admin.getCreationScopes = defineConstants(Admin, markgettext("Privileged"), 
-107       markgettext("Trusted"), markgettext("Regular"));
-108 
-109 /**
-110  * Convenience method for easily queueing jobs.
-111  * @param {HopObject} target
-112  * @param {String} method
-113  * @param {User} user 
-114  * @returns {String}
-115  * @see Admin.Job
-116  */
-117 Admin.queue = function(target, method, user) {
-118    var job = new Admin.Job(target, method, user || session.user);
-119    return job.name;
-120 }
-121 
-122 /**
-123  * 
-124  */
-125 Admin.queue.dir = (new java.io.File(app.dir, "../jobs")).getCanonicalFile();
-126 Admin.queue.dir.exists() || Admin.queue.dir.mkdirs();
-127 
-128 /**
-129  * 
-130  */
-131 Admin.dequeue = function() {
-132    var jobs = Admin.queue.dir.list();
-133    var max = Math.min(jobs.length, 10);
-134    for (let i=0; i<max; i+=1) {
-135       let job = new Admin.Job(jobs[i]);
-136       if (job.target) {
-137          try {
-138             app.log("PROCESSING QUEUED JOB " + (i+1) + " OF " + max);
-139             switch (job.method) {
-140                case "remove":
-141                Site.remove.call(job.target);
-142                break;
-143                case "import":
-144                Importer.run(job.target, job.user);
-145                break;
-146                case "export":
-147                Exporter.run(job.target, job.user);
-148                break;
-149             }
-150          } catch (ex) {
-151             app.log("Failed to process job " + job + " due to " + ex);
-152             app.debug(ex.rhinoException);
-153          }
-154       }
-155       job.remove();
-156    }
-157    return;
-158 }
-159 
-160 /**
-161  * 
-162  */
-163 Admin.purgeSites = function() {
-164    var now = new Date;
-165 
-166    root.admin.deletedSites.forEach(function() {
-167       if (now - this.deleted > Date.ONEDAY * Admin.SITEREMOVALGRACEPERIOD) {
-168          if (this.job) {
-169             return; // Site is already scheduled for deletion
-170          }
-171          let job = new Admin.Job(this, "remove", User.getById(1));
-172          this.job = job.name;
-173       }
-174    });
-175    
-176    var notificationPeriod = root.phaseOutNotificationPeriod * Date.ONEDAY;
-177    var gracePeriod = root.phaseOutGracePeriod * Date.ONEDAY;
-178 
-179    var phaseOutAbandonedSites = function() {
-180       root.forEach(function() {
-181          if (this.status === Site.TRUSTED) {
-182             return;
-183          }
-184          var age = now - (this.stories.size() > 0 ? 
-185                this.stories.get(0).modified : this.created);
-186          if (age - notificationPeriod > 0) {
-187             if (!this.notified) {
-188                var site = res.handlers.site = this;
-189                this.members.owners.forEach(function() {
-190                   res.handlers.membership = this;
-191                   sendMail(this.creator.email,
-192                         gettext("[{0}] Warning: Site will be deleted"),
-193                         site.renderSkinAsString("$Site#notify_delete"));
-194                });
-195                this.notified = now;
-196             } else if (now - this.notified > gracePeriod) {
-197                this.mode = Site.DELETED;
-198                this.deleted = now;
-199                this.notified = null;
-200             }
-201          }
-202       });
-203       return;
-204    }
-205    
-206    var phaseOutRestrictedSites = function() {
-207       root.admin.restrictedSites.forEach(function() {
-208          if (this.status === Site.TRUSTED) {
-209             return;
-210          }
-211          var age = now - this.created;
-212          if (age - notificationPeriod > 0) {
-213             if (!this.notified) {
-214                var site = res.handlers.site = this;
-215                this.members.owners.forEach(function() {
-216                   res.handlers.membership = this;
-217                   sendMail(this.creator.email,
-218                         gettext("[{0}] Warning: Site will be blocked"),
-219                         site.renderSkinAsString("$Site#notify_block"));
-220                });
-221                this.notified = now;
-222             } else if (now - this.notified > gracePeriod) {
-223                this.status = Site.BLOCKED;
-224                this.notified = null;
-225             }
-226          }
-227       });
-228       return;
-229    }
-230    
-231    switch (root.phaseOutMode) {
-232       case Admin.ABANDONED:
-233       return phaseOutAbandonedSites();
-234       case Admin.RESTRICTED:
-235       return phaseOutRestrictedSites();
-236       case Admin.BOTH:
-237       phaseOutAbandonedSites();
-238       return phaseOutRestrictedSites();
-239    }
-240    return;
-241 }
-242 
-243 /**
-244  * 
-245  */
-246 Admin.purgeReferrers = function() {
-247    var sql = new Sql;
-248    var result = sql.execute(Sql.PURGEREFERRERS);
-249    return result;
-250 }
-251 
-252 /**
-253  * 
-254  */
-255 Admin.commitRequests = function() {
-256    var requests = app.data.requests;
-257    app.data.requests = {};
-258    for each (var item in requests) {
-259       switch (item.type) {
-260          case Story:
-261          var story = Story.getById(item.id);
-262          story && (story.requests = item.requests);
-263          break;
-264       }
-265    }
-266    res.commit();
-267    return;
-268 }
-269 
-270 /**
-271  * 
-272  */
-273 Admin.commitEntries = function() {
-274    var entries = app.data.entries;   
-275    app.data.entries = [];
-276    var history = [];
-277 
-278    for each (var item in entries) {
-279       var referrer = helma.Http.evalUrl(item.referrer);
-280       if (!referrer) {
-281          continue;
-282       }
-283 
-284       // Only log unique combinations of context, ip and referrer
-285       referrer = String(referrer);
-286       var key = item.context._prototype + "-" + item.context._id + ":" + 
-287             item.ip + ":" + referrer;
-288       if (history.indexOf(key) > -1) {
-289          continue;
-290       }
-291       history.push(key);
-292 
-293       // Exclude requests coming from the same site
-294       if (item.site) {
-295          var href = item.site.href().toLowerCase();
-296          if (href.startsWith("http") && 
-297                referrer.toLowerCase().contains(href.substr(0, href.length-1))) {
-298             continue;
-299          }
-300       }
-301       item.persist();
-302    }
-303 
-304    res.commit();
-305    return;
-306 }
-307 
-308 /**
-309  * 
-310  */
-311 Admin.invokeCallbacks = function() {
-312    var http = helma.Http();
-313    http.setTimeout(200);
-314    http.setReadTimeout(300);
-315    http.setMethod("POST");
-316 
-317    var ref, site, item;
-318    while (ref = app.data.callbacks.pop()) {
-319       site = Site.getById(ref.site);
-320       item = ref.handler && ref.handler.getById(ref.id);
-321       if (!site || !item) {
-322          continue;
-323       }
-324       app.log("Invoking callback URL " + site.callbackUrl + " for " + item);
-325       try {
-326          http.setContent({
-327             type: item.constructor.name,
-328             id: item.name || item._id,
-329             url: item.href(),
-330             date: item.modified.valueOf(),
-331             user: item.modifier.name,
-332             site: site.title || site.name,
-333             origin: site.href()
-334          });
-335          http.getUrl(site.callbackUrl);
-336       } catch (ex) {
-337          app.debug("Invoking callback URL " + site.callbackUrl + " failed: " + ex);
-338       }
-339    }
-340    return;
-341 }
-342 
-343 /**
-344  * 
-345  */
-346 Admin.updateHealth = function() {
-347    var health = Admin.health || {};
-348    if (!health.modified || new Date - health.modified > 5 * Date.ONEMINUTE) {
-349       health.modified = new Date;
-350       health.requestsPerUnit = app.requestCount - 
-351             (health.currentRequestCount || 0);
-352       health.currentRequestCount = app.requestCount;
-353       health.errorsPerUnit = app.errorCount - (health.currentErrorCount || 0);
-354       health.currentErrorCount = app.errorCount;
-355       Admin.health = health;
-356    }
-357    return;
-358 }
-359 
-360 /**
-361  * 
-362  */
-363 Admin.updateDomains = function() {
-364    res.push();
-365    for (var key in app.properties) {
-366       if (key.startsWith("domain.") && !key.endsWith("*")) {
-367          res.writeln(getProperty(key) + "\t\t" + key.substr(7));
-368       }
-369    }
-370    var map = res.pop();
-371    var file = new java.io.File(app.dir, "domains.map");
-372    var out = new java.io.BufferedWriter(new java.io.OutputStreamWriter(
-373          new java.io.FileOutputStream(file), "UTF-8"));
-374    out.write(map);
-375    out.close();
-376    return;
-377 }
-378 
-379 /**
-380  * The Admin prototype is mounted at root and provides actions needed
-381  * for system administration. A user needs the User.PRIVILEGED permission
-382  * to gain access or modify settings.
-383  * @name Admin
-384  * @constructor
-385  * @property {Sites[]} deletedSites Contains sites scheduled for deletion
-386  * @property {LogEntry[]} entries Contains administrative log entries only
-387  * @property {Sites[]} restrictedSites Contains sites which are restricted but not blocked
-388  * @property {Sites[]} sites Contains all available sites
-389  * @property {Users[]} users Contains all available users
-390  * @extends HopObject
-391  */
-392 Admin.prototype.constructor = function() {
-393    this.filterSites();
-394    this.filterUsers();
-395    this.filterLog();
-396    return this;
-397 }
-398 
-399 /**
-400  * 
-401  * @param {Object} action
-402  * @returns {Boolean}
-403  */
-404 Admin.prototype.getPermission = function(action) {
-405    if (!session.user) {
-406       return false;
-407    }
-408    switch (action) {
-409       case "users":
-410       if (req.queryParams.id === session.user._id) {
-411          return false;
-412       }
-413       break;
-414    }
-415    return User.require(User.PRIVILEGED);
-416 }
-417 
-418 /**
-419  * 
-420  */
-421 Admin.prototype.onRequest = function() {
-422    HopObject.prototype.onRequest.apply(this);
-423    if (!session.data.admin) {
-424       session.data.admin = new Admin();
-425    }
-426    return;
-427 }
-428 
-429 /**
-430  * 
-431  * @param {String} name
-432  */
-433 Admin.prototype.onUnhandledMacro = function(name) {
-434    res.debug("Add " + name + "_macro to Admin!");
-435    return null;
-436 }
-437 
-438 Admin.prototype.main_action = function() {
-439    return res.redirect(this.href("log"));
-440 }
-441 
-442 Admin.prototype.setup_action = function() {
-443    if (req.postParams.save) {
-444       try {
-445          this.update(req.postParams);
-446          this.log(root, "setup");
-447          res.message = gettext("Successfully updated the setup.");
-448          res.redirect(this.href(req.action));
-449       } catch (ex) {
-450          res.message = ex;
-451          app.log(ex);
-452       }
-453    }
-454 
-455    res.data.title = gettext("Setup");
-456    res.data.action = this.href(req.action);
-457    res.data.body = this.renderSkinAsString("$Admin#setup");
-458    root.renderSkin("Site#page");
-459    return;
-460 }
-461 
-462 /**
-463  * 
-464  * @param {Object} data
-465  */
-466 Admin.prototype.update = function(data) {
-467    root.map({
-468       creationScope: data.creationScope,
-469       creationDelay: data.creationDelay,
-470       replyTo: data.replyTo,
-471       notificationScope: data.notificationScope,
-472       phaseOutGracePeriod: data.phaseOutGracePeriod,
-473       phaseOutMode: data.phaseOutMode,
-474       phaseOutNotificationPeriod: data.phaseOutNotificationPeriod,
-475       probationPeriod: data.probationPeriod,
-476       quota: data.quota
-477    });
-478    return;
-479 }
-480 
-481 Admin.prototype.jobs_action = function() {
-482    var files = Admin.queue.dir.listFiles();
-483    for each (var file in files) {
-484       var job = deserialize(file);
-485       res.debug(job.toSource() + " – " + file);
-486    }
-487    return;
-488 }
-489 
-490 Admin.prototype.log_action = function() {
-491    if (req.postParams.search || req.postParams.filter) {
-492       session.data.admin.filterLog(req.postParams);
-493    }
-494    res.data.list = renderList(session.data.admin.entries, 
-495          this.renderItem, 10, req.queryParams.page);
-496    res.data.pager = renderPager(session.data.admin.entries, 
-497          this.href(req.action), 10, req.queryParams.page);
-498 
-499    res.data.title = gettext("Administration Log");
-500    res.data.action = this.href(req.action);
-501    res.data.body = this.renderSkinAsString("$Admin#log");
-502    res.data.body += this.renderSkinAsString("$Admin#main");
-503    root.renderSkin("Site#page");
-504    return;
-505 }
-506 
-507 Admin.prototype.sites_action = function() {
-508    if (req.postParams.id) {
-509       if (req.postParams.remove === "1") {
-510          var site = Site.getById(req.postParams.id);
-511          site.deleted = new Date;
-512          site.status = Site.BLOCKED;
-513          site.mode = Site.DELETED;
-514          this.log(root, "Deleted site " + site.name);
-515          res.message = gettext("The site {0} is queued for removal.",
-516                site.name);
-517          res.redirect(this.href(req.action) + "?page=" + req.postParams.page);
-518       } else if (req.postParams.save === "1") {
-519          this.updateSite(req.postParams);
-520          res.message = gettext("The changes were saved successfully.");
-521       }
-522       res.redirect(this.href(req.action) + "?page=" + req.postParams.page + 
-523             "#" + req.postParams.id);
-524       return;
-525    }
-526    
-527    if (req.postParams.search || req.postParams.filter) {
-528       session.data.admin.filterSites(req.postParams);
-529    } else if (req.queryParams.id) {
-530       res.meta.item = Site.getById(req.queryParams.id);
-531    }
-532 
-533    res.data.list = renderList(session.data.admin.sites, 
-534          this.renderItem, 10, req.queryParams.page);
-535    res.data.pager = renderPager(session.data.admin.sites, 
-536          this.href(req.action), 10, req.data.page);
-537 
-538    res.data.title = gettext("Site Administration");
-539    res.data.action = this.href(req.action);
-540    res.data.body = this.renderSkinAsString("$Admin#sites");
-541    res.data.body += this.renderSkinAsString("$Admin#main");
-542    root.renderSkin("Site#page");
-543    return;
-544 }
-545 
-546 Admin.prototype.users_action = function() {
-547    if (req.postParams.search || req.postParams.filter) {
-548       session.data.admin.filterUsers(req.postParams);
-549    } else if (req.postParams.save) {
-550       this.updateUser(req.postParams);
-551       res.message = gettext("The changes were saved successfully.");
-552       res.redirect(this.href(req.action) + "?page=" + req.postParams.page + 
-553             "#" + req.postParams.id);
-554    } else if (req.queryParams.id) {
-555       res.meta.item = User.getById(req.queryParams.id);
-556    }
-557 
-558    res.data.list = renderList(session.data.admin.users, 
-559          this.renderItem, 10, req.data.page);
-560    res.data.pager = renderPager(session.data.admin.users, 
-561          this.href(req.action), 10, req.data.page);
-562 
-563    res.data.title = gettext("User Administration");
-564    res.data.action = this.href(req.action);
-565    res.data.body = this.renderSkinAsString("$Admin#users");
-566    res.data.body += this.renderSkinAsString("$Admin#main");
-567    root.renderSkin("Site#page");
-568    return;
-569 }
-570 
-571 /**
-572  * 
-573  * @param {Object} data
-574  */
-575 Admin.prototype.filterLog = function(data) {
-576    data || (data = {});
-577    var sql = "";
-578    if (data.filter > 0) {
-579       sql += "where context_type = '";
-580       switch (data.filter) {
-581          case "1":
-582          sql += "Root"; break;
-583          case "2":
-584          sql += "Site"; break;
-585          case "3":
-586          sql += "User"; break;
-587       }
-588       sql += "' and ";
-589    } else {
-590       sql += "where "
-591    }
-592    sql += "action <> 'main' "; 
-593    if (data.query) {
-594       var parts = stripTags(data.query).split(" ");
-595       var keyword, like;
-596       for (var i in parts) {
-597          sql += i < 1 ? "and " : "or ";
-598          keyword = parts[i].replace(/\*/g, "%");
-599          like = keyword.contains("%") ? "like" : "=";
-600          sql += "action " + like + " '" + keyword + "' ";
-601       }
-602    }
-603    sql += "order by created "; 
-604    (data.dir == 1) || (sql += "desc");
-605    this.entries.subnodeRelation = sql;
-606    return;
-607 }
-608 
-609 /**
-610  * 
-611  * @param {Object} data
-612  */
-613 Admin.prototype.filterSites = function(data) {
-614    data || (data = {});
-615    var sql;
-616    switch (data.filter) {
-617       case "1":
-618       sql = "where status = 'blocked' "; break;
-619       case "2":
-620       sql = "where status = 'trusted' "; break;
-621       case "3":
-622       sql = "where mode = 'open' "; break;
-623       case "4":
-624       sql = "where mode = 'restricted' "; break;
-625       case "5":
-626       sql = "where mode = 'public' "; break;
-627       case "6":
-628       sql = "where mode = 'closed' "; break;
-629       case "7":
-630       sql = "where mode = 'deleted' "; break;
-631       case "0":
-632       default:
-633       sql = "where true ";
-634    }
-635    if (data.query) {
-636       var parts = stripTags(data.query).split(" ");
-637       var keyword, like;
-638       for (var i in parts) {
-639          sql += i < 1 ? "and " : "or ";
-640          keyword = parts[i].replace(/\*/g, "%");
-641          like = keyword.contains("%") ? "like" : "=";
-642          sql += "(name " + like + " '" + keyword + "') ";
-643       }
-644    }
-645    switch (data.order) {
-646       case "1":
-647       sql += "group by created, id order by created "; break;
-648       case "2":
-649       sql += "group by name, id order by name "; break;
-650       default:
-651       sql += "group by modified, id order by modified "; break;
-652    }
-653    (data.dir == 1) || (sql += "desc");
-654    this.sites.subnodeRelation = sql;
-655    return;
-656 }
-657 
-658 /**
-659  * 
-660  * @param {Object} data
-661  */
-662 Admin.prototype.filterUsers = function(data) {
-663    data || (data = {});
-664    var sql;
-665    switch (data.filter) {
-666       case "1":
-667       sql = "where status = 'blocked' "; break;
-668       case "2":
-669       sql = "where status = 'trusted' "; break;
-670       case "3":
-671       sql = "where status = 'privileged' "; break;
-672       default:
-673       sql = "where true "; break;
-674    }
-675    if (data.query) {
-676       var parts = stripTags(data.query).split(" ");
-677       var keyword, like;
-678       for (var i in parts) {
-679          sql += i < 1 ? "and " : "or ";
-680          keyword = parts[i].replace(/\*/g, "%");
-681          like = keyword.contains("%") ? "like" : "=";
-682          if (keyword.contains("@")) {
-683             sql += "email " + like + " '" + keyword.replace(/@/g, "") + "' ";
-684          } else {
-685             sql += "name " + like + " '" + keyword + "' ";
-686          }
-687       }
-688    }
-689    switch (data.order) {
-690       case "0":
-691       default:
-692       sql += "group by created, id order by created "; break;
-693       case "1":
-694       sql += "group by modified, id order by modified "; break;
-695       case "2":
-696       sql += "group by name, id order by name "; break;
-697    }
-698    (data.dir == 1) || (sql += "desc");
-699    this.users.subnodeRelation = sql;
-700    return;
-701 }
-702 
-703 /**
-704  * 
-705  * @param {Object} data
-706  */
-707 Admin.prototype.updateSite = function(data) {
-708    var site = Site.getById(data.id);
-709    if (!site) {
-710       throw Error(gettext("Please choose a site you want to edit."));
-711    }
-712    if (site.status !== data.status) { 
-713       var current = site.status;
-714       site.status = data.status;
-715       this.log(site, "Changed status from " + current + " to " + site.status);
-716    }
-717    return;
-718 }
-719 
-720 /**
-721  * 
-722  * @param {Object} data
-723  */
-724 Admin.prototype.updateUser = function(data) {
-725    var user = User.getById(data.id);
-726    if (!user) {
-727       throw Error(gettext("Please choose a user you want to edit."));
-728    }
-729    if (user === session.user) {
-730       throw Error(gettext("Sorry, you are not allowed to modify your own account."));
-731    }
-732    if (data.status !== user.status) {
-733       var current = user.status;
-734       user.status = data.status;
-735       this.log(user, "Changed status from " + current + " to " + data.status);
-736    }
-737    return;
-738 }
-739 
-740 /**
-741  * 
-742  * @param {HopObject} item
-743  */
-744 Admin.prototype.renderItem = function(item) {
-745    res.handlers.item = item;
-746    var name = item._prototype;
-747    (name === "Root") && (name = "Site");
-748    Admin.prototype.renderSkin("$Admin#" + name);
-749    if (item === res.meta.item) {
-750       Admin.prototype.renderSkin((req.data.action === "delete" ? 
-751             "$Admin#delete" : "$Admin#edit") + name);
-752    }
-753    return;
-754 }
-755 
-756 /**
-757  * 
-758  * @param {HopObject} context
-759  * @param {String} action
-760  */
-761 Admin.prototype.log = function(context, action) {
-762    var entry = new LogEntry(context, action);
-763    this.entries.add(entry);
-764    return;
-765 }
-766 
-767 /**
-768  * 
-769  * @param {Object} param
-770  * @param {String} action
-771  * @param {Number} id
-772  * @param {String} text
-773  */
-774 Admin.prototype.link_macro = function(param, action, text, id) {
-775    switch (action) {
-776       case "main":
-777       action = ".";
-778       case "delete":
-779       case "edit":
-780       if (id) {
-781          if (req.action === "users" && (id === session.user._id)) {
-782             return;
-783          }
-784          if (req.action === "sites" && (id === root._id)) {
-785             return;
-786          }
-787          action = req.action + "?action=" + action + "&id=" + id;
-788          if (req.queryParams.page) {
-789             action += "&page=" + req.queryParams.page;
-790          }
-791          action += "#" + id;
-792       }
-793       break;
-794    }
-795    return HopObject.prototype.link_macro.call(this, param, action, text);
-796 }
-797 
-798 /**
-799  * 
-800  * @param {Object} param
-801  * @param {HopObject} object
-802  */
-803 Admin.prototype.count_macro = function(param, object) {
-804    if (object && object.size) {
-805       res.write(object.size());
-806    }
-807    return;
-808 }
-809 
-810 /**
-811  * 
-812  * @param {Object} param
-813  * @param {String} name
-814  */
-815 Admin.prototype.skin_macro = function(param, name) {
-816    if (this.getPermission("main")) {
-817       return HopObject.prototype.skin_macro.apply(this, arguments);
-818    }
-819    return;
-820 }
-821 
-822 /**
-823  * 
-824  * @param {Object} param
-825  * @param {HopObject} object
-826  * @param {String} name
-827  */
-828 Admin.prototype.items_macro = function(param, object, name) {
-829    if (!object || !object.size) {
-830       return;
-831    }
-832    var max = Math.min(object.size(), parseInt(param.limit) || 10);
-833    for (var i=0; i<max; i+=1) {
-834       html.link({href: object.get(i).href()}, "#" + (object.size()-i) + " ");
-835    }
-836    return;
-837 }
-838 
-839 /**
-840  * 
-841  * @param {Object} param
-842  */
-843 Admin.prototype.dropdown_macro = function(param /*, value1, value2, ... */) {
-844    if (!param.name || arguments.length < 2) {
-845       return;
-846    }
-847    var values = Array.prototype.slice.call(arguments, 1);
-848    var options = values.map(function(item, index) {
-849       return {
-850          value: index,
-851          display: gettext(item)
-852       }
-853    });
-854    var selectedIndex = req.postParams[param.name];
-855    html.dropDown({name: param.name}, options, selectedIndex);
-856    return;
-857 }
-858 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.antville.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.antville.js.html deleted file mode 100644 index a16ceb05..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.antville.js.html +++ /dev/null @@ -1,42 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Methods that implement Antville’s own API.
- 28  */
- 29 
- 30 Api.antville = {};
- 31 
- 32 Api.prototype.ping_action = function() {
- 33    JSON.sendPaddedResponse(session.user ? session.user._id : null);
- 34 }
- 35 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.blogger.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.blogger.js.html deleted file mode 100644 index 97ace71d..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.blogger.js.html +++ /dev/null @@ -1,260 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Methods that implement Blogger's XML-RPC API.
- 28  * See http://goo.gl/u8lZZ for further details.
- 29  * The blogger.getTemplate and blogger.setTemplate methods are not supported
- 30  */
- 31 
- 32 /** @namespace */
- 33 Api.blogger = {};
- 34 
- 35 /**
- 36  * 
- 37  * @param {String} content
- 38  */
- 39 Api.blogger._getContentParts = function(content) {
- 40    content && (content = content.trim());
- 41    content || (content = String.EMPTY);
- 42    var result = {};
- 43    if (!content.startsWith("<title>")) {
- 44       result.text = content;
- 45    } else {
- 46       var pos = content.lastIndexOf("</title>");
- 47       if (pos > 0) {
- 48          result.title = content.substring(7, pos);
- 49          result.text = content.substring (pos + 8); 
- 50       } else {
- 51          result.text = content;
- 52       }
- 53    }
- 54    return result;
- 55 }
- 56 
- 57 /**
- 58  * 
- 59  * @param {String} appKey
- 60  * @param {String} name
- 61  * @param {String} password
- 62  * @throws {Error}
- 63  * @returns {Object} Properties: userid, nickname and url
- 64  */
- 65 Api.blogger.getUserInfo = function(appKey, name, password) {
- 66    var user = User.getByName(name);
- 67    if (!user) {
- 68       throw Error("User " + name + " does not exist on this server");
- 69    }
- 70    return {
- 71       userid: name,
- 72       nickname: name,
- 73       url: user.url
- 74    }
- 75 }
- 76 
- 77 /**
- 78  * 
- 79  * @param {String} appKey
- 80  * @param {String} name
- 81  * @param {String} password
- 82  * @returns {Object[]} A list of objects with the properties blogid, blogName and 
- 83  * url
- 84  */
- 85 Api.blogger.getUsersBlogs = function(appKey, name, password) {
- 86    var user = Api.getUser(name, password);
- 87    var result = [];
- 88    user.forEach(function() {
- 89       Api.constrain(this.site, user);
- 90       if (this.site.stories.getPermission("create")) {
- 91          result.push({
- 92             blogid: this.site.name,
- 93             blogName: this.site.title,
- 94             url: this.site.href()
- 95          });
- 96       }
- 97       return;
- 98    });
- 99    return result;
-100 }
-101 
-102 /**
-103  * 
-104  * @param {String} appKey
-105  * @param {Number} id
-106  * @param {String} name
-107  * @param {String} password
-108  * @param {Number} limit
-109  * @throws {Error}
-110  * @returns {Object[]} A list of objects with the properties postid, userid,
-111  * dateCreated and content
-112  */
-113 Api.blogger.getRecentPosts = function(appKey, id, name, password, limit) {
-114    var site = Api.getSite(id);
-115    var user = Api.getUser(name, password);
-116 
-117    Api.constrain(site, user);
-118    if (!site.stories.getPermission("main")) {
-119       throw Error("Permission denied for user " + user.name + 
-120             " to get recent posts of site " + site.name);
-121    }
-122 
-123    var result = [];
-124    var stories = res.handlers.membership.stories;
-125    var max = Math.min(stories.size(), Number(limit) || Infinity, 20);
-126    for each (var story in stories.list(0, max)) {
-127       result.push({
-128          postid: story._id,
-129          userid: story.creator.name,
-130          dateCreated: story.created,
-131          content: story.title ? "<title>" + story.title + 
-132                "</title>" + story.text : story.text
-133       });
-134    }
-135    return result;
-136 }
-137 
-138 /**
-139  * 
-140  * @param {String} appKey
-141  * @param {Number} id
-142  * @param {String} name
-143  * @param {String} password
-144  * @throws {Error}
-145  * @returns {Object} Properties: content, userid, postid, dateCreated
-146  */
-147 Api.blogger.getPost = function(appKey, id, name, password) {
-148    var story = Api.getStory(id);
-149    var user = Api.getUser(name, password);
-150    
-151    Api.constrain(story.site, user);
-152    if (!story.getPermission("main")) {
-153       throw Error("Permission denied for user " + name + 
-154             " to get post #" + id);
-155    }
-156 
-157    return {
-158       content: story.title ? html.elementAsString("title", story.title) + 
-159             story.text : story.text,
-160       userid: story.creator.name,
-161       postid: story._id,
-162       dateCreated: story.created
-163    }
-164 }
-165 
-166 /**
-167  * 
-168  * @param {String} appKey
-169  * @param {Number} id
-170  * @param {String} name
-171  * @param {String} password
-172  * @param {String} content
-173  * @param {Boolean} publish
-174  * @throws {Error}
-175  * @returns {Number} The ID of the new story
-176  */
-177 Api.blogger.newPost = function(appKey, id, name, password, content, publish) {
-178    var site = Api.getSite(id);
-179    var user = Api.getUser(name, password);
-180    
-181    Api.constrain(site, user);
-182    if (!site.stories.getPermission("create")) {
-183       throw Error("Permission denied for user " + user.name + 
-184             " to add a post to site " + site.name);
-185    }
-186 
-187    var parts = Api.blogger._getContentParts(content);
-188 
-189    var story = Story.add({
-190       title: parts.title,
-191       text: parts.text,
-192       status: publish ? Story.PUBLIC : Story.CLOSED,
-193       mode: Story.FEATURED
-194    }, site, user);
-195 
-196    return story._id;
-197 }
-198 
-199 /**
-200  * 
-201  * @param {String} appKey
-202  * @param {Number} id
-203  * @param {String} name
-204  * @param {String} password
-205  * @param {String} content
-206  * @param {Boolean} publish
-207  * @throws {Error}
-208  * @returns {Boolean} Always true
-209  */
-210 Api.blogger.editPost = function(appkey, id, name, password, content, publish) {
-211    var story = Api.getStory(id);
-212    var user = Api.getUser(name, password);
-213 
-214    Api.constrain(story.site, user);
-215    if (!story.getPermission("edit")) {
-216       throw Error("Permission denied for user " + name + 
-217             " to edit post #" + id);
-218    }
-219 
-220    var parts = Api.blogger._getContentParts(content);
-221    story.update({
-222       title: parts.title,
-223       text: parts.text,
-224       status: publish ? Story.PUBLIC : Story.CLOSED,
-225       modifier: user,
-226       modified: new Date
-227    });
-228    return true;
-229 }
-230 
-231 /**
-232  * 
-233  * @param {String} appKey
-234  * @param {Number} id
-235  * @param {String} name
-236  * @param {String} password
-237  * @throws {Error}
-238  * @returns {Boolean} Always true
-239  */
-240 Api.blogger.deletePost = function(appKey, id, name, password) {
-241    var story = Api.getStory(id);
-242    var user = Api.getUser(name, password);
-243 
-244    Api.constrain(story.site, user);
-245    if (!story.getPermission("delete")) {
-246       throw Error("Permission denied for user " + name + 
-247             " to delete story #" + id);
-248    }
-249 
-250    Story.remove.call(story);
-251    return true;
-252 }
-253 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.js.html deleted file mode 100644 index 9b7e707a..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.js.html +++ /dev/null @@ -1,208 +0,0 @@ -
  1 //
-  2 // The Antville Project
-  3 // http://code.google.com/p/antville
-  4 //
-  5 // Copyright 2001-2007 by The Antville People
-  6 //
-  7 // Licensed under the Apache License, Version 2.0 (the ``License'');
-  8 // you may not use this file except in compliance with the License.
-  9 // You may obtain a copy of the License at
- 10 //
- 11 //    http://www.apache.org/licenses/LICENSE-2.0
- 12 //
- 13 // Unless required by applicable law or agreed to in writing, software
- 14 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 16 // See the License for the specific language governing permissions and
- 17 // limitations under the License.
- 18 //
- 19 // $Revision$
- 20 // $LastChangedBy$
- 21 // $LastChangedDate$
- 22 // $URL$
- 23 //
- 24 
- 25 /**
- 26  * @fileOverview Defines the Api prototype.
- 27  */
- 28 
- 29 /**
- 30  * 
- 31  * @param {Site} site
- 32  * @param {User} user
- 33  */
- 34 Api.constrain = function(site, user) {
- 35    res.handlers.site = site;
- 36    res.handlers.membership = Membership.getByName(user.name);
- 37    return;
- 38 }
- 39 
- 40 /** @ignore */
- 41 Api.dispatch = function() {
- 42 }
- 43 
- 44 /**
- 45  * 
- 46  * @param {String} name
- 47  * @param {String} password
- 48  * @throws {Error}
- 49  * @returns {User} 
- 50  */
- 51 Api.getUser = function(name, password) {
- 52    var user = User.getByName(name);
- 53    if (!user) {
- 54       throw Error("User " + name + " does not exist on this server");
- 55    } else if (user.hash !== String(password + user.salt).md5()) {
- 56       throw Error("Authentication failed for user " + name);
- 57    } else if (user.status === User.BLOCKED) {
- 58       throw Error("The user account " + name + " is currently blocked");
- 59    }
- 60    // FIXME: This was commented out after Story.add() et al. were added
- 61    //session.login(user);
- 62    return user;
- 63 }
- 64 
- 65 /**
- 66  * 
- 67  * @param {String} name
- 68  * @throws {Error}
- 69  * @returns {Site}
- 70  */
- 71 Api.getSite = function(name) {
- 72    var site = Site.getByName(String(name));
- 73    if (!site) {
- 74       throw Error("Site " + name + " does not exist on this server");
- 75    } else if (site.status === Site.BLOCKED) {
- 76       throw Error("The site " + name + " is blocked");
- 77    }
- 78    return site;
- 79 }
- 80 
- 81 /**
- 82  * 
- 83  * @param {Number} id
- 84  * @throws {Error}
- 85  * @returns {Story}
- 86  */
- 87 Api.getStory = function(id) {
- 88    var story = Story.getById(id);
- 89    if (!story) {
- 90       throw Error("Story #" + id + " does not exist on this server");
- 91    }
- 92    return story;
- 93 }
- 94 
- 95 /**
- 96  * @name Api
- 97  * @constructor
- 98  * @extends HopObject
- 99  */
-100 
-101 /**
-102  * @returns {Boolean}
-103  */
-104 Api.prototype.getPermission = function(){
-105    return true;
-106 }
-107 
-108 Api.prototype.main_action = function() {
-109    res.data.title = gettext("Application Programming Interfaces");
-110    res.data.body = this.renderSkinAsString("$Api#main");
-111    res.handlers.site.renderSkin("Site#page");
-112    return;
-113 }
-114 
-115 Api.prototype.callback_action = function() {
-116    var ping = function(data) {
-117       if (data.type !== "Story" && data.type !== "Comment") {
-118          return;
-119       }
-120       var remote = new Remote("http://rpc.weblogs.com/RPC2");
-121       var call = remote.weblogUpdates.ping(data.site, data.origin);
-122       if (call.error || call.result.flerror) {
-123          app.debug("Error invoking weblogs.com ping() method for " + 
-124                data.site + ": " + call.error || call.result.message);
-125       } else {
-126          app.debug(call.result);
-127       }
-128       return;
-129    };
-130 
-131    if (req.isGet()) {
-132       res.data.title = gettext("Default Callback Url");
-133       res.data.body = this.renderSkinAsString("$Api#callback", 
-134             {name: req.action, code: ping.toString()});
-135       res.handlers.site.renderSkin("Site#page");
-136    } else if (req.isPost()) {
-137       app.debug("Invoked default callback with POST params: " + req.postParams);
-138       app.invokeAsync(this, ping, [req.postParams], 1000);
-139    }
-140    return;
-141 }
-142 
-143 /**
-144  * 
-145  * @param {String} methodName
-146  * @throws {Error}
-147  */
-148 Api.prototype.main_action_xmlrpc = function(methodName) {
-149    if (!methodName) {
-150       return false;
-151    } 
-152    var parts = methodName.split(".");
-153    var method = parts[1];
-154    if (method && !method.startsWith("_")) {
-155       var handler = Api[parts[0]];
-156       if (handler && handler[method]) {
-157          var args = Array.prototype.splice.call(arguments, 1);
-158          return handler[method].apply(null, args);
-159       }
-160    }
-161    throw Error("Method " + methodName + "() is not implemented");
-162    return;
-163 }
-164 
-165 /**
-166  *
-167  * @param {String} name
-168  */
-169 Api.prototype.getChildElement = function(name) {
-170    if (name === "json") {
-171       var flexiPath = new FlexiPath(name, this);
-172       
-173       flexiPath.addUrlPattern("/1/users/show/(.+).json$", function(path, name) {
-174          var id = parseInt(name, 10);
-175          var user = User.getById(id);
-176          res.write({
-177             id: id,
-178             name: user.name
-179          }.toJSON());
-180          return;
-181       });
-182 
-183       flexiPath.addUrlPattern("/1/users/update/$", function() {
-184          app.log(res.cookies);
-185          var user = User.getByName(req.data.name);
-186          if (!user) {
-187             user = User.register(req.data);
-188          }
-189          res.write({
-190             id: user._id,
-191             name: user.name
-192          }.toJSON());
-193          return;
-194       });
-195 
-196       return flexiPath;
-197       //: "updateUser"
-198    }
-199    return this.get(name);
-200 }
-201 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.metaWeblog.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.metaWeblog.js.html deleted file mode 100644 index c085f201..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.metaWeblog.js.html +++ /dev/null @@ -1,257 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Methods that implement the MetaWeblog XML-RPC API.
- 28  * See http://www.xmlrpc.com/metaWeblogApi for further details.
- 29  */
- 30 
- 31 /** @namespace */
- 32 Api.metaWeblog = {}
- 33 
- 34 /**
- 35  * @param {Story} story
- 36  * @returns {Object}
- 37  */
- 38 Api.metaWeblog._getStruct = function(story) {
- 39    return {
- 40       userid: story.creator.name,
- 41       postid: story._id,
- 42       dateCreated: story.created,
- 43       title: story.getTitle(),
- 44       description: story.text,
- 45       categories: story.getTags(),
- 46       flNotOnHomePage: story.mode === Story.HIDDEN ? true : false,
- 47       link: story.href(),
- 48       permaLink: story.href(),
- 49       mt_excerpt: null, // FIXME: What are these "mt_" prefixed properties?
- 50       mt_text_more: null,
- 51       mt_allow_comments: story.commentMode === Story.OPEN ? 1 : 0,
- 52       mt_allow_pings: 0,
- 53       mt_convert_breaks: null,
- 54       mt_keywords: null,
- 55       postSource: story.getMetadata('postSource')
- 56    }
- 57 }
- 58 
- 59 /**
- 60  * 
- 61  * @param {Number} id
- 62  * @param {String} name
- 63  * @param {String} password
- 64  * @param {Number} limit
- 65  * @throws {Error}
- 66  * @returns {Object[]}
- 67  */
- 68 Api.metaWeblog.getRecentPosts = function(id, name, password, limit) {
- 69    var site = Api.getSite(id);
- 70    var user = Api.getUser(name, password);
- 71 
- 72    Api.constrain(site, user);
- 73    if (!site.stories.getPermission("main")) {
- 74       throw Error("Permission denied for user " + user.name + 
- 75             " to get recent posts from site " + site.name);
- 76    }
- 77 
- 78    var result = [];
- 79    var stories = res.handlers.membership.stories;
- 80    var max = Math.min(stories.size(), Number(limit) || Infinity, 20);
- 81    for each (var story in stories.list(0, max)) {
- 82       result.push(Api.metaWeblog._getStruct(story));
- 83    }
- 84    return result;
- 85 }
- 86 
- 87 /**
- 88  * 
- 89  * @param {Number} id
- 90  * @param {String} name
- 91  * @param {String} password
- 92  * @throws {Error}
- 93  * @returns {Object}
- 94  */
- 95 Api.metaWeblog.getPost = function(id, name, password) {
- 96    var story = Api.getStory(id);
- 97    var user = Api.getUser(name, password);
- 98    Api.constrain(story.site, user);
- 99    if (!story.getPermission("main")) { 
-100       throw Error("Permission denied for user " + name + 
-101             " to get post #" + id);
-102    }
-103    return Api.metaWeblog._getStruct(story);
-104 }
-105 
-106 /**
-107  * 
-108  * @param {Number} id
-109  * @param {String} name
-110  * @param {String} password
-111  * @param {String} content
-112  * @param {Boolean} publish
-113  * @throws {Error}
-114  * @returns {Number}
-115  */
-116 Api.metaWeblog.newPost = function(id, name, password, content, publish) {
-117    var site = Api.getSite(id);
-118    var user = Api.getUser(name, password);
-119    
-120    Api.constrain(site, user);
-121    if (!site.stories.getPermission("create")) {
-122       throw Error("Permission denied for user " + user.name + 
-123             " to add a post to site " + site.name);
-124    }
-125 
-126    var story = Story.add({
-127       title: content.title,
-128       text: content.description,
-129       status: publish ? Story.PUBLIC : Story.CLOSED,
-130       mode: content.flNotOnHomePage ? Story.HIDDEN : Story.FEATURED,
-131       commentMode: content.discussions === 0 ? Story.CLOSED : Story.OPEN,
-132       tags: content.categories
-133    }, site, user);
-134 
-135    story.setMetadata('postSource', content.postSource);
-136    return story._id;
-137 }
-138 
-139 /**
-140  * 
-141  * @param {Number} id
-142  * @param {String} name
-143  * @param {String} password
-144  * @param {String} content
-145  * @param {Boolean} publish
-146  * @throws {Error}
-147  * @returns {Boolean}
-148  */
-149 Api.metaWeblog.editPost = function(id, name, password, content, publish) {
-150    var story = Api.getStory(id);
-151    var user = Api.getUser(name, password);
-152 
-153    Api.constrain(story.site, user);
-154    if (!story.getPermission("edit")) {
-155       throw Error("Permission denied for user " + name + 
-156             " to edit post #" + id);         
-157    }
-158 
-159    story.update({
-160       title: content.title,
-161       text: content.description,
-162       status: publish ? Story.PUBLIC : Story.CLOSED,
-163       mode: content.flNotOnHomePage ? Story.HIDDEN : Story.FEATURED,
-164       commentMode: content.discussions || content.mt_allow_comments ? 
-165             Story.OPEN : Story.CLOSED,
-166       tags: content.categories
-167    });
-168 
-169    story.setMetadata('postSource', content.postSource);
-170    return true;
-171 }
-172 
-173 /**
-174  * 
-175  * @param {Number} id
-176  * @param {String} name
-177  * @param {String} password
-178  * @throws {Error}
-179  * @returns {Object[]}
-180  */
-181 Api.metaWeblog.getCategories = function(id, name, password) {
-182    var site = Api.getSite(id);
-183    var user = Api.getUser(name, password);
-184 
-185    Api.constrain(site, user);
-186    if (!site.stories.getPermission("main")) {
-187       throw Error("Permission denied for user " + user.name + 
-188             " to get categories from site " + site.name);
-189    }
-190 
-191    var result = [];
-192    var tags = site.getTags("tags", Tags.ALL).list();
-193    for each (var tag in tags) {
-194      result.push({
-195         description: tag.name,
-196         htmlUrl: tag.href(),
-197         rssUrl: tag.href("rss")
-198      });
-199    }
-200    return result;
-201 }
-202 
-203 /**
-204  * 
-205  * @param {Number} id
-206  * @param {String} name
-207  * @param {String} password
-208  * @param {String} media
-209  * @throws {Error}
-210  * @returns {Object}
-211  */
-212 Api.metaWeblog.newMediaObject = function(id, name, password, media) {
-213    var site = Api.getSite(id);
-214    var user = Api.getUser(name, password);
-215 
-216    Api.constrain(site, user);
-217 
-218    var result = {};
-219    var data = {};
-220    if (media.type && media.type.toLowerCase().startsWith("image/")) {
-221       if (!site.images.getPermission("create")) {
-222          throw Error("Permission denied for user " + user.name + 
-223                " to add a media object to site " + site.name);
-224       }
-225       data.file = new Packages.helma.util.MimePart(media.name, 
-226             media.bits, media.type);
-227       data.file_origin = media.name;
-228       data.description = media.description;
-229       if (media.maxWidth) {
-230           data.maxWidth = media.maxWidth;
-231       }
-232       if (media.maxHeight) {
-233           data.maxHeight = media.maxHeight;
-234       }
-235       result.url = Image.add(data, site, user).getUrl();
-236    } else {
-237       if (!site.files.getPermission("create")) {
-238          throw Error("Permission denied for user " + user.name + 
-239                " to add a media object to site " + site.name);
-240       }
-241       data.file = new Packages.helma.util.MimePart(media.name, 
-242             media.bits, media.type);
-243       data.file_origin = media.name;
-244       data.description = media.description;
-245       result.url = File.add(data, site, user).getUrl();
-246    }
-247    
-248    return result;
-249 }
-250 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.mt.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.mt.js.html deleted file mode 100644 index dd4d3ef6..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Api_Api.mt.js.html +++ /dev/null @@ -1,209 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Methods that implement Movable Type's XML-RPC API.
- 28  * See http://www.sixapart.com/pronet/breese/xmlrpc/movable_type_api/ for details.
- 29  */
- 30 
- 31 /** @namespace */
- 32 Api.mt = {};
- 33 
- 34 /**
- 35  * 
- 36  * @param {Number} id
- 37  * @param {String} name
- 38  * @param {String} password
- 39  * @param {Number} limit
- 40  * @throws {Error}
- 41  * @returns {Object[]}
- 42  */
- 43 Api.mt.getRecentPostTitles = function(id, name, password, limit) {
- 44    var site = Api.getSite(id);
- 45    var user = Api.getUser(name, password);
- 46 
- 47    Api.constrain(site, user);
- 48    if (!site.stories.getPermission("main")) {
- 49       throw Error("Permission denied for user " + user.name + 
- 50             " to get recent post titles from site " + site.name);
- 51    }
- 52 
- 53    var result = [];
- 54    var stories = res.handlers.membership.stories;
- 55    var max = Math.min(stories.size(), Number(limit) || Infinity, 20);
- 56    for each (var story in stories.list(0, max)) {
- 57       result.push({
- 58          postid: story._id,
- 59          username: story.creator.name,
- 60          dateCreated: story.created,
- 61          title: story.getTitle()	
- 62       });
- 63    }
- 64    return result;
- 65 }
- 66 
- 67 /**
- 68  * 
- 69  * @param {Number} id
- 70  * @param {String} name
- 71  * @param {String} password
- 72  * @throws {Error}
- 73  * @returns {Object[]}
- 74  */
- 75 Api.mt.getCategoryList = function(id, name, password) {
- 76    var site = Api.getSite(id);
- 77    var user = Api.getUser(name, password);
- 78 
- 79    Api.constrain(site, user);
- 80    if (!site.stories.getPermission("main")) {
- 81       throw Error("Permission denied for user " + user.name + 
- 82             " to access site " + site.name);
- 83    }
- 84    
- 85    var result = [];
- 86    var tags = site.getTags("tags", Tags.ALL).list();
- 87    for each (var tag in tags) {
- 88      result.push({
- 89         categoryId: tag.name, // FIXME: tag._id,
- 90         categoryName: tag.name
- 91      });
- 92    }
- 93    return result;
- 94 }
- 95 
- 96 /**
- 97  * 
- 98  * @param {Number} id
- 99  * @param {String} name
-100  * @param {String} password
-101  * @throws {Error}
-102  * @returns {Object[]}
-103  */
-104 Api.mt.getPostCategories = function(id, name, password) {
-105    var story = Api.getStory(id);
-106    var user = Api.getUser(name, password);
-107 
-108    Api.constrain(story.site, user);
-109    if (!story.getPermission("main")) {
-110       throw Error("Permission denied for user " + name + 
-111             " to access story #" + id);
-112    }
-113    
-114    var result = [];
-115    for each (var tag in story.getTags()) {
-116       result.push({
-117          categoryId: tag,
-118          categoryName: tag,
-119          isPrimary: true
-120       });
-121    }
-122    return result;
-123 }
-124 
-125 // FIXME: How do I post a new story?
-126 /**
-127  * 
-128  * @param {Number} id
-129  * @param {String} name
-130  * @param {String} password
-131  * @throws {Error}
-132  * @returns {Boolean}
-133  */
-134 Api.mt.publishPost = function(id, name, password) {
-135    var story = Api.getStory(id);
-136    var user = Api.getUser(name, password);
-137 
-138    Api.constrain(story.site, user);
-139    if (!story.getPermission("edit")) {
-140       throw Error("Permission denied for user " + name + 
-141             " to edit story #" + id);
-142    }
-143 
-144    story.mode = Story.FEATURED;
-145    return true;   
-146 }
-147 
-148 /**
-149  * 
-150  * @param {Number} id
-151  * @param {String} name
-152  * @param {String} password
-153  * @param {String[]} categories
-154  * @throws {Error}
-155  * @returns {Boolean}
-156  */
-157 Api.mt.setPostCategories = function(id, name, password, categories) {
-158    if (!categories || !categories.length) {
-159       return;
-160    }
-161 
-162    var story = Api.getStory(id);
-163    var user = Api.getUser(name, password);
-164 
-165    Api.constrain(story.site, user);
-166    if (!story.getPermission("edit")) {
-167       throw Error("Permission denied for user " + name + 
-168             " to edit story #" + id);
-169    }
-170 
-171    story.setTags(categories);
-172    return true;
-173 }
-174 
-175 /**
-176  * 
-177  * @returns {Array}
-178  */
-179 Api.mt.supportedTextFilters = function() {
-180    return [];
-181 }
-182 
-183 /**
-184  * 
-185  * @returns {Array}
-186  */
-187 Api.mt.getTrackbackPings = function() {
-188    return [];
-189 }
-190 
-191 /**
-192  * 
-193  * @returns {String[]}
-194  */
-195 Api.mt.supportedMethods = function() {
-196    var result = [];
-197    for (var method in Api.mt) {
-198       result.push(method);
-199    }
-200    return result.sort();
-201 }
-202 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Archive_Archive.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Archive_Archive.js.html deleted file mode 100644 index cbdb716f..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Archive_Archive.js.html +++ /dev/null @@ -1,296 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Archive prototype.
- 28  */
- 29 
- 30 Archive.PAGER = "page";
- 31 Archive.COLLECTION = "collection";
- 32 
- 33 /**
- 34  * @name Archive
- 35  * @constructor
- 36  * @param {Object} name
- 37  * @param {Object} type
- 38  * @param {Object} parent
- 39  * @property {Story[]} _children
- 40  * @property {String} name
- 41  * @property {String} parent
- 42  * @property {String} type
- 43  * @extends HopObject
- 44  */
- 45 Archive.prototype.constructor = function(name, type, parent) {
- 46    this.name = name;
- 47    this.type = type;
- 48    this.parent = parent;
- 49    return this;
- 50 }
- 51 
- 52 /**
- 53  * 
- 54  * @param {String} name
- 55  * @returns {HopObject}
- 56  */
- 57 Archive.prototype.getChildElement = function(name) {
- 58    if (name.startsWith(Archive.PAGER)) {
- 59       return new Archive(name, Archive.PAGER, this);
- 60    } else if (!isNaN(name)) {
- 61       return new Archive(name, Archive.COLLECTION, this);
- 62    }
- 63    return this.get(name);
- 64 }
- 65 
- 66 /**
- 67  * 
- 68  * @param {String} action
- 69  * @returns {Boolean}
- 70  */
- 71 Archive.prototype.getPermission = function(action) {
- 72    var site = res.handlers.site;
- 73    if (!site.getPermission("main") || site.archiveMode !== Site.PUBLIC) {
- 74       return false;
- 75    }
- 76    switch (action) {
- 77       case "main":
- 78       case "page1":
- 79       return true;
- 80       case "previous":
- 81       return this.getPage() > 1
- 82       case "next":
- 83       return this.getPage() < this.getSize() / this.getPageSize();
- 84    }
- 85    return false;
- 86 }
- 87 
- 88 Archive.prototype.main_action = function() {
- 89    var date = this.getDate();
- 90    var dateString = String.EMPTY;
- 91    switch (path.length - (this.type === Archive.PAGER ? 4 : 3)) {
- 92       case 1:
- 93       dateString = formatDate(date, "yyyy");
- 94       break;
- 95       case 2:
- 96       dateString = formatDate(date, "MMM yyyy");
- 97       break;
- 98       case 3:
- 99       var type = java.text.DateFormat.LONG;
-100       var locale = res.handlers.site.getLocale();
-101       var pattern = java.text.DateFormat.getDateInstance(type, locale).toPattern()
-102       dateString = formatDate(date, pattern);
-103       break;
-104    }
-105    var page = gettext("Page {0} of {1}", this.getPage(), 
-106             Math.ceil(this.getSize() / this.getPageSize()));
-107    res.data.title = gettext("Story Archive {0} ({1})", dateString, page);
-108    res.data.body = this.renderSkinAsString("Archive#main");
-109    res.handlers.site.renderSkin("Site#page");
-110    res.handlers.site.log();
-111    return;
-112 }
-113 
-114 Archive.prototype.page1_action = function() {
-115    return res.redirect(this.href());
-116 }
-117 
-118 /**
-119  * 
-120  * @param {String} action
-121  * @returns {String}
-122  */
-123 Archive.prototype.href = function(action) {
-124    var buffer = [];
-125    var archive = this;
-126    while (archive.parent) {
-127       buffer.push(archive.name);
-128       archive = archive.parent;
-129    }
-130    buffer.push(res.handlers.site.href("archive"));
-131    buffer.reverse();
-132    if (action) {
-133       if (this.type === Archive.PAGER) {
-134          buffer.pop();
-135       }
-136       buffer.push(action);
-137    }
-138    return buffer.join("/");
-139 }
-140 
-141 /**
-142  * 
-143  * @param {Object} param
-144  * @param {String} action
-145  * @param {String} text
-146  * @see renderLink
-147  */
-148 Archive.prototype.link_macro = function(param, action, text) {
-149    if (!this.getPermission(action)) {
-150       return;
-151    }
-152    switch (action) {
-153       case "previous":
-154       var page = this.getPage() - 1; break; 
-155       case "next":
-156       var page = this.getPage() + 1; break;
-157    }
-158    var action = "page" + page;
-159    return renderLink.call(global, param, action, text, this);
-160 }
-161 
-162 /**
-163  * 
-164  */
-165 Archive.prototype.stories_macro = function() {
-166    var day, storyDay; 
-167    var page = this.getPage();
-168    var pageSize = this.getPageSize();
-169   
-170    var renderStory = function(story) {
-171       storyDay = story.created.getDate();
-172       if (day !== storyDay) {
-173          story.renderSkin("Story#date");
-174          day = storyDay;
-175       }
-176       story.renderSkin("Story#preview");
-177       return;
-178    }
-179 
-180    // FIXME: This is a little bit inconsistent and thus needs special care
-181    var archive = this.type === Archive.PAGER ? this.parent : this;
-182    if (!archive.parent) {
-183       var site = res.handlers.site;
-184       var offset = (page - 1) * pageSize;
-185       var stories = site.stories.featured.list(offset, pageSize);
-186       for each (var story in stories) {
-187          renderStory(story);
-188       };
-189       return;
-190    }
-191 
-192    var sql = new Sql;
-193    sql.retrieve(Sql.ARCHIVE, res.handlers.site._id, this.getFilter(), 
-194          Sql.ARCHIVEORDER, pageSize, (page - 1) * pageSize);
-195    sql.traverse(function() {
-196       var story = Story.getById(this.id);
-197       renderStory(story);
-198    });
-199    return;
-200 }
-201 
-202 /**
-203  * @returns {Number}
-204  */
-205 Archive.prototype.getSize = function() {
-206    // FIXME: This is a little bit inconsistent and thus needs special care
-207    var archive = this.type === Archive.PAGER ? this.parent : this;
-208    if (!archive.parent) {
-209       return res.handlers.site.stories.featured.size();
-210    }
-211    var size;
-212    var sql = new Sql;
-213    sql.retrieve(Sql.ARCHIVESIZE, res.handlers.site._id, this.getFilter());
-214    sql.traverse(function() {
-215       size = this.count;
-216       return;
-217    });
-218    return size;
-219 }
-220 
-221 /**
-222  * @param {boolean} 
-223  * @returns {String}
-224  */
-225 Archive.prototype.getFilter = function() {
-226    var buffer = [];
-227    var archive = this;
-228    do {
-229       if (archive.type === Archive.COLLECTION) {
-230          buffer.unshift(Number(archive.name));
-231       }
-232    } while (archive = archive.parent);
-233    
-234    if (buffer.length < 0) {
-235       var now = new Date;
-236       buffer.push(now.getDate());
-237       buffer.push(now.getMonth() + 1);
-238       buffer.push(now.getFullYear());
-239    }
-240     
-241    res.push();
-242    var sql = new Sql;
-243    var keys = ["year", "month", "day"];
-244    for (var i in buffer) {
-245       sql.retrieve(Sql.ARCHIVEPART, keys[i], buffer[i]);
-246       res.write(sql);
-247    }
-248    return res.pop();
-249 }
-250 
-251 /**
-252  * @returns {Number}
-253  */
-254 Archive.prototype.getPage = function() {
-255    if (this.type === Archive.PAGER) {
-256       return Number(this.name.substr(4));
-257    }
-258    return 1;
-259 }
-260 
-261 /**
-262  * @returns {Number}
-263  */
-264 Archive.prototype.getPageSize = function() {
-265    return res.handlers.site.pageSize;
-266 }
-267 
-268 /**
-269  * @returns {Date}
-270  */
-271 Archive.prototype.getDate = function() {
-272    var date = new Date;
-273    var offset = path.contains(res.handlers.site.archive) + 1;
-274    if (offset > -1) {
-275       var archive;
-276       var buffer = [];
-277       for (var i=offset; i<path.length; i+=1) {
-278          archive = path[i];
-279          if (archive.type === Archive.COLLECTION) {
-280             buffer.push(Number(archive.name));
-281          }
-282       }
-283    }
-284    buffer[0] && date.setYear(buffer[0]);
-285    buffer[1] && date.setMonth(buffer[1] - 1);
-286    buffer[2] && date.setDate(buffer[2]);
-287    return date;
-288 }
-289 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Choice_Choice.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Choice_Choice.js.html deleted file mode 100644 index e0a6819d..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Choice_Choice.js.html +++ /dev/null @@ -1,123 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Choice prototype.
- 28  */
- 29 
- 30 markgettext("Choice");
- 31 markgettext("choice");
- 32 
- 33 /**
- 34  * 
- 35  */
- 36 Choice.add = function(title, poll) {
- 37    HopObject.confirmConstructor(Choice);
- 38    var choice = new Choice(title);
- 39    choice.created = choice.modified = new Date;
- 40    poll.add(choice);
- 41    return choice;
- 42 }
- 43  
- 44 /**
- 45  * 
- 46  */
- 47 Choice.remove = function() {
- 48    if (this.constructor === Choice) {
- 49       HopObject.remove.call(this);
- 50       this.remove();
- 51    }
- 52    return;
- 53 }
- 54 
- 55 /**
- 56  * @name Choice
- 57  * @constructor
- 58  * @param {String} title
- 59  * @property {Vote[]} _children
- 60  * @property {Date} created
- 61  * @property {Date} modified
- 62  * @property {Poll} poll
- 63  * @property {String} title
- 64  * @extends HopObject
- 65  */
- 66 Choice.prototype.constructor = function(title) {
- 67    HopObject.confirmConstructor.call(this);
- 68    this.title = title;
- 69    return this;
- 70 }
- 71 
- 72 /**
- 73  * 
- 74  */
- 75 Choice.prototype.selected_macro = function() {
- 76    var votes;
- 77    if (session.user && (votes = this._parent.votes.get(session.user.name))) {
- 78       res.write(this === votes.choice);
- 79    } else {
- 80       res.write(false);
- 81    }
- 82    return;
- 83 }
- 84 
- 85 /**
- 86  * 
- 87  * @param {Object} param
- 88  * @param {String} variant
- 89  */
- 90 Choice.prototype.votes_macro = function(param, variant) {
- 91    var votes = 0;
- 92    if (variant) {
- 93       if (variant.endsWith("%")) {
- 94          variant = parseInt(variant) || 1;
- 95          var max = this._parent.votes.size();
- 96          votes = this.size() / max * variant;
- 97       } else {
- 98          var max = 1;
- 99          this._parent.forEach(function() {
-100             var n = this.size();
-101             if (n > max) {
-102                max = n;
-103             }
-104             return;
-105          });
-106          votes = Math.round(this.size() / max * variant);
-107       }
-108    } else {
-109       votes = this.size();
-110    }
-111    if (!votes && param["default"]) {
-112       return param["default"];
-113    }
-114    return votes;
-115 }
-116 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Comment_Comment.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Comment_Comment.js.html deleted file mode 100644 index e77881da..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Comment_Comment.js.html +++ /dev/null @@ -1,288 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Comment prototype.
- 28  */
- 29 
- 30 markgettext("Comment");
- 31 markgettext("comment");
- 32 
- 33 /**
- 34  * @see defineConstants
- 35  */
- 36 Comment.getStatus = defineConstants(Comment, markgettext("deleted"), 
- 37       markgettext("pending"), markgettext("readonly"), markgettext("public"));
- 38 
- 39 /**
- 40  * Convenience method for easily adding a new comment to an existing story or comment.
- 41  * @param {Object} data
- 42  * @param {Story|Comment} parent The story or comment this comment belongs to.
- 43  * @returns {Comment}
- 44  */
- 45 Comment.add = function(data, parent) {
- 46    HopObject.confirmConstructor(Comment);
- 47    var story = parent.story || parent;
- 48    var comment = new Comment;
- 49    comment.name = String.EMPTY;
- 50    comment.site = parent.site;
- 51    comment.story = story;
- 52    comment.parent = parent;
- 53    comment.parent_type = parent._prototype; // FIXME: Set correct parent_type (Helma bug?)
- 54    comment.status = Story.PUBLIC;
- 55    comment.creator = comment.modifier = session.user;
- 56    comment.created = comment.modified = new Date;
- 57    comment.update(data);
- 58    story.comments.add(comment); // Force addition to aggressively cached collection
- 59    parent.add(comment);
- 60    return comment;
- 61 }
- 62 
- 63 /**
- 64  * @returns {String}
- 65  */
- 66 Comment.remove = function(options) {
- 67    if (this.constructor !== Comment) {
- 68       return;
- 69    }
- 70    // Remove all comments of this comment’s creator if corresponding option is set
- 71    if (options && options.mode === "user" && options.confirm === "1") {
- 72       var membership = Membership.getByName(this.creator.name, this.site);
- 73       // Not using HopObject.remove() because it will comepletely remove all comments
- 74       membership.comments.forEach(function() {
- 75          Comment.remove.call(this);
- 76       })
- 77    } else {
- 78       // Mark comment as deleted if not already done so or if there are child comments
- 79       if (this.size() > 0 && this.status !== Comment.DELETED) {
- 80          this.status = Comment.DELETED;
- 81          this.deleteMetadata();
- 82          this.touch();
- 83          return this.href();
- 84       }
- 85       // Completely remove comment and its children otherwise
- 86       while (this.size() > 0) {
- 87          Comment.remove.call(this.get(0));
- 88       }
- 89       // Explicitely remove comment from aggressively cached collections:
- 90       (this.parent || this).removeChild(this);
- 91       this.story.comments.removeChild(this);
- 92       this.deleteMetadata();
- 93       this.remove();
- 94    }
- 95    return this.parent.href();
- 96 }
- 97 
- 98 /**
- 99  * @name Comment
-100  * @constructor
-101  * @property {Comment[]} _children
-102  * @property {String} name
-103  * @property {Story|Comment} parent
-104  * @property {Story} story
-105  * @extends Story
-106  */
-107 Comment.prototype.constructor = function() {
-108    HopObject.confirmConstructor.call(this);
-109    return this;
-110 }
-111 
-112 /**
-113  * 
-114  * @param {Object} action
-115  * @returns {Boolean}
-116  */
-117 Comment.prototype.getPermission = function(action) {
-118    switch (action) {
-119       case ".":
-120       case "main":
-121       if (this.status === Comment.DELETED) {
-122          return false;
-123       }
-124       // Break statement missing here by purpose!
-125       case "comment":
-126       return this.site.commentMode === Site.ENABLED &&
-127             this.story.getPermission(action) && 
-128             this.status !== Comment.PENDING;
-129       case "delete":
-130       return this.story.getPermission.call(this, "delete");
-131       case "edit":
-132       return this.status !== Comment.DELETED &&
-133             this.story.getPermission.call(this, "delete");
-134    }
-135    return false;
-136 }
-137 
-138 /**
-139  * 
-140  * @param {Object} action
-141  * @returns {String}
-142  */
-143 Comment.prototype.href = function(action) {
-144    var buffer = [];
-145    switch (action) {
-146       case null:
-147       case undefined:
-148       case "":
-149       case ".":
-150       case "main":
-151       buffer.push(this.story.href(), "#", this._id);
-152       break;
-153       default:
-154       buffer.push(this.story.comments.href(), this._id, "/", action);
-155    }
-156    return buffer.join(String.EMPTY);
-157 }
-158 
-159 Comment.prototype.edit_action = function() {
-160    if (req.postParams.save) {
-161       try {
-162          this.update(req.postParams);
-163          delete session.data.backup;
-164          res.message = gettext("The comment was successfully updated.");;
-165          res.redirect(this.story.href() + "#" + this._id);
-166       } catch (ex) {
-167          res.message = ex;
-168          app.log(ex);
-169       }
-170    }
-171    
-172    res.handlers.parent = this.parent;
-173    res.data.action = this.href(req.action);
-174    res.data.title = gettext("Edit Comment");
-175    res.data.body = this.renderSkinAsString("Comment#edit");
-176    this.site.renderSkin("Site#page");
-177    return;
-178 }
-179 
-180 /**
-181  * 
-182  * @param {Object} data
-183  */
-184 Comment.prototype.update = function(data) {
-185    if (!data.title && !data.text) {
-186       throw Error(gettext("Please enter at least something into the “title” or “text” field."));
-187    }
-188    // Get difference to current content before applying changes
-189    var delta = this.getDelta(data);
-190    this.title = data.title;
-191    this.text = data.text;
-192    this.setMetadata(data);
-193 
-194    if (this.story.commentMode === Story.MODERATED) {
-195       this.status = Comment.PENDING;
-196    } else if (delta > 50) {
-197       this.modified = new Date;
-198       if (this.story.status !== Story.CLOSED) { 
-199          this.site.modified = this.modified;
-200       }
-201       // We need persistence for adding the callback
-202       this.isTransient() && this.persist();
-203       res.handlers.site.callback(this);
-204       // Notification is sent in Story.comment_action()
-205    }
-206    this.clearCache();
-207    this.modifier = session.user;
-208    return;
-209 }
-210 
-211 /**
-212  * @returns {String}
-213  */
-214 Comment.prototype.getConfirmText = function() {
-215    var size = this.size() + 1;
-216    if (this.status === Comment.DELETED && size > 1) {
-217       return gettext("You are about to delete a comment thread consisting of {0} postings.",
-218             size);
-219    }
-220    return gettext("You are about to delete a comment by user {0}.", 
-221          this.creator.name);
-222 }
-223 
-224 /**
-225  * 
-226  * @param {String} name
-227  * @returns {HopObject} 
-228  */
-229 Comment.prototype.getMacroHandler = function(name) {
-230    if (name === "related") {
-231       var membership = Membership.getByName(this.creator.name, this.site);
-232       if (!membership || membership.comments.size() < 2 || this.status === Comment.DELETED) {
-233          return {}; // Work-around for issue 88
-234       }
-235       return membership.comments;
-236    }
-237    return null;
-238 }
-239 
-240 /**
-241  * 
-242  */
-243 Comment.prototype.text_macro = function() {
-244    if (this.status === Comment.DELETED) {
-245       res.write("<em>");
-246       res.write(this.modifier === this.creator ? 
-247             gettext("This comment was removed by the author.") : 
-248             gettext("This comment was removed."));
-249       res.writeln("</em>");
-250    } else {
-251       res.write(this.text);
-252    }
-253    return;
-254 }
-255 
-256 /**
-257  *
-258  */
-259 Comment.prototype.creator_macro = function() {
-260    return this.status === Comment.DELETED ? null :
-261          HopObject.prototype.creator_macro.apply(this, arguments);
-262 }
-263 
-264 /**
-265  * 
-266  */
-267 Comment.prototype.modifier_macro = function() {
-268    return this.status === Comment.DELETED ? null :
-269          HopObject.prototype.modifier_macro.apply(this, arguments);
-270 }
-271 
-272 /**
-273  * 
-274  * @param {Object} param
-275  * @param {Object} action
-276  * @param {Object} text
-277  */
-278 Comment.prototype.link_macro = function(param, action, text) {
-279    return HopObject.prototype.link_macro.call(this, param, action, text);
-280 }
-281 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_File_File.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_File_File.js.html deleted file mode 100644 index e8e2a56e..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_File_File.js.html +++ /dev/null @@ -1,305 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Comment prototype.
- 28  */
- 29 
- 30 markgettext("File");
- 31 markgettext("file");
- 32 
- 33 this.handleMetadata("url");
- 34 this.handleMetadata("description");
- 35 this.handleMetadata("contentType");
- 36 this.handleMetadata("contentLength");
- 37 this.handleMetadata("fileName");
- 38 
- 39 /**
- 40  * @param {Object} data
- 41  * @param {Site} site
- 42  * @param {User} user
- 43  * @returns {File}
- 44  */
- 45 File.add = function(data, site, user) {
- 46    site || (site = res.handlers.site);
- 47    user || (user = session.user);
- 48    var file = new File;
- 49    file.site = site;
- 50    file.requests = 0;
- 51    file.creator = file.modifier = user;
- 52    file.created = file.modified = new Date;
- 53    file.update(data);
- 54    site.files.add(file);
- 55    return file;
- 56 }
- 57 
- 58 /**
- 59  * 
- 60  */
- 61 File.remove = function() {
- 62    if (this.constructor === File) {
- 63       this.getFile().remove();
- 64       this.deleteMetadata();
- 65       this.remove();
- 66    }
- 67    return;
- 68 }
- 69 
- 70 /**
- 71  * 
- 72  * @param {String} name
- 73  */
- 74 File.getName = function(name) {
- 75    if (name) {
- 76       //return name.replace(/[^\w\d\s._-]/g, String.EMPTY);
- 77       return String(name).trim().replace(/[\/\\:;?+\[\]{}|#"`<>^]/g, String.EMPTY);
- 78    }
- 79    return null;
- 80 }
- 81 
- 82 /**
- 83  *
- 84  * @param {String } url
- 85  */
- 86 File.redirectOnUploadError = function(url) {
- 87    if (req.data.helma_upload_error) {
- 88       res.message = gettext("Sorry, the file exceeds the maximum upload limit of {0} kB.",
- 89             formatNumber(app.appsProperties.uploadLimit));
- 90       res.redirect(url);
- 91    }
- 92    return;
- 93 }
- 94 
- 95 /**
- 96  *
- 97  * @param {String} url
- 98  */
- 99 File.redirectOnExceededQuota = function(url) {
-100    if (res.handlers.site.getDiskSpace() < 0) {
-101       res.message = gettext("Sorry, there is no disk space left. Please try to delete some files or images first.");
-102       res.redirect(url);
-103    }
-104    return;
-105 }
-106 
-107 /**
-108  * @name File
-109  * @constructor
-110  * @property {Date} created
-111  * @property {User} creator
-112  * @property {Metadata} metadata
-113  * @property {Date} modified
-114  * @property {User} modifier
-115  * @property {String} name
-116  * @property {Number} parent_id
-117  * @property {String} parent_type
-118  * @property {String} prototype
-119  * @property {Number} requests
-120  * @property {Site} site
-121  * @extends HopObject
-122  */
-123 File.prototype.constructor = function() {
-124    return this;
-125 }
-126 
-127 /**
-128  * 
-129  * @param {String} action
-130  * @return {Boolean}
-131  */
-132 File.prototype.getPermission = function(action) {
-133    switch (action) {
-134       case ".":
-135       case "main":
-136       return true;
-137       case "delete":
-138       case "edit":
-139       return this._parent.getPermission("main") &&
-140             this.creator === session.user || 
-141             Membership.require(Membership.MANAGER) ||
-142             User.require(User.PRIVILEGED);            
-143    }
-144    return false;
-145 }
-146 
-147 File.prototype.main_action = function() {
-148    if (Membership.require(Membership.SUBSCRIBER) &&
-149          User.require(User.REGULAR)) {
-150       this.requests += 1;
-151    }
-152    return res.redirect(this.getUrl());
-153 }
-154 
-155 File.prototype.edit_action = function() {
-156    File.redirectOnUploadError(this.href(req.action));
-157 
-158    if (req.postParams.save) {
-159       try {
-160          File.redirectOnExceededQuota(this.href(req.action));
-161          this.update(req.postParams);
-162          res.message = gettext("The changes were saved successfully.");
-163          res.redirect(this._parent.href());
-164       } catch (ex) {
-165          res.message = ex;
-166          app.log(ex);
-167       }
-168    }
-169    
-170    res.data.action = this.href(req.action);
-171    res.data.title = gettext("Edit File");
-172    res.data.body = this.renderSkinAsString("$File#edit");
-173    return this.site.renderSkin("Site#page");
-174 }
-175 
-176 /**
-177  * 
-178  * @param {String} name
-179  * @returns {Object}
-180  */
-181 File.prototype.getFormValue = function(name) {
-182    var self = this;
-183    
-184    var getOrigin = function(str) {
-185       var origin = req.postParams.file_origin || self.origin;
-186       if (origin && origin.contains("://")) {
-187          return origin;
-188       }
-189       return null;
-190    }
-191    
-192    if (req.isPost()) {
-193       if (name === "file") {
-194          return getOrigin();
-195       }
-196       return req.postParams[name];
-197    }
-198    switch (name) {
-199       case "file":
-200       return getOrigin();
-201    }
-202    return this[name];
-203 }
-204 
-205 /**
-206  * 
-207  * @param {Object} data
-208  */
-209 File.prototype.update = function(data) {
-210    if (data.uploadError) {
-211       app.log(data.uploadError);
-212       // Looks like the file uploaded has exceeded the upload limit ...
-213       throw Error(gettext("File size is exceeding the upload limit."));
-214    }
-215       
-216    if (!data.file_origin) {
-217       if (this.isTransient()) { 
-218          throw Error(gettext("There was nothing to upload. Please be sure to choose a file."));
-219       }
-220    } else if (data.file_origin !== this.origin) {
-221       var mime = data.file;
-222       if (mime.contentLength < 1) {
-223          mime = getURL(data.file_origin);
-224          if (!mime) {
-225             throw Error(gettext("Could not fetch the file from the given URL."));
-226          }
-227       }
-228 
-229       this.origin = data.file_origin;
-230       var mimeName = mime.normalizeFilename(mime.name);
-231       this.contentLength = mime.contentLength;
-232       this.contentType = mime.contentType;
-233       
-234       if (!this.name) {
-235           var name = File.getName(data.name) || mimeName.split(".")[0];
-236           this.name = this.site.files.getAccessName(name);
-237       }
-238 
-239       // Make the file persistent before proceeding with writing 
-240       // it to disk (also see Helma bug #607)
-241       this.isTransient() && this.persist();
-242 
-243       var extension = mimeName.substr(mimeName.lastIndexOf(".")) || String.EMPTY;
-244       var fileName = this.name + extension;
-245       if (fileName !== this.fileName) {
-246          // Remove existing file if the file name has changed
-247          this.getFile().remove();
-248       }
-249       this.fileName = fileName;
-250       var file = this.getFile();
-251       mime.writeToFile(file.getParent(), file.getName());
-252    }
-253       
-254    // FIXME: one day? 
-255    //this.setTags(data.tags || data.tag_array); 
-256    this.description = data.description;
-257    this.touch();
-258    return;
-259 }
-260 
-261 /**
-262  * 
-263  */
-264 File.prototype.url_macro = function() {
-265    return res.write(this.url || this.getUrl());
-266 }
-267 
-268 /**
-269  * 
-270  * @param {Object} param
-271  */
-272 File.prototype.contentLength_macro = function(param) {
-273    return res.write((this.contentLength / 1024).format("###,###") + " KB");
-274 }
-275 
-276 /**
-277  * 
-278  */
-279 File.prototype.getFile = function() {
-280    var site = this.site || res.handlers.site;
-281    return site.getStaticFile("files/" + this.fileName);
-282 }
-283 
-284 /**
-285  * 
-286  */
-287 File.prototype.getUrl = function() {
-288    var site = this.site || res.handlers.site;
-289    return site.getStaticUrl("files/" + this.fileName);
-290 }
-291 
-292 /**
-293  * @returns {String}
-294  */
-295 File.prototype.getConfirmText = function() {
-296    return gettext("You are about to delete the file {0}.", this.name);
-297 }
-298 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Files_Files.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Files_Files.js.html deleted file mode 100644 index 8714d2fb..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Files_Files.js.html +++ /dev/null @@ -1,113 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Comment prototype.
- 28  */
- 29 
- 30 markgettext("Files");
- 31 markgettext("files");
- 32 
- 33 /**
- 34  * @name Files
- 35  * @constructor
- 36  * @extends HopObject
- 37  */
- 38 
- 39 /**
- 40  * 
- 41  * @param {String} action
- 42  * @returns {Boolean}
- 43  */
- 44 Files.prototype.getPermission = function(action) {
- 45    if (!this._parent.getPermission("main")) {
- 46       return false;
- 47    }
- 48    switch (action) {
- 49       case ".":
- 50       case "main":
- 51       case "create":
- 52       return Site.require(Site.OPEN) && session.user ||
- 53             Membership.require(Membership.CONTRIBUTOR) ||
- 54             User.require(User.PRIVILEGED);
- 55       case "all":
- 56       return Membership.require(Membership.MANAGER) ||
- 57             User.require(User.PRIVILEGED);
- 58    }
- 59    return false;
- 60 }
- 61 
- 62 Files.prototype.create_action = function() {
- 63    File.redirectOnUploadError(this.href(req.action));
- 64    File.redirectOnExceededQuota(this.href());
- 65 
- 66    if (req.postParams.save) {
- 67       try {
- 68          var file = File.add(req.postParams);
- 69          file.notify(req.action);
- 70          res.message = gettext('The file was successfully added.');
- 71          res.redirect(this.href());
- 72       } catch (ex) {
- 73          res.message = ex;
- 74          app.log(ex);
- 75       }
- 76    }
- 77    
- 78    res.data.action = this.href(req.action);
- 79    res.data.title = gettext("Add File");
- 80    HopObject.confirmConstructor(File);
- 81    res.data.body = (new File).renderSkinAsString("$File#edit");
- 82    this._parent.renderSkin("Site#page");
- 83    return;
- 84 }
- 85 
- 86 Files.prototype.main_action = function() {
- 87    var files = User.getMembership().files;
- 88    res.data.list = renderList(files, "$File#listItem", 10, req.queryParams.page);
- 89    res.data.pager = renderPager(files, this.href(), 
- 90          10, req.queryParams.page);
- 91    res.data.title = gettext("Member Files");
- 92    res.data.body = this.renderSkinAsString("$Files#main");
- 93    this._parent.renderSkin("Site#page");
- 94    return;
- 95 }
- 96 
- 97 Files.prototype.all_action = function() {
- 98    res.data.list = renderList(this, "$File#listItem", 10, req.queryParams.page);
- 99    res.data.pager = renderPager(this, 
-100          this.href(req.action), 10, req.queryParams.page);
-101    res.data.title = gettext("All Files");
-102    res.data.body = this.renderSkinAsString("$Files#main");
-103    this._parent.renderSkin("Site#page");
-104    return;
-105 }
-106 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_5.less-helma-1.3.0.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_5.less-helma-1.3.0.js.html deleted file mode 100644 index 566c9a7e..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_5.less-helma-1.3.0.js.html +++ /dev/null @@ -1,3226 +0,0 @@ -
  1 (function() {
-  2 //
-  3 // Stub out `require` in rhino
-  4 //
-  5 function require(arg) {
-  6     return less[arg.split('/')[1]];
-  7 };
-  8 
-  9 
- 10 // ecma-5.js
- 11 //
- 12 // -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License
- 13 // -- tlrobinson Tom Robinson
- 14 // dantman Daniel Friesen
- 15 
- 16 //
- 17 // Array
- 18 //
- 19 if (!Array.isArray) {
- 20     Array.isArray = function(obj) {
- 21         return Object.prototype.toString.call(obj) === "[object Array]" ||
- 22                (obj instanceof Array);
- 23     };
- 24 }
- 25 if (!Array.prototype.forEach) {
- 26     Array.prototype.forEach =  function(block, thisObject) {
- 27         var len = this.length >>> 0;
- 28         for (var i = 0; i < len; i++) {
- 29             if (i in this) {
- 30                 block.call(thisObject, this[i], i, this);
- 31             }
- 32         }
- 33     };
- 34 }
- 35 if (!Array.prototype.map) {
- 36     Array.prototype.map = function(fun /*, thisp*/) {
- 37         var len = this.length >>> 0;
- 38         var res = new Array(len);
- 39         var thisp = arguments[1];
- 40 
- 41         for (var i = 0; i < len; i++) {
- 42             if (i in this) {
- 43                 res[i] = fun.call(thisp, this[i], i, this);
- 44             }
- 45         }
- 46         return res;
- 47     };
- 48 }
- 49 if (!Array.prototype.filter) {
- 50     Array.prototype.filter = function (block /*, thisp */) {
- 51         var values = [];
- 52         var thisp = arguments[1];
- 53         for (var i = 0; i < this.length; i++) {
- 54             if (block.call(thisp, this[i])) {
- 55                 values.push(this[i]);
- 56             }
- 57         }
- 58         return values;
- 59     };
- 60 }
- 61 if (!Array.prototype.reduce) {
- 62     Array.prototype.reduce = function(fun /*, initial*/) {
- 63         var len = this.length >>> 0;
- 64         var i = 0;
- 65 
- 66         // no value to return if no initial value and an empty array
- 67         if (len === 0 && arguments.length === 1) throw new TypeError();
- 68 
- 69         if (arguments.length >= 2) {
- 70             var rv = arguments[1];
- 71         } else {
- 72             do {
- 73                 if (i in this) {
- 74                     rv = this[i++];
- 75                     break;
- 76                 }
- 77                 // if array contains no values, no initial value to return
- 78                 if (++i >= len) throw new TypeError();
- 79             } while (true);
- 80         }
- 81         for (; i < len; i++) {
- 82             if (i in this) {
- 83                 rv = fun.call(null, rv, this[i], i, this);
- 84             }
- 85         }
- 86         return rv;
- 87     };
- 88 }
- 89 if (!Array.prototype.indexOf) {
- 90     Array.prototype.indexOf = function (value /*, fromIndex */ ) {
- 91         var length = this.length;
- 92         var i = arguments[1] || 0;
- 93 
- 94         if (!length)     return -1;
- 95         if (i >= length) return -1;
- 96         if (i < 0)       i += length;
- 97 
- 98         for (; i < length; i++) {
- 99             if (!Object.prototype.hasOwnProperty.call(this, i)) { continue }
-100             if (value === this[i]) return i;
-101         }
-102         return -1;
-103     };
-104 }
-105 
-106 //
-107 // Object
-108 //
-109 if (!Object.keys) {
-110     Object.keys = function (object) {
-111         var keys = [];
-112         for (var name in object) {
-113             if (Object.prototype.hasOwnProperty.call(object, name)) {
-114                 keys.push(name);
-115             }
-116         }
-117         return keys;
-118     };
-119 }
-120 
-121 //
-122 // String
-123 //
-124 if (!String.prototype.trim) {
-125     String.prototype.trim = function () {
-126         return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
-127     };
-128 }
-129 var less, tree;
-130 
-131 if (typeof HopObject === 'function') {
-132     // Helma
-133     // Fully qualified condition would be helma.main.Server.getServer() === 'string'
-134     less = global.less = {}
-135     tree = less.tree = {}
-136     less.mode = 'rhino';
-137 } else if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") {
-138     // Rhino
-139     // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88
-140     if (typeof(window) === 'undefined') { less = {} }
-141     else                                { less = window.less = {} }
-142     tree = less.tree = {};
-143     less.mode = 'rhino';
-144 } else if (typeof(window) === 'undefined') {
-145     // Node.js
-146     less = exports,
-147     tree = require('./tree');
-148     less.mode = 'node';
-149 } else {
-150     // Browser
-151     if (typeof(window.less) === 'undefined') { window.less = {} }
-152     less = window.less,
-153     tree = window.less.tree = {};
-154     less.mode = 'browser';
-155 }
-156 //
-157 // less.js - parser
-158 //
-159 //    A relatively straight-forward predictive parser.
-160 //    There is no tokenization/lexing stage, the input is parsed
-161 //    in one sweep.
-162 //
-163 //    To make the parser fast enough to run in the browser, several
-164 //    optimization had to be made:
-165 //
-166 //    - Matching and slicing on a huge input is often cause of slowdowns.
-167 //      The solution is to chunkify the input into smaller strings.
-168 //      The chunks are stored in the `chunks` var,
-169 //      `j` holds the current chunk index, and `current` holds
-170 //      the index of the current chunk in relation to `input`.
-171 //      This gives us an almost 4x speed-up.
-172 //
-173 //    - In many cases, we don't need to match individual tokens;
-174 //      for example, if a value doesn't hold any variables, operations
-175 //      or dynamic references, the parser can effectively 'skip' it,
-176 //      treating it as a literal.
-177 //      An example would be '1px solid #000' - which evaluates to itself,
-178 //      we don't need to know what the individual components are.
-179 //      The drawback, of course is that you don't get the benefits of
-180 //      syntax-checking on the CSS. This gives us a 50% speed-up in the parser,
-181 //      and a smaller speed-up in the code-gen.
-182 //
-183 //
-184 //    Token matching is done with the `$` function, which either takes
-185 //    a terminal string or regexp, or a non-terminal function to call.
-186 //    It also takes care of moving all the indices forwards.
-187 //
-188 //
-189 less.Parser = function Parser(env) {
-190     var input,       // LeSS input string
-191         i,           // current index in `input`
-192         j,           // current chunk
-193         temp,        // temporarily holds a chunk's state, for backtracking
-194         memo,        // temporarily holds `i`, when backtracking
-195         furthest,    // furthest index the parser has gone to
-196         chunks,      // chunkified input
-197         current,     // index of current chunk, in `input`
-198         parser;
-199 
-200     var that = this;
-201 
-202     // This function is called after all files
-203     // have been imported through `@import`.
-204     var finish = function () {};
-205 
-206     var imports = this.imports = {
-207         paths: env && env.paths || [],  // Search paths, when importing
-208         queue: [],                      // Files which haven't been imported yet
-209         files: {},                      // Holds the imported parse trees
-210         contents: {},                   // Holds the imported file contents
-211         mime:  env && env.mime,         // MIME type of .less files
-212         error: null,                    // Error in parsing/evaluating an import
-213         push: function (path, callback) {
-214             var that = this;
-215             this.queue.push(path);
-216 
-217             //
-218             // Import a file asynchronously
-219             //
-220             less.Parser.importer(path, this.paths, function (e, root, contents) {
-221                 that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue
-222 
-223                 var imported = path in that.files;
-224 
-225                 that.files[path] = root;                        // Store the root
-226                 that.contents[path] = contents;
-227 
-228                 if (e && !that.error) { that.error = e }
-229 
-230                 callback(e, root, imported);
-231 
-232                 if (that.queue.length === 0) { finish() }       // Call `finish` if we're done importing
-233             }, env);
-234         }
-235     };
-236 
-237     function save()    { temp = chunks[j], memo = i, current = i }
-238     function restore() { chunks[j] = temp, i = memo, current = i }
-239 
-240     function sync() {
-241         if (i > current) {
-242             chunks[j] = chunks[j].slice(i - current);
-243             current = i;
-244         }
-245     }
-246     //
-247     // Parse from a token, regexp or string, and move forward if match
-248     //
-249     function $(tok) {
-250         var match, args, length, c, index, endIndex, k, mem;
-251 
-252         //
-253         // Non-terminal
-254         //
-255         if (tok instanceof Function) {
-256             return tok.call(parser.parsers);
-257         //
-258         // Terminal
-259         //
-260         //     Either match a single character in the input,
-261         //     or match a regexp in the current chunk (chunk[j]).
-262         //
-263         } else if (typeof(tok) === 'string') {
-264             match = input.charAt(i) === tok ? tok : null;
-265             length = 1;
-266             sync ();
-267         } else {
-268             sync ();
-269 
-270             if (match = tok.exec(chunks[j])) {
-271                 length = match[0].length;
-272             } else {
-273                 return null;
-274             }
-275         }
-276 
-277         // The match is confirmed, add the match length to `i`,
-278         // and consume any extra white-space characters (' ' || '\n')
-279         // which come after that. The reason for this is that LeSS's
-280         // grammar is mostly white-space insensitive.
-281         //
-282         if (match) {
-283             mem = i += length;
-284             endIndex = i + chunks[j].length - length;
-285 
-286             while (i < endIndex) {
-287                 c = input.charCodeAt(i);
-288                 if (! (c === 32 || c === 10 || c === 9)) { break }
-289                 i++;
-290             }
-291             chunks[j] = chunks[j].slice(length + (i - mem));
-292             current = i;
-293 
-294             if (chunks[j].length === 0 && j < chunks.length - 1) { j++ }
-295 
-296             if(typeof(match) === 'string') {
-297                 return match;
-298             } else {
-299                 return match.length === 1 ? match[0] : match;
-300             }
-301         }
-302     }
-303 
-304     function expect(arg, msg) {
-305         var result = $(arg);
-306         if (! result) {
-307             error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'"
-308                                                    : "unexpected token"));
-309         } else {
-310             return result;
-311         }
-312     }
-313 
-314     function error(msg, type) {
-315         throw { index: i, type: type || 'Syntax', message: msg };
-316     }
-317 
-318     // Same as $(), but don't change the state of the parser,
-319     // just return the match.
-320     function peek(tok) {
-321         if (typeof(tok) === 'string') {
-322             return input.charAt(i) === tok;
-323         } else {
-324             if (tok.test(chunks[j])) {
-325                 return true;
-326             } else {
-327                 return false;
-328             }
-329         }
-330     }
-331 
-332     function basename(pathname) {
-333         if (less.mode === 'node') {
-334             return require('path').basename(pathname);
-335         } else {
-336             return pathname.match(/[^\/]+$/)[0];
-337         }
-338     }
-339 
-340     function getInput(e, env) {
-341         if (e.filename && env.filename && (e.filename !== env.filename)) {
-342             return parser.imports.contents[basename(e.filename)];
-343         } else {
-344             return input;
-345         }
-346     }
-347 
-348     function getLocation(index, input) {
-349         for (var n = index, column = -1;
-350                  n >= 0 && input.charAt(n) !== '\n';
-351                  n--) { column++ }
-352 
-353         return { line:   typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null,
-354                  column: column };
-355     }
-356 
-357     function LessError(e, env) {
-358         var input = getInput(e, env),
-359             loc = getLocation(e.index, input),
-360             line = loc.line,
-361             col  = loc.column,
-362             lines = input.split('\n');
-363 
-364         this.type = e.type || 'Syntax';
-365         this.message = e.message;
-366         this.filename = e.filename || env.filename;
-367         this.index = e.index;
-368         this.line = typeof(line) === 'number' ? line + 1 : null;
-369         this.callLine = e.call && (getLocation(e.call, input).line + 1);
-370         this.callExtract = lines[getLocation(e.call, input).line];
-371         this.stack = e.stack;
-372         this.column = col;
-373         this.extract = [
-374             lines[line - 1],
-375             lines[line],
-376             lines[line + 1]
-377         ];
-378     }
-379 
-380     this.env = env = env || {};
-381 
-382     // The optimization level dictates the thoroughness of the parser,
-383     // the lower the number, the less nodes it will create in the tree.
-384     // This could matter for debugging, or if you want to access
-385     // the individual nodes in the tree.
-386     this.optimization = ('optimization' in this.env) ? this.env.optimization : 1;
-387 
-388     this.env.filename = this.env.filename || null;
-389 
-390     //
-391     // The Parser
-392     //
-393     return parser = {
-394 
-395         imports: imports,
-396         //
-397         // Parse an input string into an abstract syntax tree,
-398         // call `callback` when done.
-399         //
-400         parse: function (str, callback) {
-401             var root, start, end, zone, line, lines, buff = [], c, error = null;
-402 
-403             i = j = current = furthest = 0;
-404             input = str.replace(/\r\n/g, '\n');
-405 
-406             // Split the input into chunks.
-407             chunks = (function (chunks) {
-408                 var j = 0,
-409                     skip = /[^"'`\{\}\/\(\)\\]+/g,
-410                     comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,
-411                     string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g,
-412                     level = 0,
-413                     match,
-414                     chunk = chunks[0],
-415                     inParam;
-416 
-417                 for (var i = 0, c, cc; i < input.length; i++) {
-418                     skip.lastIndex = i;
-419                     if (match = skip.exec(input)) {
-420                         if (match.index === i) {
-421                             i += match[0].length;
-422                             chunk.push(match[0]);
-423                         }
-424                     }
-425                     c = input.charAt(i);
-426                     comment.lastIndex = string.lastIndex = i;
-427 
-428                     if (match = string.exec(input)) {
-429                         if (match.index === i) {
-430                             i += match[0].length;
-431                             chunk.push(match[0]);
-432                             c = input.charAt(i);
-433                         }
-434                     }
-435 
-436                     if (!inParam && c === '/') {
-437                         cc = input.charAt(i + 1);
-438                         if (cc === '/' || cc === '*') {
-439                             if (match = comment.exec(input)) {
-440                                 if (match.index === i) {
-441                                     i += match[0].length;
-442                                     chunk.push(match[0]);
-443                                     c = input.charAt(i);
-444                                 }
-445                             }
-446                         }
-447                     }
-448 
-449                     switch (c) {
-450                         case '{': if (! inParam) { level ++;        chunk.push(c);                           break }
-451                         case '}': if (! inParam) { level --;        chunk.push(c); chunks[++j] = chunk = []; break }
-452                         case '(': if (! inParam) { inParam = true;  chunk.push(c);                           break }
-453                         case ')': if (  inParam) { inParam = false; chunk.push(c);                           break }
-454                         default:                                    chunk.push(c);
-455                     }
-456                 }
-457                 if (level > 0) {
-458                     error = new(LessError)({
-459                         index: i,
-460                         type: 'Parse',
-461                         message: "missing closing `}`",
-462                         filename: env.filename
-463                     }, env);
-464                 }
-465 
-466                 return chunks.map(function (c) { return c.join('') });;
-467             })([[]]);
-468 
-469             if (error) {
-470                 return callback(error);
-471             }
-472 
-473             // Start with the primary rule.
-474             // The whole syntax tree is held under a Ruleset node,
-475             // with the `root` property set to true, so no `{}` are
-476             // output. The callback is called when the input is parsed.
-477             try {
-478                 root = new(tree.Ruleset)([], $(this.parsers.primary));
-479                 root.root = true;
-480             } catch (e) {
-481                 return callback(new(LessError)(e, env));
-482             }
-483 
-484             root.toCSS = (function (evaluate) {
-485                 var line, lines, column;
-486 
-487                 return function (options, variables) {
-488                     var frames = [], importError;
-489 
-490                     options = options || {};
-491                     //
-492                     // Allows setting variables with a hash, so:
-493                     //
-494                     //   `{ color: new(tree.Color)('#f01') }` will become:
-495                     //
-496                     //   new(tree.Rule)('@color',
-497                     //     new(tree.Value)([
-498                     //       new(tree.Expression)([
-499                     //         new(tree.Color)('#f01')
-500                     //       ])
-501                     //     ])
-502                     //   )
-503                     //
-504                     if (typeof(variables) === 'object' && !Array.isArray(variables)) {
-505                         variables = Object.keys(variables).map(function (k) {
-506                             var value = variables[k];
-507 
-508                             if (! (value instanceof tree.Value)) {
-509                                 if (! (value instanceof tree.Expression)) {
-510                                     value = new(tree.Expression)([value]);
-511                                 }
-512                                 value = new(tree.Value)([value]);
-513                             }
-514                             return new(tree.Rule)('@' + k, value, false, 0);
-515                         });
-516                         frames = [new(tree.Ruleset)(null, variables)];
-517                     }
-518 
-519                     try {
-520                         var css = evaluate.call(this, { frames: frames })
-521                                           .toCSS([], { compress: options.compress || false });
-522                     } catch (e) {
-523                         throw new(LessError)(e, env);
-524                     }
-525 
-526                     if ((importError = parser.imports.error)) { // Check if there was an error during importing
-527                         if (importError instanceof LessError) throw importError;
-528                         else                                  throw new(LessError)(importError, env);
-529                     }
-530 
-531                     if (options.yuicompress && less.mode === 'node') {
-532                         return require('./cssmin').compressor.cssmin(css);
-533                     } else if (options.compress) {
-534                         return css.replace(/(\s)+/g, "$1");
-535                     } else {
-536                         return css;
-537                     }
-538                 };
-539             })(root.eval);
-540 
-541             // If `i` is smaller than the `input.length - 1`,
-542             // it means the parser wasn't able to parse the whole
-543             // string, so we've got a parsing error.
-544             //
-545             // We try to extract a \n delimited string,
-546             // showing the line where the parse error occured.
-547             // We split it up into two parts (the part which parsed,
-548             // and the part which didn't), so we can color them differently.
-549             if (i < input.length - 1) {
-550                 i = furthest;
-551                 lines = input.split('\n');
-552                 line = (input.slice(0, i).match(/\n/g) || "").length + 1;
-553 
-554                 for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ }
-555 
-556                 error = {
-557                     type: "Parse",
-558                     message: "Syntax Error on line " + line,
-559                     index: i,
-560                     filename: env.filename,
-561                     line: line,
-562                     column: column,
-563                     extract: [
-564                         lines[line - 2],
-565                         lines[line - 1],
-566                         lines[line]
-567                     ]
-568                 };
-569             }
-570 
-571             if (this.imports.queue.length > 0) {
-572                 finish = function () { callback(error, root) };
-573             } else {
-574                 callback(error, root);
-575             }
-576         },
-577 
-578         //
-579         // Here in, the parsing rules/functions
-580         //
-581         // The basic structure of the syntax tree generated is as follows:
-582         //
-583         //   Ruleset ->  Rule -> Value -> Expression -> Entity
-584         //
-585         // Here's some LESS code:
-586         //
-587         //    .class {
-588         //      color: #fff;
-589         //      border: 1px solid #000;
-590         //      width: @w + 4px;
-591         //      > .child {...}
-592         //    }
-593         //
-594         // And here's what the parse tree might look like:
-595         //
-596         //     Ruleset (Selector '.class', [
-597         //         Rule ("color",  Value ([Expression [Color #fff]]))
-598         //         Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]]))
-599         //         Rule ("width",  Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]]))
-600         //         Ruleset (Selector [Element '>', '.child'], [...])
-601         //     ])
-602         //
-603         //  In general, most rules will try to parse a token with the `$()` function, and if the return
-604         //  value is truly, will return a new node, of the relevant type. Sometimes, we need to check
-605         //  first, before parsing, that's when we use `peek()`.
-606         //
-607         parsers: {
-608             //
-609             // The `primary` rule is the *entry* and *exit* point of the parser.
-610             // The rules here can appear at any level of the parse tree.
-611             //
-612             // The recursive nature of the grammar is an interplay between the `block`
-613             // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,
-614             // as represented by this simplified grammar:
-615             //
-616             //     primary  →  (ruleset | rule)+
-617             //     ruleset  →  selector+ block
-618             //     block    →  '{' primary '}'
-619             //
-620             // Only at one point is the primary rule not called from the
-621             // block rule: at the root level.
-622             //
-623             primary: function () {
-624                 var node, root = [];
-625 
-626                 while ((node = $(this.mixin.definition) || $(this.rule)    ||  $(this.ruleset) ||
-627                                $(this.mixin.call)       || $(this.comment) ||  $(this.directive))
-628                                || $(/^[\s\n]+/)) {
-629                     node && root.push(node);
-630                 }
-631                 return root;
-632             },
-633 
-634             // We create a Comment node for CSS comments `/* */`,
-635             // but keep the LeSS comments `//` silent, by just skipping
-636             // over them.
-637             comment: function () {
-638                 var comment;
-639 
-640                 if (input.charAt(i) !== '/') return;
-641 
-642                 if (input.charAt(i + 1) === '/') {
-643                     return new(tree.Comment)($(/^\/\/.*/), true);
-644                 } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) {
-645                     return new(tree.Comment)(comment);
-646                 }
-647             },
-648 
-649             //
-650             // Entities are tokens which can be found inside an Expression
-651             //
-652             entities: {
-653                 //
-654                 // A string, which supports escaping " and '
-655                 //
-656                 //     "milky way" 'he\'s the one!'
-657                 //
-658                 quoted: function () {
-659                     var str, j = i, e;
-660 
-661                     if (input.charAt(j) === '~') { j++, e = true } // Escaped strings
-662                     if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return;
-663 
-664                     e && $('~');
-665 
-666                     if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) {
-667                         return new(tree.Quoted)(str[0], str[1] || str[2], e);
-668                     }
-669                 },
-670 
-671                 //
-672                 // A catch-all word, such as:
-673                 //
-674                 //     black border-collapse
-675                 //
-676                 keyword: function () {
-677                     var k;
-678 
-679                     if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { 
-680                         if (tree.colors.hasOwnProperty(k)) {
-681                             // detect named color
-682                             return new(tree.Color)(tree.colors[k].slice(1));
-683                         } else {
-684                             return new(tree.Keyword)(k);
-685                         }
-686                     }
-687                 },
-688 
-689                 //
-690                 // A function call
-691                 //
-692                 //     rgb(255, 0, 255)
-693                 //
-694                 // We also try to catch IE's `alpha()`, but let the `alpha` parser
-695                 // deal with the details.
-696                 //
-697                 // The arguments are parsed with the `entities.arguments` parser.
-698                 //
-699                 call: function () {
-700                     var name, args, alpha_ret, index = i;
-701 
-702                     if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return;
-703 
-704                     name = name[1].toLowerCase();
-705 
-706                     if (name === 'url') { return null }
-707                     else                { i += name.length }
-708 
-709                     if (name === 'alpha') {
-710                         alpha_ret = $(this.alpha);
-711                         if(typeof alpha_ret !== 'undefined') {
-712                             return alpha_ret;
-713                         }
-714                     }
-715 
-716                     $('('); // Parse the '(' and consume whitespace.
-717 
-718                     args = $(this.entities.arguments);
-719 
-720                     if (! $(')')) return;
-721 
-722                     if (name) { return new(tree.Call)(name, args, index, env.filename) }
-723                 },
-724                 arguments: function () {
-725                     var args = [], arg;
-726 
-727                     while (arg = $(this.entities.assignment) || $(this.expression)) {
-728                         args.push(arg);
-729                         if (! $(',')) { break }
-730                     }
-731                     return args;
-732                 },
-733                 literal: function () {
-734                     return $(this.entities.dimension) ||
-735                            $(this.entities.color) ||
-736                            $(this.entities.quoted);
-737                 },
-738 
-739                 // Assignments are argument entities for calls.
-740                 // They are present in ie filter properties as shown below.
-741                 //
-742                 //     filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
-743                 //
-744 
-745                 assignment: function () {
-746                     var key, value;
-747                     if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) {
-748                         return new(tree.Assignment)(key, value);
-749                     }
-750                 },
-751 
-752                 //
-753                 // Parse url() tokens
-754                 //
-755                 // We use a specific rule for urls, because they don't really behave like
-756                 // standard function calls. The difference is that the argument doesn't have
-757                 // to be enclosed within a string, so it can't be parsed as an Expression.
-758                 //
-759                 url: function () {
-760                     var value;
-761 
-762                     if (input.charAt(i) !== 'u' || !$(/^url\(/)) return;
-763                     value = $(this.entities.quoted)  || $(this.entities.variable) ||
-764                             $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || "";
-765 
-766                     expect(')');
-767 
-768                     return new(tree.URL)((value.value || value.data || value instanceof tree.Variable)
-769                                         ? value : new(tree.Anonymous)(value), imports.paths);
-770                 },
-771 
-772                 dataURI: function () {
-773                     var obj;
-774 
-775                     if ($(/^data:/)) {
-776                         obj         = {};
-777                         obj.mime    = $(/^[^\/]+\/[^,;)]+/)     || '';
-778                         obj.charset = $(/^;\s*charset=[^,;)]+/) || '';
-779                         obj.base64  = $(/^;\s*base64/)          || '';
-780                         obj.data    = $(/^,\s*[^)]+/);
-781 
-782                         if (obj.data) { return obj }
-783                     }
-784                 },
-785 
-786                 //
-787                 // A Variable entity, such as `@fink`, in
-788                 //
-789                 //     width: @fink + 2px
-790                 //
-791                 // We use a different parser for variable definitions,
-792                 // see `parsers.variable`.
-793                 //
-794                 variable: function () {
-795                     var name, index = i;
-796 
-797                     if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) {
-798                         return new(tree.Variable)(name, index, env.filename);
-799                     }
-800                 },
-801 
-802                 //
-803                 // A Hexadecimal color
-804                 //
-805                 //     #4F3C2F
-806                 //
-807                 // `rgb` and `hsl` colors are parsed through the `entities.call` parser.
-808                 //
-809                 color: function () {
-810                     var rgb;
-811 
-812                     if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) {
-813                         return new(tree.Color)(rgb[1]);
-814                     }
-815                 },
-816 
-817                 //
-818                 // A Dimension, that is, a number and a unit
-819                 //
-820                 //     0.5em 95%
-821                 //
-822                 dimension: function () {
-823                     var value, c = input.charCodeAt(i);
-824                     if ((c > 57 || c < 45) || c === 47) return;
-825 
-826                     if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) {
-827                         return new(tree.Dimension)(value[1], value[2]);
-828                     }
-829                 },
-830 
-831                 //
-832                 // JavaScript code to be evaluated
-833                 //
-834                 //     `window.location.href`
-835                 //
-836                 javascript: function () {
-837                     var str, j = i, e;
-838 
-839                     if (input.charAt(j) === '~') { j++, e = true } // Escaped strings
-840                     if (input.charAt(j) !== '`') { return }
-841 
-842                     e && $('~');
-843 
-844                     if (str = $(/^`([^`]*)`/)) {
-845                         return new(tree.JavaScript)(str[1], i, e);
-846                     }
-847                 }
-848             },
-849 
-850             //
-851             // The variable part of a variable definition. Used in the `rule` parser
-852             //
-853             //     @fink:
-854             //
-855             variable: function () {
-856                 var name;
-857 
-858                 if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] }
-859             },
-860 
-861             //
-862             // A font size/line-height shorthand
-863             //
-864             //     small/12px
-865             //
-866             // We need to peek first, or we'll match on keywords and dimensions
-867             //
-868             shorthand: function () {
-869                 var a, b;
-870 
-871                 if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return;
-872 
-873                 if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) {
-874                     return new(tree.Shorthand)(a, b);
-875                 }
-876             },
-877 
-878             //
-879             // Mixins
-880             //
-881             mixin: {
-882                 //
-883                 // A Mixin call, with an optional argument list
-884                 //
-885                 //     #mixins > .square(#fff);
-886                 //     .rounded(4px, black);
-887                 //     .button;
-888                 //
-889                 // The `while` loop is there because mixins can be
-890                 // namespaced, but we only support the child and descendant
-891                 // selector for now.
-892                 //
-893                 call: function () {
-894                     var elements = [], e, c, args = [], arg, index = i, s = input.charAt(i), name, value, important = false;
-895 
-896                     if (s !== '.' && s !== '#') { return }
-897 
-898                     while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) {
-899                         elements.push(new(tree.Element)(c, e, i));
-900                         c = $('>');
-901                     }
-902                     if ($('(')) {
-903                         while (arg = $(this.expression)) {
-904                             value = arg;
-905                             name = null;
-906 
-907                             // Variable
-908                             if (arg.value.length = 1) {
-909                                 var val = arg.value[0];
-910                                 if (val instanceof tree.Variable) {
-911                                     if ($(':')) {
-912                                         if (value = $(this.expression)) {
-913                                             name = val.name;
-914                                         } else {
-915                                             throw new(Error)("Expected value");
-916                                         }
-917                                     }
-918                                 }
-919                             }
-920 
-921                             args.push({ name: name, value: value });
-922 
-923                             if (! $(',')) { break }
-924                         }
-925                         if (! $(')')) throw new(Error)("Expected )");
-926                     }
-927 
-928                     if ($(this.important)) {
-929                         important = true;
-930                     }
-931 
-932                     if (elements.length > 0 && ($(';') || peek('}'))) {
-933                         return new(tree.mixin.Call)(elements, args, index, env.filename, important);
-934                     }
-935                 },
-936 
-937                 //
-938                 // A Mixin definition, with a list of parameters
-939                 //
-940                 //     .rounded (@radius: 2px, @color) {
-941                 //        ...
-942                 //     }
-943                 //
-944                 // Until we have a finer grained state-machine, we have to
-945                 // do a look-ahead, to make sure we don't have a mixin call.
-946                 // See the `rule` function for more information.
-947                 //
-948                 // We start by matching `.rounded (`, and then proceed on to
-949                 // the argument list, which has optional default values.
-950                 // We store the parameters in `params`, with a `value` key,
-951                 // if there is a value, such as in the case of `@radius`.
-952                 //
-953                 // Once we've got our params list, and a closing `)`, we parse
-954                 // the `{...}` block.
-955                 //
-956                 definition: function () {
-957                     var name, params = [], match, ruleset, param, value, cond, variadic = false;
-958                     if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') ||
-959                         peek(/^[^{]*(;|})/)) return;
-960 
-961                     save();
-962 
-963                     if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) {
-964                         name = match[1];
-965 
-966                         do {
-967                             if (input.charAt(i) === '.' && $(/^\.{3}/)) {
-968                                 variadic = true;
-969                                 break;
-970                             } else if (param = $(this.entities.variable) || $(this.entities.literal)
-971                                                                          || $(this.entities.keyword)) {
-972                                 // Variable
-973                                 if (param instanceof tree.Variable) {
-974                                     if ($(':')) {
-975                                         value = expect(this.expression, 'expected expression');
-976                                         params.push({ name: param.name, value: value });
-977                                     } else if ($(/^\.{3}/)) {
-978                                         params.push({ name: param.name, variadic: true });
-979                                         variadic = true;
-980                                         break;
-981                                     } else {
-982                                         params.push({ name: param.name });
-983                                     }
-984                                 } else {
-985                                     params.push({ value: param });
-986                                 }
-987                             } else {
-988                                 break;
-989                             }
-990                         } while ($(','))
-991 
-992                         expect(')');
-993 
-994                         if ($(/^when/)) { // Guard
-995                             cond = expect(this.conditions, 'expected condition');
-996                         }
-997 
-998                         ruleset = $(this.block);
-999 
-1000                         if (ruleset) {
-1001                             return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
-1002                         } else {
-1003                             restore();
-1004                         }
-1005                     }
-1006                 }
-1007             },
-1008 
-1009             //
-1010             // Entities are the smallest recognized token,
-1011             // and can be found inside a rule's value.
-1012             //
-1013             entity: function () {
-1014                 return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) ||
-1015                        $(this.entities.call)    || $(this.entities.keyword)  || $(this.entities.javascript) ||
-1016                        $(this.comment);
-1017             },
-1018 
-1019             //
-1020             // A Rule terminator. Note that we use `peek()` to check for '}',
-1021             // because the `block` rule will be expecting it, but we still need to make sure
-1022             // it's there, if ';' was ommitted.
-1023             //
-1024             end: function () {
-1025                 return $(';') || peek('}');
-1026             },
-1027 
-1028             //
-1029             // IE's alpha function
-1030             //
-1031             //     alpha(opacity=88)
-1032             //
-1033             alpha: function () {
-1034                 var value;
-1035 
-1036                 if (! $(/^\(opacity=/i)) return;
-1037                 if (value = $(/^\d+/) || $(this.entities.variable)) {
-1038                     expect(')');
-1039                     return new(tree.Alpha)(value);
-1040                 }
-1041             },
-1042 
-1043             //
-1044             // A Selector Element
-1045             //
-1046             //     div
-1047             //     + h1
-1048             //     #socks
-1049             //     input[type="text"]
-1050             //
-1051             // Elements are the building blocks for Selectors,
-1052             // they are made out of a `Combinator` (see combinator rule),
-1053             // and an element name, such as a tag a class, or `*`.
-1054             //
-1055             element: function () {
-1056                 var e, t, c, v;
-1057 
-1058                 c = $(this.combinator);
-1059                 e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) ||
-1060                     $('*') || $(this.attribute) || $(/^\([^)@]+\)/);
-1061 
-1062                 if (! e) {
-1063                     $('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v));
-1064                 }
-1065 
-1066                 if (e) { return new(tree.Element)(c, e, i) }
-1067 
-1068                 if (c.value && c.value.charAt(0) === '&') {
-1069                     return new(tree.Element)(c, null, i);
-1070                 }
-1071             },
-1072 
-1073             //
-1074             // Combinators combine elements together, in a Selector.
-1075             //
-1076             // Because our parser isn't white-space sensitive, special care
-1077             // has to be taken, when parsing the descendant combinator, ` `,
-1078             // as it's an empty space. We have to check the previous character
-1079             // in the input, to see if it's a ` ` character. More info on how
-1080             // we deal with this in *combinator.js*.
-1081             //
-1082             combinator: function () {
-1083                 var match, c = input.charAt(i);
-1084 
-1085                 if (c === '>' || c === '+' || c === '~') {
-1086                     i++;
-1087                     while (input.charAt(i) === ' ') { i++ }
-1088                     return new(tree.Combinator)(c);
-1089                 } else if (c === '&') {
-1090                     match = '&';
-1091                     i++;
-1092                     if(input.charAt(i) === ' ') {
-1093                         match = '& ';
-1094                     }
-1095                     while (input.charAt(i) === ' ') { i++ }
-1096                     return new(tree.Combinator)(match);
-1097                 } else if (input.charAt(i - 1) === ' ') {
-1098                     return new(tree.Combinator)(" ");
-1099                 } else {
-1100                     return new(tree.Combinator)(null);
-1101                 }
-1102             },
-1103 
-1104             //
-1105             // A CSS Selector
-1106             //
-1107             //     .class > div + h1
-1108             //     li a:hover
-1109             //
-1110             // Selectors are made out of one or more Elements, see above.
-1111             //
-1112             selector: function () {
-1113                 var sel, e, elements = [], c, match;
-1114 
-1115                 if ($('(')) {
-1116                     sel = $(this.entity);
-1117                     expect(')');
-1118                     return new(tree.Selector)([new(tree.Element)('', sel, i)]);
-1119                 }
-1120 
-1121                 while (e = $(this.element)) {
-1122                     c = input.charAt(i);
-1123                     elements.push(e)
-1124                     if (c === '{' || c === '}' || c === ';' || c === ',') { break }
-1125                 }
-1126 
-1127                 if (elements.length > 0) { return new(tree.Selector)(elements) }
-1128             },
-1129             tag: function () {
-1130                 return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*');
-1131             },
-1132             attribute: function () {
-1133                 var attr = '', key, val, op;
-1134 
-1135                 if (! $('[')) return;
-1136 
-1137                 if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) {
-1138                     if ((op = $(/^[|~*$^]?=/)) &&
-1139                         (val = $(this.entities.quoted) || $(/^[\w-]+/))) {
-1140                         attr = [key, op, val.toCSS ? val.toCSS() : val].join('');
-1141                     } else { attr = key }
-1142                 }
-1143 
-1144                 if (! $(']')) return;
-1145 
-1146                 if (attr) { return "[" + attr + "]" }
-1147             },
-1148 
-1149             //
-1150             // The `block` rule is used by `ruleset` and `mixin.definition`.
-1151             // It's a wrapper around the `primary` rule, with added `{}`.
-1152             //
-1153             block: function () {
-1154                 var content;
-1155 
-1156                 if ($('{') && (content = $(this.primary)) && $('}')) {
-1157                     return content;
-1158                 }
-1159             },
-1160 
-1161             //
-1162             // div, .class, body > p {...}
-1163             //
-1164             ruleset: function () {
-1165                 var selectors = [], s, rules, match;
-1166                 save();
-1167 
-1168                 while (s = $(this.selector)) {
-1169                     selectors.push(s);
-1170                     $(this.comment);
-1171                     if (! $(',')) { break }
-1172                     $(this.comment);
-1173                 }
-1174 
-1175                 if (selectors.length > 0 && (rules = $(this.block))) {
-1176                     return new(tree.Ruleset)(selectors, rules, env.strictImports);
-1177                 } else {
-1178                     // Backtrack
-1179                     furthest = i;
-1180                     restore();
-1181                 }
-1182             },
-1183             rule: function () {
-1184                 var name, value, c = input.charAt(i), important, match;
-1185                 save();
-1186 
-1187                 if (c === '.' || c === '#' || c === '&') { return }
-1188 
-1189                 if (name = $(this.variable) || $(this.property)) {
-1190                     if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) {
-1191                         i += match[0].length - 1;
-1192                         value = new(tree.Anonymous)(match[1]);
-1193                     } else if (name === "font") {
-1194                         value = $(this.font);
-1195                     } else {
-1196                         value = $(this.value);
-1197                     }
-1198                     important = $(this.important);
-1199 
-1200                     if (value && $(this.end)) {
-1201                         return new(tree.Rule)(name, value, important, memo);
-1202                     } else {
-1203                         furthest = i;
-1204                         restore();
-1205                     }
-1206                 }
-1207             },
-1208 
-1209             //
-1210             // An @import directive
-1211             //
-1212             //     @import "lib";
-1213             //
-1214             // Depending on our environemnt, importing is done differently:
-1215             // In the browser, it's an XHR request, in Node, it would be a
-1216             // file-system operation. The function used for importing is
-1217             // stored in `import`, which we pass to the Import constructor.
-1218             //
-1219             "import": function () {
-1220                 var path, features, index = i;
-1221                 var dir = $(/^@import(?:-(once))?\s+/);
-1222 
-1223                 if (dir && (path = $(this.entities.quoted) || $(this.entities.url))) {
-1224                     features = $(this.mediaFeatures);
-1225                     if ($(';')) {
-1226                         return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index);
-1227                     }
-1228                 }
-1229             },
-1230 
-1231             mediaFeature: function () {
-1232                 var e, p, nodes = [];
-1233 
-1234                 do {
-1235                     if (e = $(this.entities.keyword)) {
-1236                         nodes.push(e);
-1237                     } else if ($('(')) {
-1238                         p = $(this.property);
-1239                         e = $(this.entity);
-1240                         if ($(')')) {
-1241                             if (p && e) {
-1242                                 nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true)));
-1243                             } else if (e) {
-1244                                 nodes.push(new(tree.Paren)(e));
-1245                             } else {
-1246                                 return null;
-1247                             }
-1248                         } else { return null }
-1249                     }
-1250                 } while (e);
-1251 
-1252                 if (nodes.length > 0) {
-1253                     return new(tree.Expression)(nodes);
-1254                 }
-1255             },
-1256 
-1257             mediaFeatures: function () {
-1258                 var e, features = [];
-1259                 
-1260                 do {
-1261                   if (e = $(this.mediaFeature)) {
-1262                       features.push(e);
-1263                       if (! $(',')) { break }
-1264                   } else if (e = $(this.entities.variable)) {
-1265                       features.push(e);
-1266                       if (! $(',')) { break }
-1267                   }
-1268                 } while (e);
-1269                 
-1270                 return features.length > 0 ? features : null;
-1271             },
-1272 
-1273             media: function () {
-1274                 var features, rules;
-1275 
-1276                 if ($(/^@media/)) {
-1277                     features = $(this.mediaFeatures);
-1278 
-1279                     if (rules = $(this.block)) {
-1280                         return new(tree.Media)(rules, features);
-1281                     }
-1282                 }
-1283             },
-1284 
-1285             //
-1286             // A CSS Directive
-1287             //
-1288             //     @charset "utf-8";
-1289             //
-1290             directive: function () {
-1291                 var name, value, rules, types, e, nodes;
-1292 
-1293                 if (input.charAt(i) !== '@') return;
-1294 
-1295                 if (value = $(this['import']) || $(this.media)) {
-1296                     return value;
-1297                 } else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) {
-1298                     types = ($(/^[^{]+/) || '').trim();
-1299                     if (rules = $(this.block)) {
-1300                         return new(tree.Directive)(name + " " + types, rules);
-1301                     }
-1302                 } else if (name = $(/^@[-a-z]+/)) {
-1303                     if (name === '@font-face') {
-1304                         if (rules = $(this.block)) {
-1305                             return new(tree.Directive)(name, rules);
-1306                         }
-1307                     } else if ((value = $(this.entity)) && $(';')) {
-1308                         return new(tree.Directive)(name, value);
-1309                     }
-1310                 }
-1311             },
-1312             font: function () {
-1313                 var value = [], expression = [], weight, shorthand, font, e;
-1314 
-1315                 while (e = $(this.shorthand) || $(this.entity)) {
-1316                     expression.push(e);
-1317                 }
-1318                 value.push(new(tree.Expression)(expression));
-1319 
-1320                 if ($(',')) {
-1321                     while (e = $(this.expression)) {
-1322                         value.push(e);
-1323                         if (! $(',')) { break }
-1324                     }
-1325                 }
-1326                 return new(tree.Value)(value);
-1327             },
-1328 
-1329             //
-1330             // A Value is a comma-delimited list of Expressions
-1331             //
-1332             //     font-family: Baskerville, Georgia, serif;
-1333             //
-1334             // In a Rule, a Value represents everything after the `:`,
-1335             // and before the `;`.
-1336             //
-1337             value: function () {
-1338                 var e, expressions = [], important;
-1339 
-1340                 while (e = $(this.expression)) {
-1341                     expressions.push(e);
-1342                     if (! $(',')) { break }
-1343                 }
-1344 
-1345                 if (expressions.length > 0) {
-1346                     return new(tree.Value)(expressions);
-1347                 }
-1348             },
-1349             important: function () {
-1350                 if (input.charAt(i) === '!') {
-1351                     return $(/^! *important/);
-1352                 }
-1353             },
-1354             sub: function () {
-1355                 var e;
-1356 
-1357                 if ($('(') && (e = $(this.expression)) && $(')')) {
-1358                     return e;
-1359                 }
-1360             },
-1361             multiplication: function () {
-1362                 var m, a, op, operation;
-1363                 if (m = $(this.operand)) {
-1364                     while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) {
-1365                         operation = new(tree.Operation)(op, [operation || m, a]);
-1366                     }
-1367                     return operation || m;
-1368                 }
-1369             },
-1370             addition: function () {
-1371                 var m, a, op, operation;
-1372                 if (m = $(this.multiplication)) {
-1373                     while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) &&
-1374                            (a = $(this.multiplication))) {
-1375                         operation = new(tree.Operation)(op, [operation || m, a]);
-1376                     }
-1377                     return operation || m;
-1378                 }
-1379             },
-1380             conditions: function () {
-1381                 var a, b, index = i, condition;
-1382 
-1383                 if (a = $(this.condition)) {
-1384                     while ($(',') && (b = $(this.condition))) {
-1385                         condition = new(tree.Condition)('or', condition || a, b, index);
-1386                     }
-1387                     return condition || a;
-1388                 }
-1389             },
-1390             condition: function () {
-1391                 var a, b, c, op, index = i, negate = false;
-1392 
-1393                 if ($(/^not/)) { negate = true }
-1394                 expect('(');
-1395                 if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) {
-1396                     if (op = $(/^(?:>=|=<|[<=>])/)) {
-1397                         if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) {
-1398                             c = new(tree.Condition)(op, a, b, index, negate);
-1399                         } else {
-1400                             error('expected expression');
-1401                         }
-1402                     } else {
-1403                         c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate);
-1404                     }
-1405                     expect(')');
-1406                     return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c;
-1407                 }
-1408             },
-1409 
-1410             //
-1411             // An operand is anything that can be part of an operation,
-1412             // such as a Color, or a Variable
-1413             //
-1414             operand: function () {
-1415                 var negate, p = input.charAt(i + 1);
-1416 
-1417                 if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') }
-1418                 var o = $(this.sub) || $(this.entities.dimension) ||
-1419                         $(this.entities.color) || $(this.entities.variable) ||
-1420                         $(this.entities.call);
-1421                 return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o])
-1422                               : o;
-1423             },
-1424 
-1425             //
-1426             // Expressions either represent mathematical operations,
-1427             // or white-space delimited Entities.
-1428             //
-1429             //     1px solid black
-1430             //     @var * 2
-1431             //
-1432             expression: function () {
-1433                 var e, delim, entities = [], d;
-1434 
-1435                 while (e = $(this.addition) || $(this.entity)) {
-1436                     entities.push(e);
-1437                 }
-1438                 if (entities.length > 0) {
-1439                     return new(tree.Expression)(entities);
-1440                 }
-1441             },
-1442             property: function () {
-1443                 var name;
-1444 
-1445                 if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) {
-1446                     return name[1];
-1447                 }
-1448             }
-1449         }
-1450     };
-1451 };
-1452 
-1453 if (less.mode === 'browser' || less.mode === 'rhino') {
-1454     //
-1455     // Used by `@import` directives
-1456     //
-1457     less.Parser.importer = function (path, paths, callback, env) {
-1458         if (!/^([a-z]+:)?\//.test(path) && paths.length > 0) {
-1459             path = paths[0] + path;
-1460         }
-1461         // We pass `true` as 3rd argument, to force the reload of the import.
-1462         // This is so we can get the syntax tree as opposed to just the CSS output,
-1463         // as we need this to evaluate the current stylesheet.
-1464         loadStyleSheet({ href: path, title: path, type: env.mime }, function (e) {
-1465             if (e && typeof(env.errback) === "function") {
-1466                 env.errback.call(null, path, paths, callback, env);
-1467             } else {
-1468                 callback.apply(null, arguments);
-1469             }
-1470         }, true);
-1471     };
-1472 }
-1473 
-1474 (function (tree) {
-1475 
-1476 tree.functions = {
-1477     rgb: function (r, g, b) {
-1478         return this.rgba(r, g, b, 1.0);
-1479     },
-1480     rgba: function (r, g, b, a) {
-1481         var rgb = [r, g, b].map(function (c) { return number(c) }),
-1482             a = number(a);
-1483         return new(tree.Color)(rgb, a);
-1484     },
-1485     hsl: function (h, s, l) {
-1486         return this.hsla(h, s, l, 1.0);
-1487     },
-1488     hsla: function (h, s, l, a) {
-1489         h = (number(h) % 360) / 360;
-1490         s = number(s); l = number(l); a = number(a);
-1491 
-1492         var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
-1493         var m1 = l * 2 - m2;
-1494 
-1495         return this.rgba(hue(h + 1/3) * 255,
-1496                          hue(h)       * 255,
-1497                          hue(h - 1/3) * 255,
-1498                          a);
-1499 
-1500         function hue(h) {
-1501             h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
-1502             if      (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
-1503             else if (h * 2 < 1) return m2;
-1504             else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
-1505             else                return m1;
-1506         }
-1507     },
-1508     hue: function (color) {
-1509         return new(tree.Dimension)(Math.round(color.toHSL().h));
-1510     },
-1511     saturation: function (color) {
-1512         return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%');
-1513     },
-1514     lightness: function (color) {
-1515         return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%');
-1516     },
-1517     alpha: function (color) {
-1518         return new(tree.Dimension)(color.toHSL().a);
-1519     },
-1520     saturate: function (color, amount) {
-1521         var hsl = color.toHSL();
-1522 
-1523         hsl.s += amount.value / 100;
-1524         hsl.s = clamp(hsl.s);
-1525         return hsla(hsl);
-1526     },
-1527     desaturate: function (color, amount) {
-1528         var hsl = color.toHSL();
-1529 
-1530         hsl.s -= amount.value / 100;
-1531         hsl.s = clamp(hsl.s);
-1532         return hsla(hsl);
-1533     },
-1534     lighten: function (color, amount) {
-1535         var hsl = color.toHSL();
-1536 
-1537         hsl.l += amount.value / 100;
-1538         hsl.l = clamp(hsl.l);
-1539         return hsla(hsl);
-1540     },
-1541     darken: function (color, amount) {
-1542         var hsl = color.toHSL();
-1543 
-1544         hsl.l -= amount.value / 100;
-1545         hsl.l = clamp(hsl.l);
-1546         return hsla(hsl);
-1547     },
-1548     fadein: function (color, amount) {
-1549         var hsl = color.toHSL();
-1550 
-1551         hsl.a += amount.value / 100;
-1552         hsl.a = clamp(hsl.a);
-1553         return hsla(hsl);
-1554     },
-1555     fadeout: function (color, amount) {
-1556         var hsl = color.toHSL();
-1557 
-1558         hsl.a -= amount.value / 100;
-1559         hsl.a = clamp(hsl.a);
-1560         return hsla(hsl);
-1561     },
-1562     fade: function (color, amount) {
-1563         var hsl = color.toHSL();
-1564 
-1565         hsl.a = amount.value / 100;
-1566         hsl.a = clamp(hsl.a);
-1567         return hsla(hsl);
-1568     },
-1569     spin: function (color, amount) {
-1570         var hsl = color.toHSL();
-1571         var hue = (hsl.h + amount.value) % 360;
-1572 
-1573         hsl.h = hue < 0 ? 360 + hue : hue;
-1574 
-1575         return hsla(hsl);
-1576     },
-1577     //
-1578     // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
-1579     // http://sass-lang.com
-1580     //
-1581     mix: function (color1, color2, weight) {
-1582         var p = weight.value / 100.0;
-1583         var w = p * 2 - 1;
-1584         var a = color1.toHSL().a - color2.toHSL().a;
-1585 
-1586         var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
-1587         var w2 = 1 - w1;
-1588 
-1589         var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
-1590                    color1.rgb[1] * w1 + color2.rgb[1] * w2,
-1591                    color1.rgb[2] * w1 + color2.rgb[2] * w2];
-1592 
-1593         var alpha = color1.alpha * p + color2.alpha * (1 - p);
-1594 
-1595         return new(tree.Color)(rgb, alpha);
-1596     },
-1597     greyscale: function (color) {
-1598         return this.desaturate(color, new(tree.Dimension)(100));
-1599     },
-1600     e: function (str) {
-1601         return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str);
-1602     },
-1603     escape: function (str) {
-1604         return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29"));
-1605     },
-1606     '%': function (quoted /* arg, arg, ...*/) {
-1607         var args = Array.prototype.slice.call(arguments, 1),
-1608             str = quoted.value;
-1609 
-1610         for (var i = 0; i < args.length; i++) {
-1611             str = str.replace(/%[sda]/i, function(token) {
-1612                 var value = token.match(/s/i) ? args[i].value : args[i].toCSS();
-1613                 return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
-1614             });
-1615         }
-1616         str = str.replace(/%%/g, '%');
-1617         return new(tree.Quoted)('"' + str + '"', str);
-1618     },
-1619     round: function (n) {
-1620         return this._math('round', n);
-1621     },
-1622     ceil: function (n) {
-1623         return this._math('ceil', n);
-1624     },
-1625     floor: function (n) {
-1626         return this._math('floor', n);
-1627     },
-1628     _math: function (fn, n) {
-1629         if (n instanceof tree.Dimension) {
-1630             return new(tree.Dimension)(Math[fn](number(n)), n.unit);
-1631         } else if (typeof(n) === 'number') {
-1632             return Math[fn](n);
-1633         } else {
-1634             throw { type: "Argument", message: "argument must be a number" };
-1635         }
-1636     },
-1637     argb: function (color) {
-1638         return new(tree.Anonymous)(color.toARGB());
-1639 
-1640     },
-1641     percentage: function (n) {
-1642         return new(tree.Dimension)(n.value * 100, '%');
-1643     },
-1644     color: function (n) {
-1645         if (n instanceof tree.Quoted) {
-1646             return new(tree.Color)(n.value.slice(1));
-1647         } else {
-1648             throw { type: "Argument", message: "argument must be a string" };
-1649         }
-1650     },
-1651     iscolor: function (n) {
-1652         return this._isa(n, tree.Color);
-1653     },
-1654     isnumber: function (n) {
-1655         return this._isa(n, tree.Dimension);
-1656     },
-1657     isstring: function (n) {
-1658         return this._isa(n, tree.Quoted);
-1659     },
-1660     iskeyword: function (n) {
-1661         return this._isa(n, tree.Keyword);
-1662     },
-1663     isurl: function (n) {
-1664         return this._isa(n, tree.URL);
-1665     },
-1666     ispixel: function (n) {
-1667         return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False;
-1668     },
-1669     ispercentage: function (n) {
-1670         return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False;
-1671     },
-1672     isem: function (n) {
-1673         return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False;
-1674     },
-1675     _isa: function (n, Type) {
-1676         return (n instanceof Type) ? tree.True : tree.False;
-1677     }
-1678 };
-1679 
-1680 function hsla(hsla) {
-1681     return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a);
-1682 }
-1683 
-1684 function number(n) {
-1685     if (n instanceof tree.Dimension) {
-1686         return parseFloat(n.unit == '%' ? n.value / 100 : n.value);
-1687     } else if (typeof(n) === 'number') {
-1688         return n;
-1689     } else {
-1690         throw {
-1691             error: "RuntimeError",
-1692             message: "color functions take numbers as parameters"
-1693         };
-1694     }
-1695 }
-1696 
-1697 function clamp(val) {
-1698     return Math.min(1, Math.max(0, val));
-1699 }
-1700 
-1701 })(require('./tree'));
-1702 (function (tree) {
-1703 
-1704 tree.Alpha = function (val) {
-1705     this.value = val;
-1706 };
-1707 tree.Alpha.prototype = {
-1708     toCSS: function () {
-1709         return "alpha(opacity=" +
-1710                (this.value.toCSS ? this.value.toCSS() : this.value) + ")";
-1711     },
-1712     eval: function (env) {
-1713         if (this.value.eval) { this.value = this.value.eval(env) }
-1714         return this;
-1715     }
-1716 };
-1717 
-1718 })(require('../tree'));
-1719 (function (tree) {
-1720 
-1721 tree.Anonymous = function (string) {
-1722     this.value = string.value || string;
-1723 };
-1724 tree.Anonymous.prototype = {
-1725     toCSS: function () {
-1726         return this.value;
-1727     },
-1728     eval: function () { return this }
-1729 };
-1730 
-1731 })(require('../tree'));
-1732 (function (tree) {
-1733 
-1734 tree.Assignment = function (key, val) {
-1735     this.key = key;
-1736     this.value = val;
-1737 };
-1738 tree.Assignment.prototype = {
-1739     toCSS: function () {
-1740         return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value);
-1741     },
-1742     eval: function (env) {
-1743         if (this.value.eval) { this.value = this.value.eval(env) }
-1744         return this;
-1745     }
-1746 };
-1747 
-1748 })(require('../tree'));(function (tree) {
-1749 
-1750 //
-1751 // A function call node.
-1752 //
-1753 tree.Call = function (name, args, index, filename) {
-1754     this.name = name;
-1755     this.args = args;
-1756     this.index = index;
-1757     this.filename = filename;
-1758 };
-1759 tree.Call.prototype = {
-1760     //
-1761     // When evaluating a function call,
-1762     // we either find the function in `tree.functions` [1],
-1763     // in which case we call it, passing the  evaluated arguments,
-1764     // or we simply print it out as it appeared originally [2].
-1765     //
-1766     // The *functions.js* file contains the built-in functions.
-1767     //
-1768     // The reason why we evaluate the arguments, is in the case where
-1769     // we try to pass a variable to a function, like: `saturate(@color)`.
-1770     // The function should receive the value, not the variable.
-1771     //
-1772     eval: function (env) {
-1773         var args = this.args.map(function (a) { return a.eval(env) });
-1774 
-1775         if (this.name in tree.functions) { // 1.
-1776             try {
-1777                 return tree.functions[this.name].apply(tree.functions, args);
-1778             } catch (e) {
-1779                 throw { type: e.type || "Runtime",
-1780                         message: "error evaluating function `" + this.name + "`" +
-1781                                  (e.message ? ': ' + e.message : ''),
-1782                         index: this.index, filename: this.filename };
-1783             }
-1784         } else { // 2.
-1785             return new(tree.Anonymous)(this.name +
-1786                    "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")");
-1787         }
-1788     },
-1789 
-1790     toCSS: function (env) {
-1791         return this.eval(env).toCSS();
-1792     }
-1793 };
-1794 
-1795 })(require('../tree'));
-1796 (function (tree) {
-1797 //
-1798 // RGB Colors - #ff0014, #eee
-1799 //
-1800 tree.Color = function (rgb, a) {
-1801     //
-1802     // The end goal here, is to parse the arguments
-1803     // into an integer triplet, such as `128, 255, 0`
-1804     //
-1805     // This facilitates operations and conversions.
-1806     //
-1807     if (Array.isArray(rgb)) {
-1808         this.rgb = rgb;
-1809     } else if (rgb.length == 6) {
-1810         this.rgb = rgb.match(/.{2}/g).map(function (c) {
-1811             return parseInt(c, 16);
-1812         });
-1813     } else {
-1814         this.rgb = rgb.split('').map(function (c) {
-1815             return parseInt(c + c, 16);
-1816         });
-1817     }
-1818     this.alpha = typeof(a) === 'number' ? a : 1;
-1819 };
-1820 tree.Color.prototype = {
-1821     eval: function () { return this },
-1822 
-1823     //
-1824     // If we have some transparency, the only way to represent it
-1825     // is via `rgba`. Otherwise, we use the hex representation,
-1826     // which has better compatibility with older browsers.
-1827     // Values are capped between `0` and `255`, rounded and zero-padded.
-1828     //
-1829     toCSS: function () {
-1830         if (this.alpha < 1.0) {
-1831             return "rgba(" + this.rgb.map(function (c) {
-1832                 return Math.round(c);
-1833             }).concat(this.alpha).join(', ') + ")";
-1834         } else {
-1835             return '#' + this.rgb.map(function (i) {
-1836                 i = Math.round(i);
-1837                 i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16);
-1838                 return i.length === 1 ? '0' + i : i;
-1839             }).join('');
-1840         }
-1841     },
-1842 
-1843     //
-1844     // Operations have to be done per-channel, if not,
-1845     // channels will spill onto each other. Once we have
-1846     // our result, in the form of an integer triplet,
-1847     // we create a new Color node to hold the result.
-1848     //
-1849     operate: function (op, other) {
-1850         var result = [];
-1851 
-1852         if (! (other instanceof tree.Color)) {
-1853             other = other.toColor();
-1854         }
-1855 
-1856         for (var c = 0; c < 3; c++) {
-1857             result[c] = tree.operate(op, this.rgb[c], other.rgb[c]);
-1858         }
-1859         return new(tree.Color)(result, this.alpha + other.alpha);
-1860     },
-1861 
-1862     toHSL: function () {
-1863         var r = this.rgb[0] / 255,
-1864             g = this.rgb[1] / 255,
-1865             b = this.rgb[2] / 255,
-1866             a = this.alpha;
-1867 
-1868         var max = Math.max(r, g, b), min = Math.min(r, g, b);
-1869         var h, s, l = (max + min) / 2, d = max - min;
-1870 
-1871         if (max === min) {
-1872             h = s = 0;
-1873         } else {
-1874             s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
-1875 
-1876             switch (max) {
-1877                 case r: h = (g - b) / d + (g < b ? 6 : 0); break;
-1878                 case g: h = (b - r) / d + 2;               break;
-1879                 case b: h = (r - g) / d + 4;               break;
-1880             }
-1881             h /= 6;
-1882         }
-1883         return { h: h * 360, s: s, l: l, a: a };
-1884     },
-1885     toARGB: function () {
-1886         var argb = [Math.round(this.alpha * 255)].concat(this.rgb);
-1887         return '#' + argb.map(function (i) {
-1888             i = Math.round(i);
-1889             i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16);
-1890             return i.length === 1 ? '0' + i : i;
-1891         }).join('');
-1892     }
-1893 };
-1894 
-1895 
-1896 })(require('../tree'));
-1897 (function (tree) {
-1898 
-1899 tree.Comment = function (value, silent) {
-1900     this.value = value;
-1901     this.silent = !!silent;
-1902 };
-1903 tree.Comment.prototype = {
-1904     toCSS: function (env) {
-1905         return env.compress ? '' : this.value;
-1906     },
-1907     eval: function () { return this }
-1908 };
-1909 
-1910 })(require('../tree'));
-1911 (function (tree) {
-1912 
-1913 tree.Condition = function (op, l, r, i, negate) {
-1914     this.op = op.trim();
-1915     this.lvalue = l;
-1916     this.rvalue = r;
-1917     this.index = i;
-1918     this.negate = negate;
-1919 };
-1920 tree.Condition.prototype.eval = function (env) {
-1921     var a = this.lvalue.eval(env),
-1922         b = this.rvalue.eval(env);
-1923 
-1924     var i = this.index, result;
-1925 
-1926     var result = (function (op) {
-1927         switch (op) {
-1928             case 'and':
-1929                 return a && b;
-1930             case 'or':
-1931                 return a || b;
-1932             default:
-1933                 if (a.compare) {
-1934                     result = a.compare(b);
-1935                 } else if (b.compare) {
-1936                     result = b.compare(a);
-1937                 } else {
-1938                     throw { type: "Type",
-1939                             message: "Unable to perform comparison",
-1940                             index: i };
-1941                 }
-1942                 switch (result) {
-1943                     case -1: return op === '<' || op === '=<';
-1944                     case  0: return op === '=' || op === '>=' || op === '=<';
-1945                     case  1: return op === '>' || op === '>=';
-1946                 }
-1947         }
-1948     })(this.op);
-1949     return this.negate ? !result : result;
-1950 };
-1951 
-1952 })(require('../tree'));
-1953 (function (tree) {
-1954 
-1955 //
-1956 // A number with a unit
-1957 //
-1958 tree.Dimension = function (value, unit) {
-1959     this.value = parseFloat(value);
-1960     this.unit = unit || null;
-1961 };
-1962 
-1963 tree.Dimension.prototype = {
-1964     eval: function () { return this },
-1965     toColor: function () {
-1966         return new(tree.Color)([this.value, this.value, this.value]);
-1967     },
-1968     toCSS: function () {
-1969         var css = this.value + this.unit;
-1970         return css;
-1971     },
-1972 
-1973     // In an operation between two Dimensions,
-1974     // we default to the first Dimension's unit,
-1975     // so `1px + 2em` will yield `3px`.
-1976     // In the future, we could implement some unit
-1977     // conversions such that `100cm + 10mm` would yield
-1978     // `101cm`.
-1979     operate: function (op, other) {
-1980         return new(tree.Dimension)
-1981                   (tree.operate(op, this.value, other.value),
-1982                   this.unit || other.unit);
-1983     },
-1984 
-1985     // TODO: Perform unit conversion before comparing
-1986     compare: function (other) {
-1987         if (other instanceof tree.Dimension) {
-1988             if (other.value > this.value) {
-1989                 return -1;
-1990             } else if (other.value < this.value) {
-1991                 return 1;
-1992             } else {
-1993                 return 0;
-1994             }
-1995         } else {
-1996             return -1;
-1997         }
-1998     }
-1999 };
-2000 
-2001 })(require('../tree'));
-2002 (function (tree) {
-2003 
-2004 tree.Directive = function (name, value, features) {
-2005     this.name = name;
-2006 
-2007     if (Array.isArray(value)) {
-2008         this.ruleset = new(tree.Ruleset)([], value);
-2009         this.ruleset.allowImports = true;
-2010     } else {
-2011         this.value = value;
-2012     }
-2013 };
-2014 tree.Directive.prototype = {
-2015     toCSS: function (ctx, env) {
-2016         if (this.ruleset) {
-2017             this.ruleset.root = true;
-2018             return this.name + (env.compress ? '{' : ' {\n  ') +
-2019                    this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n  ') +
-2020                                (env.compress ? '}': '\n}\n');
-2021         } else {
-2022             return this.name + ' ' + this.value.toCSS() + ';\n';
-2023         }
-2024     },
-2025     eval: function (env) {
-2026         env.frames.unshift(this);
-2027         this.ruleset = this.ruleset && this.ruleset.eval(env);
-2028         env.frames.shift();
-2029         return this;
-2030     },
-2031     variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) },
-2032     find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) },
-2033     rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }
-2034 };
-2035 
-2036 })(require('../tree'));
-2037 (function (tree) {
-2038 
-2039 tree.Element = function (combinator, value, index) {
-2040     this.combinator = combinator instanceof tree.Combinator ?
-2041                       combinator : new(tree.Combinator)(combinator);
-2042 
-2043     if (typeof(value) === 'string') {
-2044         this.value = value.trim();
-2045     } else if (value) {
-2046         this.value = value;
-2047     } else {
-2048         this.value = "";
-2049     }
-2050     this.index = index;
-2051 };
-2052 tree.Element.prototype.eval = function (env) {
-2053     return new(tree.Element)(this.combinator,
-2054                              this.value.eval ? this.value.eval(env) : this.value,
-2055                              this.index);
-2056 };
-2057 tree.Element.prototype.toCSS = function (env) {
-2058 	var value = (this.value.toCSS ? this.value.toCSS(env) : this.value);
-2059 	if (value == '' && this.combinator.value.charAt(0) == '&') {
-2060 		return '';
-2061 	} else {
-2062 		return this.combinator.toCSS(env || {}) + value;
-2063 	}
-2064 };
-2065 
-2066 tree.Combinator = function (value) {
-2067     if (value === ' ') {
-2068         this.value = ' ';
-2069     } else if (value === '& ') {
-2070         this.value = '& ';
-2071     } else {
-2072         this.value = value ? value.trim() : "";
-2073     }
-2074 };
-2075 tree.Combinator.prototype.toCSS = function (env) {
-2076     return {
-2077         ''  : '',
-2078         ' ' : ' ',
-2079         '&' : '',
-2080         '& ' : ' ',
-2081         ':' : ' :',
-2082         '+' : env.compress ? '+' : ' + ',
-2083         '~' : env.compress ? '~' : ' ~ ',
-2084         '>' : env.compress ? '>' : ' > '
-2085     }[this.value];
-2086 };
-2087 
-2088 })(require('../tree'));
-2089 (function (tree) {
-2090 
-2091 tree.Expression = function (value) { this.value = value };
-2092 tree.Expression.prototype = {
-2093     eval: function (env) {
-2094         if (this.value.length > 1) {
-2095             return new(tree.Expression)(this.value.map(function (e) {
-2096                 return e.eval(env);
-2097             }));
-2098         } else if (this.value.length === 1) {
-2099             return this.value[0].eval(env);
-2100         } else {
-2101             return this;
-2102         }
-2103     },
-2104     toCSS: function (env) {
-2105         return this.value.map(function (e) {
-2106             return e.toCSS ? e.toCSS(env) : '';
-2107         }).join(' ');
-2108     }
-2109 };
-2110 
-2111 })(require('../tree'));
-2112 (function (tree) {
-2113 //
-2114 // CSS @import node
-2115 //
-2116 // The general strategy here is that we don't want to wait
-2117 // for the parsing to be completed, before we start importing
-2118 // the file. That's because in the context of a browser,
-2119 // most of the time will be spent waiting for the server to respond.
-2120 //
-2121 // On creation, we push the import path to our import queue, though
-2122 // `import,push`, we also pass it a callback, which it'll call once
-2123 // the file has been fetched, and parsed.
-2124 //
-2125 tree.Import = function (path, imports, features, once, index) {
-2126     var that = this;
-2127 
-2128     this.once = once;
-2129     this.index = index;
-2130     this._path = path;
-2131     this.features = features && new(tree.Value)(features);
-2132 
-2133     // The '.less' extension is optional
-2134     if (path instanceof tree.Quoted) {
-2135         this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less';
-2136     } else {
-2137         this.path = path.value.value || path.value;
-2138     }
-2139 
-2140     this.css = /css(\?.*)?$/.test(this.path);
-2141 
-2142     // Only pre-compile .less files
-2143     if (! this.css) {
-2144         imports.push(this.path, function (e, root, imported) {
-2145             if (e) { e.index = index }
-2146             if (imported && that.once) that.skip = imported;
-2147             that.root = root || new(tree.Ruleset)([], []);
-2148         });
-2149     }
-2150 };
-2151 
-2152 //
-2153 // The actual import node doesn't return anything, when converted to CSS.
-2154 // The reason is that it's used at the evaluation stage, so that the rules
-2155 // it imports can be treated like any other rules.
-2156 //
-2157 // In `eval`, we make sure all Import nodes get evaluated, recursively, so
-2158 // we end up with a flat structure, which can easily be imported in the parent
-2159 // ruleset.
-2160 //
-2161 tree.Import.prototype = {
-2162     toCSS: function (env) {
-2163         var features = this.features ? ' ' + this.features.toCSS(env) : '';
-2164 
-2165         if (this.css) {
-2166             return "@import " + this._path.toCSS() + features + ';\n';
-2167         } else {
-2168             return "";
-2169         }
-2170     },
-2171     eval: function (env) {
-2172         var ruleset, features = this.features && this.features.eval(env);
-2173 
-2174         if (this.skip) return [];
-2175 
-2176         if (this.css) {
-2177             return this;
-2178         } else {
-2179             ruleset = new(tree.Ruleset)([], this.root.rules.slice(0));
-2180 
-2181             for (var i = 0; i < ruleset.rules.length; i++) {
-2182                 if (ruleset.rules[i] instanceof tree.Import) {
-2183                     Array.prototype
-2184                          .splice
-2185                          .apply(ruleset.rules,
-2186                                 [i, 1].concat(ruleset.rules[i].eval(env)));
-2187                 }
-2188             }
-2189             return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules;
-2190         }
-2191     }
-2192 };
-2193 
-2194 })(require('../tree'));
-2195 (function (tree) {
-2196 
-2197 tree.JavaScript = function (string, index, escaped) {
-2198     this.escaped = escaped;
-2199     this.expression = string;
-2200     this.index = index;
-2201 };
-2202 tree.JavaScript.prototype = {
-2203     eval: function (env) {
-2204         var result,
-2205             that = this,
-2206             context = {};
-2207 
-2208         var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
-2209             return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env));
-2210         });
-2211 
-2212         try {
-2213             expression = new(Function)('return (' + expression + ')');
-2214         } catch (e) {
-2215             throw { message: "JavaScript evaluation error: `" + expression + "`" ,
-2216                     index: this.index };
-2217         }
-2218 
-2219         for (var k in env.frames[0].variables()) {
-2220             context[k.slice(1)] = {
-2221                 value: env.frames[0].variables()[k].value,
-2222                 toJS: function () {
-2223                     return this.value.eval(env).toCSS();
-2224                 }
-2225             };
-2226         }
-2227 
-2228         try {
-2229             result = expression.call(context);
-2230         } catch (e) {
-2231             throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" ,
-2232                     index: this.index };
-2233         }
-2234         if (typeof(result) === 'string') {
-2235             return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index);
-2236         } else if (Array.isArray(result)) {
-2237             return new(tree.Anonymous)(result.join(', '));
-2238         } else {
-2239             return new(tree.Anonymous)(result);
-2240         }
-2241     }
-2242 };
-2243 
-2244 })(require('../tree'));
-2245 
-2246 (function (tree) {
-2247 
-2248 tree.Keyword = function (value) { this.value = value };
-2249 tree.Keyword.prototype = {
-2250     eval: function () { return this },
-2251     toCSS: function () { return this.value },
-2252     compare: function (other) {
-2253         if (other instanceof tree.Keyword) {
-2254             return other.value === this.value ? 0 : 1;
-2255         } else {
-2256             return -1;
-2257         }
-2258     }
-2259 };
-2260 
-2261 tree.True = new(tree.Keyword)('true');
-2262 tree.False = new(tree.Keyword)('false');
-2263 
-2264 })(require('../tree'));
-2265 (function (tree) {
-2266 
-2267 tree.Media = function (value, features) {
-2268     var el = new(tree.Element)('&', null, 0),
-2269         selectors = [new(tree.Selector)([el])];
-2270 
-2271     this.features = new(tree.Value)(features);
-2272     this.ruleset = new(tree.Ruleset)(selectors, value);
-2273     this.ruleset.allowImports = true;
-2274 };
-2275 tree.Media.prototype = {
-2276     toCSS: function (ctx, env) {
-2277         var features = this.features.toCSS(env);
-2278 
-2279         this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia);
-2280         return '@media ' + features + (env.compress ? '{' : ' {\n  ') +
-2281                this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n  ') +
-2282                            (env.compress ? '}': '\n}\n');
-2283     },
-2284     eval: function (env) {
-2285         if (!env.mediaBlocks) {
-2286             env.mediaBlocks = [];
-2287             env.mediaPath = [];
-2288         }
-2289         
-2290         var blockIndex = env.mediaBlocks.length;
-2291         env.mediaPath.push(this);
-2292         env.mediaBlocks.push(this);
-2293 
-2294         var media = new(tree.Media)([], []);
-2295         media.features = this.features.eval(env);
-2296         
-2297         env.frames.unshift(this.ruleset);
-2298         media.ruleset = this.ruleset.eval(env);
-2299         env.frames.shift();
-2300         
-2301         env.mediaBlocks[blockIndex] = media;
-2302         env.mediaPath.pop();
-2303 
-2304         return env.mediaPath.length === 0 ? media.evalTop(env) :
-2305                     media.evalNested(env)
-2306     },
-2307     variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) },
-2308     find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) },
-2309     rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) },
-2310 
-2311     evalTop: function (env) {
-2312         var result = this;
-2313 
-2314         // Render all dependent Media blocks.
-2315         if (env.mediaBlocks.length > 1) {
-2316             var el = new(tree.Element)('&', null, 0);
-2317             var selectors = [new(tree.Selector)([el])];
-2318             result = new(tree.Ruleset)(selectors, env.mediaBlocks);
-2319             result.multiMedia = true;
-2320         }
-2321 
-2322         delete env.mediaBlocks;
-2323         delete env.mediaPath;
-2324 
-2325         return result;
-2326     },
-2327     evalNested: function (env) {
-2328         var i, value,
-2329             path = env.mediaPath.concat([this]);
-2330 
-2331         // Extract the media-query conditions separated with `,` (OR).
-2332         for (i = 0; i < path.length; i++) {
-2333             value = path[i].features instanceof tree.Value ?
-2334                         path[i].features.value : path[i].features;
-2335             path[i] = Array.isArray(value) ? value : [value];
-2336         }
-2337 
-2338         // Trace all permutations to generate the resulting media-query.
-2339         //
-2340         // (a, b and c) with nested (d, e) ->
-2341         //    a and d
-2342         //    a and e
-2343         //    b and c and d
-2344         //    b and c and e
-2345         this.features = new(tree.Value)(this.permute(path).map(function (path) {
-2346             path = path.map(function (fragment) {
-2347                 return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment);
-2348             });
-2349 
-2350             for(i = path.length - 1; i > 0; i--) {
-2351                 path.splice(i, 0, new(tree.Anonymous)("and"));
-2352             }
-2353 
-2354             return new(tree.Expression)(path);
-2355         }));
-2356 
-2357         // Fake a tree-node that doesn't output anything.
-2358         return new(tree.Ruleset)([], []);
-2359     },
-2360     permute: function (arr) {
-2361       if (arr.length === 0) {
-2362           return [];
-2363       } else if (arr.length === 1) {
-2364           return arr[0];
-2365       } else {
-2366           var result = [];
-2367           var rest = this.permute(arr.slice(1));
-2368           for (var i = 0; i < rest.length; i++) {
-2369               for (var j = 0; j < arr[0].length; j++) {
-2370                   result.push([arr[0][j]].concat(rest[i]));
-2371               }
-2372           }
-2373           return result;
-2374       }
-2375     }
-2376 };
-2377 
-2378 })(require('../tree'));
-2379 (function (tree) {
-2380 
-2381 tree.mixin = {};
-2382 tree.mixin.Call = function (elements, args, index, filename, important) {
-2383     this.selector = new(tree.Selector)(elements);
-2384     this.arguments = args;
-2385     this.index = index;
-2386     this.filename = filename;
-2387     this.important = important;
-2388 };
-2389 tree.mixin.Call.prototype = {
-2390     eval: function (env) {
-2391         var mixins, args, rules = [], match = false;
-2392 
-2393         for (var i = 0; i < env.frames.length; i++) {
-2394             if ((mixins = env.frames[i].find(this.selector)).length > 0) {
-2395                 args = this.arguments && this.arguments.map(function (a) {
-2396                     return { name: a.name, value: a.value.eval(env) };
-2397                 });
-2398                 for (var m = 0; m < mixins.length; m++) {
-2399                     if (mixins[m].match(args, env)) {
-2400                         try {
-2401                             Array.prototype.push.apply(
-2402                                   rules, mixins[m].eval(env, this.arguments, this.important).rules);
-2403                             match = true;
-2404                         } catch (e) {
-2405                             throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack };
-2406                         }
-2407                     }
-2408                 }
-2409                 if (match) {
-2410                     return rules;
-2411                 } else {
-2412                     throw { type:    'Runtime',
-2413                             message: 'No matching definition was found for `' +
-2414                                       this.selector.toCSS().trim() + '('      +
-2415                                       this.arguments.map(function (a) {
-2416                                           return a.toCSS();
-2417                                       }).join(', ') + ")`",
-2418                             index:   this.index, filename: this.filename };
-2419                 }
-2420             }
-2421         }
-2422         throw { type: 'Name',
-2423                 message: this.selector.toCSS().trim() + " is undefined",
-2424                 index: this.index, filename: this.filename };
-2425     }
-2426 };
-2427 
-2428 tree.mixin.Definition = function (name, params, rules, condition, variadic) {
-2429     this.name = name;
-2430     this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])];
-2431     this.params = params;
-2432     this.condition = condition;
-2433     this.variadic = variadic;
-2434     this.arity = params.length;
-2435     this.rules = rules;
-2436     this._lookups = {};
-2437     this.required = params.reduce(function (count, p) {
-2438         if (!p.name || (p.name && !p.value)) { return count + 1 }
-2439         else                                 { return count }
-2440     }, 0);
-2441     this.parent = tree.Ruleset.prototype;
-2442     this.frames = [];
-2443 };
-2444 tree.mixin.Definition.prototype = {
-2445     toCSS:     function ()     { return "" },
-2446     variable:  function (name) { return this.parent.variable.call(this, name) },
-2447     variables: function ()     { return this.parent.variables.call(this) },
-2448     find:      function ()     { return this.parent.find.apply(this, arguments) },
-2449     rulesets:  function ()     { return this.parent.rulesets.apply(this) },
-2450 
-2451     evalParams: function (env, args) {
-2452         var frame = new(tree.Ruleset)(null, []), varargs, arg;
-2453 
-2454         for (var i = 0, val, name; i < this.params.length; i++) {
-2455             arg = args && args[i]
-2456 
-2457             if (arg && arg.name) {
-2458                 frame.rules.unshift(new(tree.Rule)(arg.name, arg.value.eval(env)));
-2459                 args.splice(i, 1);
-2460                 i--;
-2461                 continue;
-2462             }
-2463 			
-2464             if (name = this.params[i].name) {
-2465                 if (this.params[i].variadic && args) {
-2466                     varargs = [];
-2467                     for (var j = i; j < args.length; j++) {
-2468                         varargs.push(args[j].eval(env));
-2469                     }
-2470                     frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env)));
-2471                 } else if (val = (arg && arg.value) || this.params[i].value) {
-2472                     frame.rules.unshift(new(tree.Rule)(name, val.eval(env)));
-2473                 } else {
-2474                     throw { type: 'Runtime', message: "wrong number of arguments for " + this.name +
-2475                             ' (' + args.length + ' for ' + this.arity + ')' };
-2476                 }
-2477             }
-2478         }
-2479         return frame;
-2480     },
-2481     eval: function (env, args, important) {
-2482         var frame = this.evalParams(env, args), context, _arguments = [], rules, start;
-2483 
-2484         for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) {
-2485             _arguments.push((args[i] && args[i].value) || this.params[i].value);
-2486         }
-2487         frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env)));
-2488 
-2489         rules = important ?
-2490             this.rules.map(function (r) {
-2491                 return new(tree.Rule)(r.name, r.value, '!important', r.index);
-2492             }) : this.rules.slice(0);
-2493 
-2494         return new(tree.Ruleset)(null, rules).eval({
-2495             frames: [this, frame].concat(this.frames, env.frames)
-2496         });
-2497     },
-2498     match: function (args, env) {
-2499         var argsLength = (args && args.length) || 0, len, frame;
-2500 
-2501         if (! this.variadic) {
-2502             if (argsLength < this.required)                               { return false }
-2503             if (argsLength > this.params.length)                          { return false }
-2504             if ((this.required > 0) && (argsLength > this.params.length)) { return false }
-2505         }
-2506 
-2507         if (this.condition && !this.condition.eval({
-2508             frames: [this.evalParams(env, args)].concat(env.frames)
-2509         }))                                                           { return false }
-2510 
-2511         len = Math.min(argsLength, this.arity);
-2512 
-2513         for (var i = 0; i < len; i++) {
-2514             if (!this.params[i].name) {
-2515                 if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) {
-2516                     return false;
-2517                 }
-2518             }
-2519         }
-2520         return true;
-2521     }
-2522 };
-2523 
-2524 })(require('../tree'));
-2525 (function (tree) {
-2526 
-2527 tree.Operation = function (op, operands) {
-2528     this.op = op.trim();
-2529     this.operands = operands;
-2530 };
-2531 tree.Operation.prototype.eval = function (env) {
-2532     var a = this.operands[0].eval(env),
-2533         b = this.operands[1].eval(env),
-2534         temp;
-2535 
-2536     if (a instanceof tree.Dimension && b instanceof tree.Color) {
-2537         if (this.op === '*' || this.op === '+') {
-2538             temp = b, b = a, a = temp;
-2539         } else {
-2540             throw { name: "OperationError",
-2541                     message: "Can't substract or divide a color from a number" };
-2542         }
-2543     }
-2544     return a.operate(this.op, b);
-2545 };
-2546 
-2547 tree.operate = function (op, a, b) {
-2548     switch (op) {
-2549         case '+': return a + b;
-2550         case '-': return a - b;
-2551         case '*': return a * b;
-2552         case '/': return a / b;
-2553     }
-2554 };
-2555 
-2556 })(require('../tree'));
-2557 
-2558 (function (tree) {
-2559 
-2560 tree.Paren = function (node) {
-2561     this.value = node;
-2562 };
-2563 tree.Paren.prototype = {
-2564     toCSS: function (env) {
-2565         return '(' + this.value.toCSS(env) + ')';
-2566     },
-2567     eval: function (env) {
-2568         return new(tree.Paren)(this.value.eval(env));
-2569     }
-2570 };
-2571 
-2572 })(require('../tree'));
-2573 (function (tree) {
-2574 
-2575 tree.Quoted = function (str, content, escaped, i) {
-2576     this.escaped = escaped;
-2577     this.value = content || '';
-2578     this.quote = str.charAt(0);
-2579     this.index = i;
-2580 };
-2581 tree.Quoted.prototype = {
-2582     toCSS: function () {
-2583         if (this.escaped) {
-2584             return this.value;
-2585         } else {
-2586             return this.quote + this.value + this.quote;
-2587         }
-2588     },
-2589     eval: function (env) {
-2590         var that = this;
-2591         var value = this.value.replace(/`([^`]+)`/g, function (_, exp) {
-2592             return new(tree.JavaScript)(exp, that.index, true).eval(env).value;
-2593         }).replace(/@\{([\w-]+)\}/g, function (_, name) {
-2594             var v = new(tree.Variable)('@' + name, that.index).eval(env);
-2595             return ('value' in v) ? v.value : v.toCSS();
-2596         });
-2597         return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index);
-2598     }
-2599 };
-2600 
-2601 })(require('../tree'));
-2602 (function (tree) {
-2603 
-2604 tree.Rule = function (name, value, important, index, inline) {
-2605     this.name = name;
-2606     this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]);
-2607     this.important = important ? ' ' + important.trim() : '';
-2608     this.index = index;
-2609     this.inline = inline || false;
-2610 
-2611     if (name.charAt(0) === '@') {
-2612         this.variable = true;
-2613     } else { this.variable = false }
-2614 };
-2615 tree.Rule.prototype.toCSS = function (env) {
-2616     if (this.variable) { return "" }
-2617     else {
-2618         return this.name + (env.compress ? ':' : ': ') +
-2619                this.value.toCSS(env) +
-2620                this.important + (this.inline ? "" : ";");
-2621     }
-2622 };
-2623 
-2624 tree.Rule.prototype.eval = function (context) {
-2625     return new(tree.Rule)(this.name,
-2626                           this.value.eval(context),
-2627                           this.important,
-2628                           this.index, this.inline);
-2629 };
-2630 
-2631 tree.Shorthand = function (a, b) {
-2632     this.a = a;
-2633     this.b = b;
-2634 };
-2635 
-2636 tree.Shorthand.prototype = {
-2637     toCSS: function (env) {
-2638         return this.a.toCSS(env) + "/" + this.b.toCSS(env);
-2639     },
-2640     eval: function () { return this }
-2641 };
-2642 
-2643 })(require('../tree'));
-2644 (function (tree) {
-2645 
-2646 tree.Ruleset = function (selectors, rules, strictImports) {
-2647     this.selectors = selectors;
-2648     this.rules = rules;
-2649     this._lookups = {};
-2650     this.strictImports = strictImports;
-2651 };
-2652 tree.Ruleset.prototype = {
-2653     eval: function (env) {
-2654         var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) });
-2655         var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports);
-2656 
-2657         ruleset.root = this.root;
-2658         ruleset.allowImports = this.allowImports;
-2659 
-2660         // push the current ruleset to the frames stack
-2661         env.frames.unshift(ruleset);
-2662 
-2663         // Evaluate imports
-2664         if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
-2665             for (var i = 0; i < ruleset.rules.length; i++) {
-2666                 if (ruleset.rules[i] instanceof tree.Import) {
-2667                     Array.prototype.splice
-2668                          .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env)));
-2669                 }
-2670             }
-2671         }
-2672 
-2673         // Store the frames around mixin definitions,
-2674         // so they can be evaluated like closures when the time comes.
-2675         for (var i = 0; i < ruleset.rules.length; i++) {
-2676             if (ruleset.rules[i] instanceof tree.mixin.Definition) {
-2677                 ruleset.rules[i].frames = env.frames.slice(0);
-2678             }
-2679         }
-2680 
-2681         // Evaluate mixin calls.
-2682         for (var i = 0; i < ruleset.rules.length; i++) {
-2683             if (ruleset.rules[i] instanceof tree.mixin.Call) {
-2684                 Array.prototype.splice
-2685                      .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env)));
-2686             }
-2687         }
-2688 
-2689         // Evaluate everything else
-2690         for (var i = 0, rule; i < ruleset.rules.length; i++) {
-2691             rule = ruleset.rules[i];
-2692 
-2693             if (! (rule instanceof tree.mixin.Definition)) {
-2694                 ruleset.rules[i] = rule.eval ? rule.eval(env) : rule;
-2695             }
-2696         }
-2697 
-2698         // Pop the stack
-2699         env.frames.shift();
-2700 
-2701         return ruleset;
-2702     },
-2703     match: function (args) {
-2704         return !args || args.length === 0;
-2705     },
-2706     variables: function () {
-2707         if (this._variables) { return this._variables }
-2708         else {
-2709             return this._variables = this.rules.reduce(function (hash, r) {
-2710                 if (r instanceof tree.Rule && r.variable === true) {
-2711                     hash[r.name] = r;
-2712                 }
-2713                 return hash;
-2714             }, {});
-2715         }
-2716     },
-2717     variable: function (name) {
-2718         return this.variables()[name];
-2719     },
-2720     rulesets: function () {
-2721         if (this._rulesets) { return this._rulesets }
-2722         else {
-2723             return this._rulesets = this.rules.filter(function (r) {
-2724                 return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition);
-2725             });
-2726         }
-2727     },
-2728     find: function (selector, self) {
-2729         self = self || this;
-2730         var rules = [], rule, match,
-2731             key = selector.toCSS();
-2732 
-2733         if (key in this._lookups) { return this._lookups[key] }
-2734 
-2735         this.rulesets().forEach(function (rule) {
-2736             if (rule !== self) {
-2737                 for (var j = 0; j < rule.selectors.length; j++) {
-2738                     if (match = selector.match(rule.selectors[j])) {
-2739                         if (selector.elements.length > rule.selectors[j].elements.length) {
-2740                             Array.prototype.push.apply(rules, rule.find(
-2741                                 new(tree.Selector)(selector.elements.slice(1)), self));
-2742                         } else {
-2743                             rules.push(rule);
-2744                         }
-2745                         break;
-2746                     }
-2747                 }
-2748             }
-2749         });
-2750         return this._lookups[key] = rules;
-2751     },
-2752     //
-2753     // Entry point for code generation
-2754     //
-2755     //     `context` holds an array of arrays.
-2756     //
-2757     toCSS: function (context, env) {
-2758         var css = [],      // The CSS output
-2759             rules = [],    // node.Rule instances
-2760            _rules = [],    //
-2761             rulesets = [], // node.Ruleset instances
-2762             paths = [],    // Current selectors
-2763             selector,      // The fully rendered selector
-2764             rule;
-2765 
-2766         if (! this.root) {
-2767             if (context.length === 0) {
-2768                 paths = this.selectors.map(function (s) { return [s] });
-2769             } else {
-2770                 this.joinSelectors(paths, context, this.selectors);
-2771             }
-2772         }
-2773 
-2774         // Compile rules and rulesets
-2775         for (var i = 0; i < this.rules.length; i++) {
-2776             rule = this.rules[i];
-2777 
-2778             if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) {
-2779                 rulesets.push(rule.toCSS(paths, env));
-2780             } else if (rule instanceof tree.Comment) {
-2781                 if (!rule.silent) {
-2782                     if (this.root) {
-2783                         rulesets.push(rule.toCSS(env));
-2784                     } else {
-2785                         rules.push(rule.toCSS(env));
-2786                     }
-2787                 }
-2788             } else {
-2789                 if (rule.toCSS && !rule.variable) {
-2790                     rules.push(rule.toCSS(env));
-2791                 } else if (rule.value && !rule.variable) {
-2792                     rules.push(rule.value.toString());
-2793                 }
-2794             }
-2795         } 
-2796 
-2797         rulesets = rulesets.join('');
-2798 
-2799         // If this is the root node, we don't render
-2800         // a selector, or {}.
-2801         // Otherwise, only output if this ruleset has rules.
-2802         if (this.root) {
-2803             css.push(rules.join(env.compress ? '' : '\n'));
-2804         } else {
-2805             if (rules.length > 0) {
-2806                 selector = paths.map(function (p) {
-2807                     return p.map(function (s) {
-2808                         return s.toCSS(env);
-2809                     }).join('').trim();
-2810                 }).join(env.compress ? ',' : ',\n');
-2811 
-2812                 // Remove duplicates
-2813                 for (var i = rules.length - 1; i >= 0; i--) {
-2814                     if (_rules.indexOf(rules[i]) === -1) {
-2815                         _rules.unshift(rules[i]);
-2816                     }
-2817                 }
-2818                 rules = _rules;
-2819 
-2820                 css.push(selector,
-2821                         (env.compress ? '{' : ' {\n  ') +
-2822                         rules.join(env.compress ? '' : '\n  ') +
-2823                         (env.compress ? '}' : '\n}\n'));
-2824             }
-2825         }
-2826         css.push(rulesets);
-2827 
-2828         return css.join('') + (env.compress ? '\n' : '');
-2829     },
-2830 
-2831     joinSelectors: function (paths, context, selectors) {
-2832         for (var s = 0; s < selectors.length; s++) {
-2833             this.joinSelector(paths, context, selectors[s]);
-2834         }
-2835     },
-2836 
-2837     joinSelector: function (paths, context, selector) {
-2838         var before = [], after = [], beforeElements = [],
-2839             afterElements = [], hasParentSelector = false, el;
-2840 
-2841         for (var i = 0; i < selector.elements.length; i++) {
-2842             el = selector.elements[i];
-2843             if (el.combinator.value.charAt(0) === '&') {
-2844                 hasParentSelector = true;
-2845             }
-2846             if (hasParentSelector) afterElements.push(el);
-2847             else                   beforeElements.push(el);
-2848         }
-2849 
-2850         if (! hasParentSelector) {
-2851             afterElements = beforeElements;
-2852             beforeElements = [];
-2853         }
-2854 
-2855         if (beforeElements.length > 0) {
-2856             before.push(new(tree.Selector)(beforeElements));
-2857         }
-2858 
-2859         if (afterElements.length > 0) {
-2860             after.push(new(tree.Selector)(afterElements));
-2861         }
-2862 
-2863         for (var c = 0; c < context.length; c++) {
-2864             paths.push(before.concat(context[c]).concat(after));
-2865         }
-2866     }
-2867 };
-2868 })(require('../tree'));
-2869 (function (tree) {
-2870 
-2871 tree.Selector = function (elements) {
-2872     this.elements = elements;
-2873     if (this.elements[0].combinator.value === "") {
-2874         this.elements[0].combinator.value = ' ';
-2875     }
-2876 };
-2877 tree.Selector.prototype.match = function (other) {
-2878     var len  = this.elements.length,
-2879         olen = other.elements.length,
-2880         max  = Math.min(len, olen);
-2881 
-2882     if (len < olen) {
-2883         return false;
-2884     } else {
-2885         for (var i = 0; i < max; i++) {
-2886             if (this.elements[i].value !== other.elements[i].value) {
-2887                 return false;
-2888             }
-2889         }
-2890     }
-2891     return true;
-2892 };
-2893 tree.Selector.prototype.eval = function (env) {
-2894     return new(tree.Selector)(this.elements.map(function (e) {
-2895         return e.eval(env);
-2896     }));
-2897 };
-2898 tree.Selector.prototype.toCSS = function (env) {
-2899     if (this._css) { return this._css }
-2900 
-2901     return this._css = this.elements.map(function (e) {
-2902         if (typeof(e) === 'string') {
-2903             return ' ' + e.trim();
-2904         } else {
-2905             return e.toCSS(env);
-2906         }
-2907     }).join('');
-2908 };
-2909 
-2910 })(require('../tree'));
-2911 (function (tree) {
-2912 
-2913 tree.URL = function (val, paths) {
-2914     if (val.data) {
-2915         this.attrs = val;
-2916     } else {
-2917         // Add the base path if the URL is relative and we are in the browser
-2918         if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) {
-2919             val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value);
-2920         }
-2921         this.value = val;
-2922         this.paths = paths;
-2923     }
-2924 };
-2925 tree.URL.prototype = {
-2926     toCSS: function () {
-2927         return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data
-2928                                     : this.value.toCSS()) + ")";
-2929     },
-2930     eval: function (ctx) {
-2931         return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths);
-2932     }
-2933 };
-2934 
-2935 })(require('../tree'));
-2936 (function (tree) {
-2937 
-2938 tree.Value = function (value) {
-2939     this.value = value;
-2940     this.is = 'value';
-2941 };
-2942 tree.Value.prototype = {
-2943     eval: function (env) {
-2944         if (this.value.length === 1) {
-2945             return this.value[0].eval(env);
-2946         } else {
-2947             return new(tree.Value)(this.value.map(function (v) {
-2948                 return v.eval(env);
-2949             }));
-2950         }
-2951     },
-2952     toCSS: function (env) {
-2953         return this.value.map(function (e) {
-2954             return e.toCSS(env);
-2955         }).join(env.compress ? ',' : ', ');
-2956     }
-2957 };
-2958 
-2959 })(require('../tree'));
-2960 (function (tree) {
-2961 
-2962 tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file };
-2963 tree.Variable.prototype = {
-2964     eval: function (env) {
-2965         var variable, v, name = this.name;
-2966 
-2967         if (name.indexOf('@@') == 0) {
-2968             name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value;
-2969         }
-2970 
-2971         if (variable = tree.find(env.frames, function (frame) {
-2972             if (v = frame.variable(name)) {
-2973                 return v.value.eval(env);
-2974             }
-2975         })) { return variable }
-2976         else {
-2977             throw { type: 'Name',
-2978                     message: "variable " + name + " is undefined",
-2979                     filename: this.file,
-2980                     index: this.index };
-2981         }
-2982     }
-2983 };
-2984 
-2985 })(require('../tree'));
-2986 (function (tree) {
-2987 
-2988 tree.find = function (obj, fun) {
-2989     for (var i = 0, r; i < obj.length; i++) {
-2990         if (r = fun.call(obj, obj[i])) { return r }
-2991     }
-2992     return null;
-2993 };
-2994 tree.jsify = function (obj) {
-2995     if (Array.isArray(obj.value) && (obj.value.length > 1)) {
-2996         return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']';
-2997     } else {
-2998         return obj.toCSS(false);
-2999     }
-3000 };
-3001 
-3002 })(require('./tree'));
-3003 (function (tree) {
-3004     tree.colors = {
-3005         'aliceblue':'#f0f8ff',
-3006         'antiquewhite':'#faebd7',
-3007         'aqua':'#00ffff',
-3008         'aquamarine':'#7fffd4',
-3009         'azure':'#f0ffff',
-3010         'beige':'#f5f5dc',
-3011         'bisque':'#ffe4c4',
-3012         'black':'#000000',
-3013         'blanchedalmond':'#ffebcd',
-3014         'blue':'#0000ff',
-3015         'blueviolet':'#8a2be2',
-3016         'brown':'#a52a2a',
-3017         'burlywood':'#deb887',
-3018         'cadetblue':'#5f9ea0',
-3019         'chartreuse':'#7fff00',
-3020         'chocolate':'#d2691e',
-3021         'coral':'#ff7f50',
-3022         'cornflowerblue':'#6495ed',
-3023         'cornsilk':'#fff8dc',
-3024         'crimson':'#dc143c',
-3025         'cyan':'#00ffff',
-3026         'darkblue':'#00008b',
-3027         'darkcyan':'#008b8b',
-3028         'darkgoldenrod':'#b8860b',
-3029         'darkgray':'#a9a9a9',
-3030         'darkgrey':'#a9a9a9',
-3031         'darkgreen':'#006400',
-3032         'darkkhaki':'#bdb76b',
-3033         'darkmagenta':'#8b008b',
-3034         'darkolivegreen':'#556b2f',
-3035         'darkorange':'#ff8c00',
-3036         'darkorchid':'#9932cc',
-3037         'darkred':'#8b0000',
-3038         'darksalmon':'#e9967a',
-3039         'darkseagreen':'#8fbc8f',
-3040         'darkslateblue':'#483d8b',
-3041         'darkslategray':'#2f4f4f',
-3042         'darkslategrey':'#2f4f4f',
-3043         'darkturquoise':'#00ced1',
-3044         'darkviolet':'#9400d3',
-3045         'deeppink':'#ff1493',
-3046         'deepskyblue':'#00bfff',
-3047         'dimgray':'#696969',
-3048         'dimgrey':'#696969',
-3049         'dodgerblue':'#1e90ff',
-3050         'firebrick':'#b22222',
-3051         'floralwhite':'#fffaf0',
-3052         'forestgreen':'#228b22',
-3053         'fuchsia':'#ff00ff',
-3054         'gainsboro':'#dcdcdc',
-3055         'ghostwhite':'#f8f8ff',
-3056         'gold':'#ffd700',
-3057         'goldenrod':'#daa520',
-3058         'gray':'#808080',
-3059         'grey':'#808080',
-3060         'green':'#008000',
-3061         'greenyellow':'#adff2f',
-3062         'honeydew':'#f0fff0',
-3063         'hotpink':'#ff69b4',
-3064         'indianred':'#cd5c5c',
-3065         'indigo':'#4b0082',
-3066         'ivory':'#fffff0',
-3067         'khaki':'#f0e68c',
-3068         'lavender':'#e6e6fa',
-3069         'lavenderblush':'#fff0f5',
-3070         'lawngreen':'#7cfc00',
-3071         'lemonchiffon':'#fffacd',
-3072         'lightblue':'#add8e6',
-3073         'lightcoral':'#f08080',
-3074         'lightcyan':'#e0ffff',
-3075         'lightgoldenrodyellow':'#fafad2',
-3076         'lightgray':'#d3d3d3',
-3077         'lightgrey':'#d3d3d3',
-3078         'lightgreen':'#90ee90',
-3079         'lightpink':'#ffb6c1',
-3080         'lightsalmon':'#ffa07a',
-3081         'lightseagreen':'#20b2aa',
-3082         'lightskyblue':'#87cefa',
-3083         'lightslategray':'#778899',
-3084         'lightslategrey':'#778899',
-3085         'lightsteelblue':'#b0c4de',
-3086         'lightyellow':'#ffffe0',
-3087         'lime':'#00ff00',
-3088         'limegreen':'#32cd32',
-3089         'linen':'#faf0e6',
-3090         'magenta':'#ff00ff',
-3091         'maroon':'#800000',
-3092         'mediumaquamarine':'#66cdaa',
-3093         'mediumblue':'#0000cd',
-3094         'mediumorchid':'#ba55d3',
-3095         'mediumpurple':'#9370d8',
-3096         'mediumseagreen':'#3cb371',
-3097         'mediumslateblue':'#7b68ee',
-3098         'mediumspringgreen':'#00fa9a',
-3099         'mediumturquoise':'#48d1cc',
-3100         'mediumvioletred':'#c71585',
-3101         'midnightblue':'#191970',
-3102         'mintcream':'#f5fffa',
-3103         'mistyrose':'#ffe4e1',
-3104         'moccasin':'#ffe4b5',
-3105         'navajowhite':'#ffdead',
-3106         'navy':'#000080',
-3107         'oldlace':'#fdf5e6',
-3108         'olive':'#808000',
-3109         'olivedrab':'#6b8e23',
-3110         'orange':'#ffa500',
-3111         'orangered':'#ff4500',
-3112         'orchid':'#da70d6',
-3113         'palegoldenrod':'#eee8aa',
-3114         'palegreen':'#98fb98',
-3115         'paleturquoise':'#afeeee',
-3116         'palevioletred':'#d87093',
-3117         'papayawhip':'#ffefd5',
-3118         'peachpuff':'#ffdab9',
-3119         'peru':'#cd853f',
-3120         'pink':'#ffc0cb',
-3121         'plum':'#dda0dd',
-3122         'powderblue':'#b0e0e6',
-3123         'purple':'#800080',
-3124         'red':'#ff0000',
-3125         'rosybrown':'#bc8f8f',
-3126         'royalblue':'#4169e1',
-3127         'saddlebrown':'#8b4513',
-3128         'salmon':'#fa8072',
-3129         'sandybrown':'#f4a460',
-3130         'seagreen':'#2e8b57',
-3131         'seashell':'#fff5ee',
-3132         'sienna':'#a0522d',
-3133         'silver':'#c0c0c0',
-3134         'skyblue':'#87ceeb',
-3135         'slateblue':'#6a5acd',
-3136         'slategray':'#708090',
-3137         'slategrey':'#708090',
-3138         'snow':'#fffafa',
-3139         'springgreen':'#00ff7f',
-3140         'steelblue':'#4682b4',
-3141         'tan':'#d2b48c',
-3142         'teal':'#008080',
-3143         'thistle':'#d8bfd8',
-3144         'tomato':'#ff6347',
-3145         'turquoise':'#40e0d0',
-3146         'violet':'#ee82ee',
-3147         'wheat':'#f5deb3',
-3148         'white':'#ffffff',
-3149         'whitesmoke':'#f5f5f5',
-3150         'yellow':'#ffff00',
-3151         'yellowgreen':'#9acd32'
-3152     };
-3153 })(require('./tree'));
-3154 var name;
-3155 
-3156 function loadStyleSheet(sheet, callback, reload, remaining) {
-3157     var sheetName = name.slice(0, name.lastIndexOf('/') + 1) + sheet.href;
-3158     var input = readFile(sheetName);
-3159     var parser = new less.Parser({
-3160         paths: [sheet.href.replace(/[\w\.-]+$/, '')]
-3161     });
-3162     parser.parse(input, function (e, root) {
-3163         if (e) {
-3164             print("Error: " + e);
-3165             quit(1);
-3166         }
-3167         callback(root, sheet, { local: false, lastModified: 0, remaining: remaining });
-3168     });
-3169 
-3170     // callback({}, sheet, { local: true, remaining: remaining });
-3171 }
-3172 
-3173 function writeFile(filename, content) {
-3174     var fstream = new java.io.FileWriter(filename);
-3175     var out = new java.io.BufferedWriter(fstream);
-3176     out.write(content);
-3177     out.close();
-3178 }
-3179 
-3180 // Prevent command line integration with Helma
-3181 if (typeof HopObject === 'undefined') {
-3182     // Command line integration via Rhino
-3183     (function (args) {
-3184         name = args[0];
-3185         var output = args[1];
-3186 
-3187         if (!name) {
-3188             print('No files present in the fileset; Check your pattern match in build.xml');
-3189             quit(1);
-3190         }
-3191         path = name.split("/");path.pop();path=path.join("/")
-3192 
-3193         var input = readFile(name);
-3194 
-3195         if (!input) {
-3196             print('lesscss: couldn\'t open file ' + name);
-3197             quit(1);
-3198         }
-3199 
-3200         var result;
-3201         var parser = new less.Parser();
-3202         parser.parse(input, function (e, root) {
-3203             if (e) {
-3204                 quit(1);
-3205             } else {
-3206                 result = root.toCSS();
-3207                 if (output) {
-3208                     writeFile(output, result);
-3209                     print("Written to " + output);
-3210                 } else {
-3211                     print(result);
-3212                 }
-3213                 quit(0);
-3214             }
-3215         });
-3216         print("done");
-3217     }(arguments));
-3218 }})();
-3219 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_DropboxClient.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_DropboxClient.js.html deleted file mode 100644 index 18d8a5a3..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_DropboxClient.js.html +++ /dev/null @@ -1,157 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileoverview Defines the DropboxClient prototype similar to node-dropbox.
- 28  * @see https://github.com/evnm/dropbox-node
- 29  */
- 30 
- 31 app.addRepository("/Users/tobi/.m2/repository/oauth/signpost/signpost-core/1.2/signpost-core-1.2.jar");
- 32 
- 33 var DropboxClient = function(id, key) {
- 34    var API_URI = "https://api.dropbox.com/0";
- 35    var CONTENT_API_URI = "https://api-content.dropbox.com/0";
- 36 
- 37    var consumer;
- 38 
- 39    var signpost = Packages.oauth.signpost;
- 40 
- 41    var provider = new signpost.basic.DefaultOAuthProvider(
- 42          API_URI + "/oauth/request_token",
- 43          API_URI + "/oauth/access_token",
- 44          API_URI + "/oauth/authorize");
- 45 
- 46    var get = function(url) {
- 47       res.debug(url);
- 48       var result;
- 49       var url = java.net.URL(url);
- 50       var request = url.openConnection();
- 51       consumer.sign(request);
- 52       var status = request.getResponseCode();
- 53       if (status === 200) {
- 54          var buffer;
- 55          var contentLength = request.contentLength;
- 56          if (request.getContentType().startsWith("text/") || contentLength === -1) {
- 57             buffer = [];
- 58             var streamReader = new java.io.InputStreamReader(request.getInputStream());
- 59             var bufferedReader = new java.io.BufferedReader(streamReader);
- 60             var line;
- 61             while ((line = bufferedReader.readLine()) !== null) {
- 62                buffer.push(line);
- 63             }
- 64             streamReader.close();
- 65             result = buffer.join("");
- 66          } else {
- 67             buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, contentLength);
- 68             var inputStream = new java.io.BufferedInputStream(request.getInputStream());
- 69             var bytesRead = 0, offset = 0;
- 70             while (offset < contentLength) {
- 71                bytesRead = inputStream.read(buffer, offset, buffer.length - offset);
- 72                if (bytesRead === -1) {
- 73                   break;
- 74                }
- 75                offset += bytesRead;
- 76             }
- 77             inputStream.close();
- 78             result = buffer;
- 79          }
- 80          request.disconnect();
- 81          return result;
- 82       }
- 83       return null;
- 84    }
- 85 
- 86    var post = function() {
- 87 
- 88    }
- 89 
- 90    this.connect = function(callback) {
- 91       if (!consumer) {
- 92          consumer = new signpost.basic.DefaultOAuthConsumer(id, key);
- 93          var url = provider.retrieveRequestToken(consumer, root.href(req.action));
- 94          return callback(url);
- 95       } else if (req.data.oauth_token) {
- 96          provider.retrieveAccessToken(consumer, req.data.oauth_token);
- 97          consumer.setTokenWithSecret(consumer.getToken(), consumer.getTokenSecret());
- 98          return callback();
- 99       }/* else if (req.data.token && req.data.secret) {
-100          consumer = new signpost.basic.DefaultOAuthConsumer(id, key);
-101          consumer.setTokenWithSecret(req.data.token, req.data.secret);
-102          res.redirect(callbackUrl);
-103       }*/
-104       return;
-105    }
-106 
-107    this.getMetadata = function(remotePath, options, callback) {
-108       if (typeof options === "function") callback = options, options = {};
-109       remotePath = escapePath(remotePath);
-110       try {
-111          var data = get(API_URI + "/metadata/dropbox" + remotePath + stringifyParams(options));
-112          return callback(null, JSON.parse(data));
-113       } catch (ex) {
-114          return callback(ex);
-115       }
-116    }
-117 
-118    this.getFile = function(remotePath, options, callback) {
-119       if (typeof options === "function") callback = options, options = {};
-120       remotePath = escapePath(remotePath);
-121       try {
-122          var data = get(CONTENT_API_URI + "/files/dropbox" + remotePath + stringifyParams(options));
-123          return callback(null, data);
-124       } catch (ex) {
-125          return callback(ex);
-126       }
-127    }
-128 
-129    this.test = function() {
-130       var data = get(CONTENT_API_URI + "/files/dropbox/PlainText/Hello.txt");
-131       res.debug(data);
-132       res.debug(stringifyParams({a: 1, b: 2}));
-133       return;
-134    }
-135 
-136    function stringifyParams(param) {
-137       var buffer = [];
-138       for (let key in param) {
-139          buffer.push(encodeURIComponent(key) + "=" + encodeURIComponent(param[key]));
-140       }
-141       return buffer.length > 0 ? "?" + buffer.join("&") : "";
-142    }
-143 
-144    function escapePath(p) {
-145       return encodeURIComponent(p).replace(/%2f/gi, '/');
-146    }
-147 
-148    return this;
-149 }
-150 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Exporter.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Exporter.js.html deleted file mode 100644 index 4bf0d390..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Exporter.js.html +++ /dev/null @@ -1,124 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Exporter namespace.
- 28  */
- 29 
- 30 /**
- 31  * The Exporter namespace provides methods for exporting a site.
- 32  * @namespace
- 33  */
- 34 var Exporter = {}
- 35 
- 36 /**
- 37  * Exports a site with the specified user’s content
- 38  * The created XML file will be added to the site’s file collection.
- 39  * @param {Site} site The site to export.
- 40  * @param {User} user The user whose content will be exported.
- 41  */
- 42 Exporter.run = function(site, user) {
- 43    try {
- 44       var file;
- 45       if (site.export_id && (file = File.getById(site.export_id))) {
- 46          File.remove.call(file);
- 47       }
- 48    
- 49       var rssUrl = site.href("rss.xml");
- 50       var baseDir = site.getStaticFile();
- 51       var member = site.members.get(user.name);
- 52    
- 53       var xml = new helma.File(baseDir, "export.xml");
- 54       xml.remove();
- 55       xml.open();
- 56 
- 57       var add = function(s) {
- 58          return xml.write(s);
- 59       }
- 60 
- 61       add('<?xml version="1.0" encoding="UTF-8"?>');
- 62       add('<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>');
- 63       add('<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">');
- 64       add('<id>tag:blogger.com,1999:blog-' + site._id + '.archive</id>');
- 65       add('<updated>' + site.modified.format(Date.ISOFORMAT) + '</updated>');
- 66       add('<title type="text">' + encodeXml(site.title) + '</title>');
- 67       add('<link rel="http://schemas.google.com/g/2005#feed" type="application/rss+xml" href="' + rssUrl + '"/>');
- 68       add('<link rel="self" type="application/rss+xml" href="' + rssUrl + '"/>');
- 69       add('<link rel="http://schemas.google.com/g/2005#post" type="application/rss+xml" href="' + rssUrl + '"/>');
- 70       add('<link rel="alternate" type="text/html" href="' + site.href() + '"/>');
- 71       add('<author>');
- 72       add('<name>' + site.creator.name + '</name>');
- 73       add('<email>' + site.creator.email + '</email>');
- 74       add('</author>');
- 75       // Currently, blogger.com does not accept other generators
- 76       //add('<generator version="' + Root.VERSION + '" uri="' + root.href() + '">Antville</generator>');
- 77       add('<generator version="7.00" uri="http://www.blogger.com">Blogger</generator>');
- 78       member.stories.forEach(function() {
- 79          add('<entry>');
- 80          add('<id>tag:blogger.com,1999:blog-' + site._id + '.post-' + this._id + '</id>');
- 81          add('<published>' + this.created.format(Date.ISOFORMAT) + '</published>');
- 82          add('<updated>' + this.modified.format(Date.ISOFORMAT) + '</updated>');
- 83          add('<title type="text">' + (this.title ? encodeXml(this.title.stripTags()) : '') + '</title>');
- 84          add('<content type="html">' + encodeXml(this.format_filter(this.text, {})) + '</content>');
- 85          add('<link rel="alternate" type="text/html" href="' + this.href() + '"></link>');
- 86          add('<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/blogger/2008/kind#post"/>');
- 87          add('<author>');
- 88          add('<name>' + this.creator.name + '</name>');
- 89          this.creator.url && add('<uri>' + this.creator.url + '</uri>');
- 90          add('<email>' + this.creator.email + '</email>');
- 91          add('</author>');
- 92          add('</entry>');
- 93       });
- 94       add('</feed>');
- 95 
- 96       xml.close();
- 97       // Provide the exported data as downloadable file
- 98       // FIXME: Adding a file to a site could be a little bit simpler :/
- 99       file = new File;
-100       file.site = site;
-101       file.update({file: {contentLength: 0}, file_origin: "file://" + 
-102             xml.getPath(), name: site.name + "-export"});
-103       site.files.add(file);
-104       file.creator = user;
-105       site.export_id = file._id;
-106    } catch (ex) {
-107       app.log(ex);
-108    } finally {
-109       xml.close();
-110       xml.remove();
-111    }
-112 
-113    // Reset the site’s export status
-114    site.job = null;
-115    return;
-116 }
-117 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Feature.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Feature.js.html deleted file mode 100644 index 6ac9e996..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Feature.js.html +++ /dev/null @@ -1,180 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileoverview Defines the Feature prototype.
- 28  * Another trial to implement modular features.
- 29  */
- 30 
- 31 /**
- 32  * Renders the main() method of a feature, if available.
- 33  * @param {Object} param The default Helma macro parameter object
- 34  * @param {String} id The identifier of the desired feature.
- 35  */
- 36 global.feature_macro = function(param, id) {
- 37    var func, feature = Feature.get(id);
- 38    if (feature && (func = feature.main)) {
- 39       func.constructor === Function && func(param);
- 40    }
- 41    return;
- 42 }
- 43 
- 44 /**
- 45  * @constructor
- 46  * @property {String} id The feature’s unique identifier.
- 47  * @param {String} id A unique identifier for the feature.
- 48  * @param {String} url The URL of the website providing further information about the feature.
- 49  * @param {Object} feature The initial properties of the feature.
- 50  */
- 51 var Feature = function(id, url, feature) {
- 52    var self = this;
- 53 
- 54    this.__defineGetter__("id", function() {return id});
- 55 
- 56    for (let i in feature) {
- 57       this[i] = feature[i];
- 58    }
- 59 
- 60    this.toString = function() {
- 61       return "[Feature: " + html.linkAsString({href: url}, id) + "]";
- 62    }
- 63 
- 64    return this;
- 65 }
- 66 
- 67 /**
- 68  * Adds a feature to the registry.
- 69  * @see Feature
- 70  * @returns {Feature}
- 71  */
- 72 Feature.add = function(id, url, feature) {
- 73    if (!id || !url) {
- 74       throw Error("Insufficient arguments");
- 75    }
- 76 
- 77    var existingFeature = Feature.get(id);
- 78    if (existingFeature) {
- 79       app.log("Warning! Overwriting already present feature with ID " + id);
- 80       Feature.remove(existingFeature);
- 81    }
- 82 
- 83    Feature.list().push(new Feature(id, url, feature));
- 84    return this;
- 85 }
- 86 
- 87 /**
- 88  * Removes a feature from the registry.
- 89  * @param {Feature} feature The feature object to be removed.
- 90  * @returns {Number} The resulting number of features still in the registry.
- 91  */
- 92 Feature.remove = function(feature) {
- 93    var features = Feature.list();
- 94    if (feature === "*") {
- 95       features.length = 0;
- 96    } else if (feature) {
- 97       var index = features.indexOf(feature);
- 98       (index > -1) && features.splice(index, 1);
- 99    }
-100    return features.length;
-101 }
-102 
-103 /**
-104  * Lists all available features in the registry.
-105  * @returns {Feature[]}
-106  */
-107 Feature.list = function() {
-108    return app.data.features;
-109 }
-110 
-111 /**
-112  * Retrieves a feature from the registry.
-113  * @param {String} id The identifier of the desired feature.
-114  * @returns {Feature}
-115  */
-116 Feature.get = function(id) {
-117    for each (let feature in Feature.list()) {
-118       if (feature.id === id) {
-119          return feature;
-120       }
-121    }
-122    return;
-123 }
-124 
-125 /**
-126  * Invokes a (callback) function for a feauture.
-127  * @param {String} id The identifier of the desired feature. '*' can be used to address all available features.
-128  * @param {Function|String} callback The callback function or the name of method of the feature.
-129  * @returns {Object}
-130  */
-131 Feature.invoke = function(id, callback) {
-132    id || (id = "*");
-133    if (callback) {
-134       var feature, method, result;
-135       var args = Array.prototype.slice.call(arguments, 2);
-136       if (id === "*") {
-137          for each (feature in Feature.list()) {
-138             method = feature[String(callback)];
-139             if (method && method.constructor === Function) {
-140                result = method.apply(feature, args);
-141             }
-142          }
-143       } else {
-144          feature = Feature.get(id);
-145          if (feature) {
-146             if (callback.constructor === Function) {
-147                result = callback.apply(feature, args);
-148             } else {
-149                method = feature[callback];
-150                if (method && method.constructor === Function) {
-151                   result = method.apply(feature, args);
-152                }
-153             }
-154          }
-155       }
-156    }
-157    return result;
-158 }
-159 
-160 /**
-161  * Wrapper for the Feature._getPermission method. All registered features will be evaluated.
-162  * @param {String} action The desired action to be invoked.
-163  * @returns {Boolean}
-164  */
-165 Feature.getPermission = function(action) {
-166    for each (let feature in Feature.list()) {
-167       let method = feature._getPermission;
-168       if (method && method.constructor === Function && method.call(this, action)) {
-169          return true;
-170       }
-171    }
-172    return false;
-173 }
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_FlexiPath.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_FlexiPath.js.html deleted file mode 100644 index 59435597..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_FlexiPath.js.html +++ /dev/null @@ -1,88 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileoverview Defines the FlexiPath prototype.
- 28  */
- 29 
- 30 var FlexiPath = function(name, parent) {
- 31    var self = this;
- 32 
- 33    this._id = name;
- 34    this._parent = parent;
- 35    this._patterns = {};
- 36 
- 37    this.__defineGetter__("patterns", function() {
- 38       var ref = this;
- 39       while (ref._parent.constructor === FlexiPath) {
- 40          ref = ref._parent;
- 41       }
- 42       return ref._patterns;
- 43    });
- 44 
- 45    this.addUrlPattern = function(pattern, callback) {
- 46       this._patterns[pattern] = callback;
- 47       return;
- 48    }
- 49 
- 50    this.href = function(action) {
- 51       var href = [];
- 52       var ref = this;
- 53       while (ref._parent === this.constructor) {
- 54          href.unshift(ref._id);
- 55          ref = ref._parent;
- 56       }
- 57       //href.push("/");
- 58       if (action) {
- 59          href.push(action);
- 60       }
- 61       return this._parent.href() + href.join("/");
- 62    }
- 63 
- 64    this.getChildElement = function(name) {
- 65       return new this.constructor(name, self);
- 66    }
- 67 
- 68    return this;
- 69 };
- 70 
- 71 FlexiPath.prototype.main_action = function() {
- 72    for (let pattern in this.patterns) {
- 73       let match;
- 74       let re = new RegExp(pattern);
- 75       if (match = req.path.match(re)) {
- 76          return this.patterns[pattern].apply(this, match);
- 77       }
- 78    }
- 79    return;
- 80 }
- 81 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Global.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Global.js.html deleted file mode 100644 index 18509f66..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Global.js.html +++ /dev/null @@ -1,1380 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines global variables and functions.
- 28  */
- 29  
- 30 app.addRepository(app.dir + "/../lib/rome-1.0.jar");
- 31 app.addRepository(app.dir + "/../lib/jdom.jar");
- 32 app.addRepository(app.dir + "/../lib/itunes-0.4.jar");
- 33 
- 34 app.addRepository("modules/core/Global.js");
- 35 app.addRepository("modules/core/HopObject.js");
- 36 app.addRepository("modules/core/Filters.js");
- 37 app.addRepository("modules/core/JSON");
- 38 app.addRepository("modules/core/Number.js");
- 39 
- 40 app.addRepository("modules/helma/File");
- 41 app.addRepository("modules/helma/Image.js");
- 42 app.addRepository("modules/helma/Html.js");
- 43 app.addRepository("modules/helma/Http.js");
- 44 app.addRepository("modules/helma/Mail.js");
- 45 app.addRepository("modules/helma/Zip.js");
- 46 
- 47 app.addRepository("modules/jala/code/Date.js");
- 48 app.addRepository("modules/jala/code/HopObject.js");
- 49 app.addRepository("modules/jala/code/ListRenderer.js");
- 50 app.addRepository("modules/jala/code/Utilities.js");
- 51 
- 52 // Adding i18n message files as repositories
- 53 (function() {
- 54     var dir = new helma.File(app.dir, "../i18n");
- 55     for each (let fname in dir.list()) {
- 56        fname.endsWith(".js") && app.addRepository(app.dir + "/../i18n/" + fname);
- 57     }
- 58 })();
- 59 // I18n.js needs to be added *after* the message files or the translations get lost
- 60 app.addRepository("modules/jala/code/I18n.js");
- 61 
- 62 // FIXME: Be careful with property names of app.data;
- 63 // they inherit all properties from HopObject!
- 64 /**
- 65  * Helma’s built-in application-wide in-memory store.
- 66  * @name app.data
- 67  * @namespace
- 68  */
- 69 /** 
- 70  * Temporary in-memory store of site callbacks. 
- 71  * They will be invoked asynchronously by an Admin method.
- 72  * @see Admin.invokeCallbacks 
- 73  * @see scheduler
- 74  * @name app.data.callbacks
- 75  */
- 76 app.data.callbacks || (app.data.callbacks = []);
- 77 /** 
- 78  * Temporary in-memory store of LogEntry instances.
- 79  * They will be made persistent asynchronously by an Admin method.
- 80  * @see Admin.commitEntries
- 81  * @see scheduler
- 82  * @name app.data.entries
- 83  * @type Array
- 84  */
- 85 app.data.entries || (app.data.entries = []);
- 86 /** 
- 87  * In-memory registry of Feature instances. 
- 88  * Features are defined in the “extra” dir.
- 89  * @name app.data.features
- 90  * @type Array
- 91  */
- 92 app.data.features || (app.data.features = []);
- 93 /** 
- 94  * In-memory e-mail message queue.
- 95  * They will be sent asynchronously by an Admin method.
- 96  * @see helma.mail.flushQueue
- 97  * @see scheduler
- 98  * @name app.data.mails
- 99  * @type Array
-100  */
-101 app.data.mails || (app.data.mails = []);
-102 /** 
-103  * In-memory store of remote requests for counting story hits.
-104  * They will be made persistent asynchronously by an Admin method.
-105  * @see Admin.commitRequests
-106  * @see scheduler
-107  * @name app.data.requests 
-108  * @type Array
-109  */
-110 app.data.requests || (app.data.requests = {});
-111 
-112 /**
-113  * The helma.File prototype is defined as a module.
-114  * @name helma.File
-115  * @namespace
-116  */
-117 /**
-118  * Helper method for recursively copying a directory and its files.
-119  * @param {helma.File} target
-120  */
-121 helma.File.prototype.copyDirectory = function(target) {
-122    /*
-123    // Strange enough, Apache commons is not really faster...
-124    var source = new java.io.File(this.toString());
-125    target = new java.io.File(target.toString());
-126    return Packages.org.apache.commons.io.FileUtils.copyDirectory(source, target);
-127    */
-128    this.list().forEach(function(name) {
-129       var file = new helma.File(this, name);
-130       if (file.isDirectory()) {
-131          file.copyDirectory(new helma.File(target, name));
-132       } else {
-133          target.makeDirectory();
-134          file.hardCopy(new helma.File(target, name));
-135       }
-136    });
-137    return;
-138 }
-139 
-140 /**
-141  * The helma.Mail prototype is defined in a module.
-142  * @name helma.Mail
-143  * @namespace
-144  */
-145 /**
-146  * Add an e-mail message to the mail queue for later sending.
-147  * @see app.data.mails
-148  * @returns {Number} The number of mails waiting in the queue
-149  */
-150 helma.Mail.prototype.queue = function() {
-151    return app.data.mails.push(this);
-152 }
-153 
-154 /**
-155  * Try to send and remove every mail instance collected in the mail queue.
-156  * @see app.data.mails
-157  */
-158 helma.Mail.flushQueue = function() {
-159    if (app.data.mails.length > 0) {
-160       app.debug("Flushing mail queue, sending " + 
-161             app.data.mails.length + " messages");
-162       var mail;
-163       while (app.data.mails.length > 0) {
-164          mail = app.data.mails.pop();
-165          mail.send();
-166          if (mail.status > 0) {
-167             app.debug("Error while sending e-mail (status " + mail.status + ")");
-168             mail.writeToFile(getProperty("smtp.dir"));
-169          }
-170       }
-171    }
-172    return;
-173 }
-174 
-175 /**
-176  * The jala.i18n namespace is defined in a module.
-177  * @name jala.i18n
-178  * @namespace
-179  */
-180 jala.i18n.setLocaleGetter(function() {
-181    return (res.handlers.site || root).getLocale();
-182 });
-183 
-184 /** 
-185  * The date format used in SQL queries and commands.
-186  * @constant 
-187  * @type String
-188  */
-189 var SQLDATEFORMAT = "yyyy-MM-dd HH:mm:ss";
-190 
-191 /** 
-192  * Regular Expression according to Jala’s HopObject.getAccessName().
-193  * @constant 
-194  * @type RegExp
-195  */
-196 var NAMEPATTERN = /[\/+\\]/;
-197 
-198 /** 
-199  * Shortcut for a function with empty body.
-200  * Used e.g. in the disableMacro() method.
-201  * @see disableMacro
-202  * @function 
-203  */
-204 var idle = new Function;
-205 
-206 /**
-207  * An instance of Helma’s HTML rendering module.
-208  * @type helma.Html
-209  */
-210 var html = new helma.Html();
-211 
-212 /** 
-213  * An instance of the LESS parser.
-214  * @type less.Parser
-215  */
-216 var lessParser = new less.Parser();
-217 
-218 /**
-219  * A collection of Java classes and namespaces required for parsing and generating RSS.
-220  * @type Object
-221  */
-222 var rome = new JavaImporter(
-223    Packages.com.sun.syndication.io,
-224    Packages.com.sun.syndication.feed.synd,
-225    Packages.com.sun.syndication.feed.module.itunes,
-226    Packages.com.sun.syndication.feed.module.itunes.types
-227 );
-228 
-229 /** 
-230  * A simple and hackish implementation of the console instance of some browsers.
-231  * @namespace
-232  */
-233 var console = {
-234     /**
-235      * Convenience method for bridging log output from the server to the client.
-236      * @methodOf console
-237      * @param {String} text This text will be displayed in the browser’s console (if available).
-238      */
-239     log: function(text) {
-240         if (!res.meta.__console__) {
-241             res.debug('<style>.helma-debug-line {border: none !important;}</style>');            
-242             res.meta.__console__ = true;
-243         }
-244         var now = formatDate(new Date, Date.ISOFORMAT);
-245         res.debug('<script>console.log("[Helma] ' + now + ' ===> ' + text + '")</script>');
-246     }
-247 }
-248 
-249 /**
-250  * The startup handler Helma is calling automatically shortly after the application has started.
-251  */
-252 function onStart() {
-253    if (typeof root === "undefined") {
-254       app.logger.error("Error in database configuration: no root site found.");
-255       return;
-256    }
-257    // This is necessary once to be sure that aspect-oriented code will be applied
-258    HopObject.prototype.onCodeUpdate && HopObject.prototype.onCodeUpdate();
-259    return;
-260 }
-261 
-262 /**
-263  * This handler is called by Helma automatically before the application is stopped.
-264  */
-265 function onStop() { /* Currently empty, just to avoid annoying log message */ }
-266 
-267 /**
-268  * Helper method to simultaneously define constants and a corresponding array of localized display names.
-269  * @param {HopObject} ctor The desired prototype constructor the constants should be defined for.
-270  * @returns {Function} 
-271  */
-272 function defineConstants(ctor /*, arguments */) {
-273    var constants = [], name;
-274    for (var i=1; i<arguments.length; i+=1) {
-275       name = arguments[i].toUpperCase().replace(/\s/g, "");
-276       ctor[name] = arguments[i].toLowerCase();
-277       constants.push(arguments[i]);
-278    }
-279    return function() {
-280       return constants.map(function(item) {
-281          return {
-282             value: item.toLowerCase(),
-283             display: gettext(item)
-284          }
-285       });
-286    };
-287 }
-288 
-289 /**
-290  * Disables a macro with the idle() function.
-291  * @see idle
-292  * @param {HopObject} ctor The prototype constructor the macro is defined for
-293  * @param {String} name The macro’s name
-294  * @returns {Function}
-295  */
-296 function disableMacro(ctor, name) {
-297    return ctor.prototype[name + "_macro"] = idle;
-298 }
-299 
-300 /**
-301  * Helma’s built-in main scheduler function.
-302  * This method is regularly called by Helma after a defined period of time.
-303  * The period is either defined by the return value or by the schedulerInterval property in app.properties.
-304  * @returns {Number} The period in milliseconds the scheduler will be called again. 
-305  */
-306 function scheduler() {
-307    helma.Mail.flushQueue();
-308    Admin.commitEntries();
-309    Admin.commitRequests();
-310    Admin.invokeCallbacks();
-311    Admin.updateDomains();
-312    Admin.updateHealth();
-313    Admin.purgeSites();
-314    return app.properties.schedulerInterval;
-315 }
-316 
-317 /**
-318  * The nightly scheduler. 
-319  * This method is called according to the cron settings in app.properties.
-320  */
-321 function nightly() {
-322    var now = new Date;
-323    if (now - (global.nightly.lastRun || -Infinity) < Date.ONEMINUTE) {
-324       return; // Avoid running twice when main scheduler runs more than once per minute
-325    }
-326    app.log("***** Running nightly scripts *****");
-327    Admin.purgeReferrers();
-328    Admin.dequeue();
-329    global.nightly.lastRun = now;
-330    return;
-331 }
-332 
-333 /**
-334  * Renders a string depending on the comparison of two values. 
-335  * If the first value equals the second value, the first result will be returned; the second result otherwise.
-336  * @example <% if <% macro %> is value then <% yes suffix=! %> else 'no :(' %>;
-337  * Note that any value or result can be a macro, too. Thus, this can be used as
-338  * a simple implementation of an if-then-else statement by using Helma macros only. 
-339  * @param {Object} param The default Helma macro parameter object
-340  * @param {String} firstValue The first value
-341  * @param {String} _is_ Syntactic sugar; should be "is" for legibility
-342  * @param {String} secondValue The second value
-343  * @param {String} _then_ Syntactic sugar; should be "then" for legibility
-344  * @param {String} firstResult The first result, ie. the value that will be 
-345  * returned if the first value equals the second one
-346  * @param {String} _else_ Syntactic sugar; should be "else" for legibility
-347  * @param {String} secondResult The second result, ie. the value that will be 
-348  * returned if the first value does not equal the second one
-349  * @returns {String} The resulting value
-350  */
-351 function if_macro(param, firstValue, _is_, secondValue, _then_, firstResult, 
-352       _else_, secondResult) {
-353    return (("" + firstValue) == ("" + secondValue)) ? firstResult : secondResult;
-354 }
-355 
-356 /**
-357  * Renders the current date and time.
-358  * @see formatDate
-359  * @param {Object} param The default Helma macro parameter object
-360  * @param {String} [format] A date format string
-361  * @returns {String} The formatted current date string
-362  */
-363 function now_macro(param, format) {
-364    return formatDate(new Date, format || param.format);
-365 }
-366 
-367 /**
-368  * Renders a link.
-369  * @see renderLink
-370  * @returns {String} The rendered HTML link element
-371  */
-372 function link_macro() {
-373    return renderLink.apply(this, arguments);
-374 }
-375 
-376 /**
-377  * Renders a skin from within a skin.
-378  * @see HopObject#skin_macro
-379  * @returns {String} The rendered skin
-380  */
-381 // FIXME: The definition with "var" is necessary; otherwise the skin_macro()
-382 // method won't be overwritten reliably. (Looks like a Helma bug.)
-383 var skin_macro = function(param, name) {
-384   return HopObject.prototype.skin_macro.apply(this, arguments);
-385 }
-386 
-387 /**
-388  * Renders a breadcrumbs navigation from the current HopObject path.
-389  * @param {Object} param The default Helma macro parameter object
-390  * @param {String} [delimiter=' : '] The string visually separating two navigation items
-391  */
-392 function breadcrumbs_macro (param, delimiter) {
-393    delimiter || (delimiter = param.separator || " : ");
-394    //html.link({href: res.handlers.site.href()}, res.handlers.site.getTitle());
-395    var offset = res.handlers.site === root ? 1 : 2;
-396    for (var item, title, i=offset; i<path.length; i+=1) {
-397       if (item = path[i]) {
-398          if (!isNaN(item._id) && item.constructor !== Layout) {
-399             continue;
-400          }
-401          if (i === path.length-1 && req.action === "main") {
-402             res.write(item.getTitle());
-403          } else {
-404             html.link({href: path[i].href()}, item.getTitle());
-405          }
-406          (i < path.length-1) && res.write(delimiter);
-407      }
-408    }
-409    if (req.action !== "main") {
-410       res.write(delimiter);
-411       res.write(gettext(req.action.titleize()));
-412    }
-413    return;
-414 }
-415 
-416 /**
-417  * Helper macro for checking if a user session is authenticated (logged in).
-418  * Returns true if user is logged in, false otherwise.
-419  * @returns {Boolean}
-420  */
-421 function user_macro() {
-422    return !!session.user;
-423 }
-424 
-425 /**
-426  * Renders the URL of, a link to or an arbitrary skin of a story.
-427  * @param {Object} param The default Helma macro parameter object
-428  * @param {String} [param.skin='embed'] The name of a story skin
-429  * @param {String} id The id or path of the desired story
-430  * @param {String} [mode] Either of 'url' or 'link'
-431  * @example <% story 1810 skin=preview %> Story #1810 in preview skin
-432  * <% story blog/1971 url %> URL of the story of site “blog”
-433  */
-434 function story_macro(param, id, mode) {
-435    var story = HopObject.getFromPath(id, "stories");
-436    if (!story || !story.getPermission("main")) {
-437       return;
-438    }
-439 
-440    switch (mode) {
-441       case "url":
-442       res.write(story.href());
-443       break;
-444       case "link":
-445       html.link({href: story.href()}, story.getTitle());
-446       break;
-447       default:
-448       story.renderSkin("Story#" + (param.skin || "embed"));
-449    }
-450    return;
-451 }
-452 
-453 /**
-454  * Renders the URL or an arbitrary skin of a file.
-455  * @param {Object} param The default Helma macro parameter object
-456  * @param {String} [param.skin='main'] The name of a file skin
-457  * @param {String} id The id or path of the desired file
-458  * @param {String} [mode] Currently only possible value is 'url'
-459  * @example <% file 1810 url %> URL of file #1810
-460  * <% file blog/text.pdf skin=preview %> File in site “blog” using preview skin
-461  * <% file /image.raw %> Static file of root site
-462  */
-463 function file_macro(param, id, mode) {
-464    if (!id) {
-465       return;
-466    }
-467 
-468    var file;
-469    if (id.startsWith("/")) {
-470       name = id.substring(1);
-471       if (mode === "url") {
-472          res.write(root.getStaticUrl(name));
-473       } else {
-474          file = root.getStaticFile(name);
-475          res.push();
-476          File.prototype.contentLength_macro.call({
-477             contentLength: file.getLength()
-478          });
-479          res.handlers.file = {
-480             href: root.getStaticUrl(name),
-481             name: name,
-482             contentLength: res.pop()
-483          };
-484          File.prototype.renderSkin("File#main");
-485       }
-486       return;
-487    }
-488 
-489    file = HopObject.getFromPath(id, "files");
-490    if (!file) {
-491       return;
-492    }
-493    if (mode === "url") {
-494       res.write(file.getUrl());
-495    } else {
-496       file.renderSkin("File#" + (param.skin || "main"));
-497    }
-498    return;
-499 }
-500 
-501 /**
-502  * Renders the URL, a thumbnail or an HTML element of an image.
-503  * @see Image#thumbnail_macro
-504  * @see Image#render_macro
-505  * @param {Object} param The default Helma macro parameter object
-506  * @param {String} id The id or path of the desired image
-507  * @param {String} [mode] Either of 'url' or 'thumbnail'
-508  */
-509 function image_macro(param, id, mode) {
-510    if (!id) {
-511       return;
-512    }
-513 
-514    var image;
-515    if (id.startsWith("/")) {
-516       var name = id.substring(1);
-517       image = Images.Default[name] || Images.Default[name + ".gif"];
-518    } else {
-519       image = HopObject.getFromPath(id, "images");
-520       // FIXME: Could fallback be replaced with CSS background-image?
-521       if (!image && param.fallback) {
-522          image = HopObject.getFromPath(param.fallback, "images");
-523       }
-524    }
-525 
-526    if (!image) {
-527       return;
-528    }
-529    
-530    switch (mode) {
-531       case "url":
-532       res.write(image.getUrl());
-533       break;
-534       case "thumbnail":
-535       case "popup":
-536       var url = image.getUrl();
-537       html.openTag("a", {href: url});
-538       // FIXME: Bloody popups belong to compatibility layer
-539       (mode === "popup") && (param.onclick = 'javascript:openPopup(\'' + 
-540             url + '\', ' + image.width + ', ' + image.height + '); return false;')
-541       image.thumbnail_macro(param);
-542       html.closeTag("a");
-543       break;
-544       default:
-545       image.render_macro(param);
-546    }
-547    return;
-548 }
-549 
-550 /**
-551  * Renders the URL, a link or the visual representation of a poll.
-552  * @param {Object} param The default Helma macro parameter object
-553  * @param {String} id The id or path of the desired poll
-554  * @param {String} mode Either of 'url' or 'link'
-555  */
-556 function poll_macro(param, id, mode) {
-557    if (!id) {
-558       return;
-559    }
-560 
-561    var poll = HopObject.getFromPath(id, "polls");
-562    if (!poll) {
-563       return;
-564    }
-565 
-566    switch (mode) {
-567       case "url":
-568       res.write(poll.href());
-569       break;
-570       case "link":
-571       html.link({
-572          href: poll.href(poll.status === Poll.CLOSED ? "result" : "")
-573       }, poll.question);
-574       break;
-575       default:
-576       if (poll.status === Poll.CLOSED || mode === "results")
-577          poll.renderSkin("$Poll#results", {});
-578       else {
-579          poll.renderSkin("$Poll#main", {});
-580       }
-581    }
-582    return;
-583 }
-584 
-585 /**
-586  * The “swiss army knife” list macro. Lists collections of HopObjects.
-587  * There is hardly a thing it cannot do… but it’s kind of messy, though.
-588  * @param {Object} param The default Helma macro parameter object
-589  * @param {String} [param.skin=preview] The name of a skin suitable for the collection 
-590  * @param {String} id The identifier of the desired collection 
-591  * @param {Number} [limit=25] The maximum amount of items listed
-592  * @example <% list sites %>
-593  * <% list updates 10 %>
-594  * <% list blog/comments %>
-595  * <% list featured skin=promotion %>
-596  * <% list images %>
-597  * <% list postings %>
-598  * <% list stories %>
-599  * <% list tags %>
-600  */
-601 function list_macro(param, id, limit) {
-602    if (!id) {
-603       return;
-604    }
-605    
-606    var max = Math.min(limit || 25, 50);
-607    var collection, skin;
-608    if (id === "sites") {
-609       collection = root.sites.list(0, max);
-610       skin = "Site#preview";
-611    } else if (id === "updates") {
-612       collection = root.updates.list(0, limit);
-613       skin = "Site#preview";
-614    } else {
-615       var site;
-616       var parts = id.split("/");
-617       if (parts.length > 1) {
-618          type = parts[1];
-619          site = root.sites.get(parts[0]);
-620       } else {
-621          type = parts[0];
-622       }
-623 
-624       site || (site = res.handlers.site);
-625       var filter = function(item, index) {
-626          return index < max && item.getPermission("main");
-627       }
-628       
-629       var commentFilter = function(item) {
-630          if (item.story.status !== Story.CLOSED && 
-631                item.site.commentMode !== Site.DISABLED &&
-632                item.story.commentMode !== Story.CLOSED) {
-633             return true;
-634          }
-635          return false;
-636       }
-637 
-638       switch (type) {
-639          case "comments":
-640          if (site.commentMode !== Site.DISABLED) {
-641             var comments = site.stories.comments;
-642             collection = comments.list().filter(filter);
-643             skin = "Story#preview";
-644          }
-645          break;
-646          
-647          case "featured":
-648          collection = site.stories.featured.list(0, max);
-649          prototype = "Story#preview";
-650          break;
-651          
-652          case "images":
-653          collection = site.images.list(0, max);
-654          prototype = "Image#preview";
-655          break;
-656          
-657          case "postings":
-658          content = site.stories.union;
-659          collection = content.list().filter(filter).filter(function(item) {
-660             if (item.constructor === Comment) {
-661                return commentFilter(item);
-662             }
-663             return true;
-664          });
-665          prototype = "Story#preview";
-666          break;
-667          
-668          case "stories":
-669          var stories = site.stories.recent;
-670          var counter = 0;
-671          collection = stories.list().filter(function(item, index) {
-672             return item.constructor === Story && filter(item, counter++);
-673          });
-674          prototype = "Story#preview";
-675          break;
-676          
-677          case "tags":
-678          return site.tags.list_macro(param, param.skin || "$Tag#preview");
-679          break;
-680          
-681          default:
-682          break;
-683       }
-684    }
-685    for each (var item in collection) {
-686       item.renderSkin(param.skin || skin);
-687    }
-688    return;
-689 }
-690 
-691 /**
-692  * Defines and renders a value.
-693  * This works like a variable that can be set in one skin and rendered in another –
-694  * which must be rendered later than the one setting the variable.
-695  * @param {Object} param The default Helma macro parameter object.
-696  * @param {String} name The name of the value.
-697  * @param {String} [value] The desired value. 
-698  * If no value is given, the current value will be rendered.
-699  * @example <% value foo=bar %> Defines res.meta.values.foo = bar
-700  * @example <% value foo %> Renders the value of res.meta.value.foo
-701  */
-702 function value_macro(param, name, value) {
-703    if (!name) {
-704       return;
-705    }
-706    name = name.toLowerCase();
-707    if (!value) {
-708       res.write(res.meta.values[name]);
-709    } else {
-710       //res.write("/* set " + name + " to " + value + " */");
-711       res.meta.values[name] = value;
-712    }
-713    return;
-714 }
-715 
-716 /**
-717  * Renders either a skin or the URL of a random site, story or image.
-718  * The corresponding story and image collections will be retrieved either from res.handlers.site or 
-719  * from the prefixed “type” argument (e.g. “mySite/story”).
-720  * Furthermore, both collections can be reduced to a specific tag or gallery, resp.
-721  * @param {Object} param The default Helma macro parameter object.
-722  * @param {String} [param.skin = "preview"] The name of the skin to render in default output mode.
-723  * @param {String} [param.tag] Reduce the story collection to stories with the specified tag.
-724  * @param {String} [param.gallery] Reduce the image collection to images from the specified gallery.
-725  * @param {String} type The type of object to render. Either of “site”, “story” or “image”.
-726  * It can be prepended by a site name delimited by a slash: “mySite/image”.
-727  * @param {String} [mode] Set the output mode. Currently, only “url” is supported.
-728  * @example <% random site skin=preview %> Renders the preview skin of a random site.
-729  * <% random story tag=essay url %> Renders the URL of a random story tagged with “essay”.
-730  * <% random foo/image gallery=cat %> Renders the default skin of a random image in the gallery “cat“ of the site “foo”.
-731  */
-732 function random_macro(param, type, mode) {
-733    var getRandom = function(n) {
-734       return Math.floor(Math.random() * n);
-735    };
-736 
-737    var site = res.handlers.site;
-738 
-739    if (type === "site") {
-740       site = root.sites.get(getRandom(root.sites.size()));
-741       mode === 'url' ? res.write(site.href()) : 
-742             site.renderSkin(param.skin || "Site#preview");
-743       return;
-744    }
-745 
-746    var parts = type.split("/");
-747    if (parts.length > 1) {
-748       site = root.sites.get(parts[0] || 'www');
-749       type = parts[1];
-750    } else {
-751       type = parts[0];
-752    }
-753 
-754    if (!site) {
-755       return;
-756    }
-757 
-758    switch (type) {
-759       case "story":
-760       case "stories":
-761       var stories = param.tag ? site.stories.tags.get(param.tag) : 
-762             site.stories.featured;
-763       var story = stories && stories.get(getRandom(stories.size()));
-764       if (story) {
-765          param.tag && (story = story.tagged);
-766          mode === 'url' ? res.write(story.href()) : 
-767                story.renderSkin(param.skin || "Story#preview");
-768       }
-769       break;
-770 
-771       case "image":
-772       case "images":
-773       var images = param.gallery ? site.images.galleries.get(param.gallery) : 
-774             site.images;
-775       var image = images && images.get(getRandom(images.size()));
-776       if (image) {
-777          param.gallery && (image = image.tagged);
-778          mode === 'url' ? res.write(image.href()) : 
-779                image.renderSkin(param.skin || "Image#preview");
-780       }
-781       break;
-782    }
-783    return;
-784 }
-785 
-786 /**
-787  * Renders the Antville version string.
-788  * @param {Object} param The default Helma macro parameter object.
-789  * @param {String} [type = 'default'] The type of version string.
-790  * @see Root.VERSION
-791  */
-792 function version_macro(param, type) {
-793    var version = Root.VERSION;
-794    var result = version[type || "default"];
-795    return result || version;
-796 }
-797 
-798 /**
-799  * Renders a string vertically in the global listItemFlag skin.
-800  * @param {Object} param The default Helma macro parameter object.
-801  * @param {String} str The string to be rendered.
-802  */
-803 function listItemFlag_macro(param, str) {
-804    res.push();
-805    for (var i=0; i<str.length; i+=1) {
-806       res.write(str.charAt(i));
-807       res.write("<br />");
-808    }
-809    renderSkin("$Global#listItemFlag", {text: res.pop()});
-810    return;
-811 }
-812 
-813 
-814 /**
-815  * A simple Helma macro filter returning one of two possible values depending on which one is truthy.
-816  * @param {Object} value The original (desired) value.
-817  * @param {Object} param The default Helma macro parameter object.
-818  * @param {Object} defaultValue The fallback value for use if the original value should be untruthy.
-819  * @returns {Object} The value argument if truthy, the defaultValue argument otherwise.
-820  */
-821 function default_filter(value, param, defaultValue) {
-822    return value || defaultValue;
-823 }
-824 
-825 /**
-826  * Helma macro filter wrapping the {@link Date#getAge} method.
-827  * @see Date#getAge
-828  * @param {Date} value The original date.
-829  * @param {Object} param The default Helma macro parameter object.
-830  * @returns {String} The resulting age string of the original date.
-831  */
-832 function age_filter(value, param) {
-833    if (!value || value.constructor !== Date) {
-834       return value;
-835    }
-836    return value.getAge()
-837 }
-838 
-839 /**
-840  * Helma macro filter wrapping the {@link renderLink} method.
-841  * @param {String} text The link text.
-842  * @param {String} param The default Helma macro parameter object.
-843  * @param {Object} [url = text] The link URL.
-844  * @returns {String} The rendered link element
-845  * @see renderLink
-846  */
-847 function link_filter(text, param, url) {
-848    if (text) {
-849       url || (url = text);
-850       res.push();
-851       renderLink(param, url, text);
-852       return res.pop();
-853    }
-854    return;
-855 }
-856 
-857 /**
-858  * Helma macro filter wrapping the global formatting methods.
-859  * @see formatNumber
-860  * @see formatDate
-861  * @param {Object} value The original value.
-862  * @param {Object} param The default Helma macro parameter object.
-863  * @param {String} pattern A formatting pattern suitable for the formatting method.
-864  * @param {String} [type] Deprecated.
-865  * @returns {String} The formatted string.
-866  */
-867 function format_filter(value, param, pattern, type) {
-868    if (!value && value !== 0) {
-869       return;
-870    }
-871    var f = global["format" + value.constructor.name];
-872    if (f && f.constructor === Function) {
-873       return f(value, pattern || param.pattern, type);
-874    }
-875    return value;
-876 }
-877 
-878 /**
-879  * Macro filter for clipping output.
-880  * @param {String} input The original input.
-881  * @param {Object} param The default Helma macro parameter object.
-882  * @param {Number} [limit = 20] The maximum amount of text parts to be displayed.
-883  * @param {String} [clipping = '...'] The replacement for the clipped portions of the text.
-884  * @param {String} [delimiter = '\\s'] The regular expression string used to split the text into parts.
-885  * @returns {String} The clipped result.
-886  */
-887 function clip_filter(input, param, limit, clipping, delimiter) {
-888    var len = 0;
-889    if (input) {
-890       len = input.length;
-891       input = input.stripTags();
-892    }
-893    input || (input = ngettext("({0} character)", "({0} characters)", len));
-894    limit || (limit = 20);
-895    clipping || (clipping = "...");
-896    delimiter || (delimiter = "\\s");
-897    return String(input || "").head(limit, clipping, delimiter);
-898 }
-899 
-900 /**
-901  * Renders an HTML <a> element from a URL or HopObject.
-902  * @see helma.Html#link
-903  * @see HopObject#link_macro
-904  * @param {Object} param The default Helma macro parameter object.
-905  * @param {String} [param.title] An optional link title for use in the “title” attribute.
-906  * @param {String} url A complete or partial URL string. Optional if “handler” is specified.
-907  * @param {String} [text] An optional link text. 
-908  * @param {HopObject} handler The HopObject used as base URL. Optional if “url” is specified.
-909  */
-910 function renderLink(param, url, text, handler) {
-911    url || (url = param.url || String.EMPTY);
-912    text || (text = param.text || url);
-913    if (!text || (handler && !handler.href)) {
-914       return;
-915    }
-916    if (url === "." || url === "main") {
-917       url = String.EMPTY;
-918    }
-919    delete param.url;
-920    delete param.text;
-921    param.title || (param.title = String.EMPTY);
-922    if (!handler || url.contains(":")) {
-923       param.href = url;
-924    } else if (url.contains("/") || url.contains("?") || url.contains("#")) {
-925       var parts = url.split(/(\/|\?|#)/);
-926       param.href = handler.href(parts[0]) + parts.splice(1).join(String.EMPTY);
-927    } else {
-928       param.href = handler.href(url);
-929    }
-930    html.link(param, text);
-931    return;
-932 }
-933 
-934 /**
-935  * Validates if a string is suitable for e-mail messaging.
-936  * @see String#isEmail
-937  * @param {String} str The string to be validated.
-938  * @returns {String|null} The e-mail string if valid, null otherwise.
-939  */
-940 function validateEmail(str) {
-941 	if (str) {
-942       if (str.isEmail()) {
-943          return str;
-944       }
-945    }
-946    return null;
-947 }
-948 
-949 /**
-950  * Validates if a string is suitable for requesting a URL.
-951  * @param {String} str The string to be validated.
-952  * @returns {String|null} The URL string if valid, null otherwise.
-953  */
-954 function validateUrl(str) {
-955    if (str) {
-956       if (str.isUrl()) {
-957          return str;
-958       } else if (str.isEmail()) {
-959          return "mailto:" + str;
-960       } else {
-961          return null;
-962       }
-963    }
-964    return null;
-965 }
-966 
-967 /**
-968  * Surrounds a string by programmer quotes (").
-969  * @param {String} str The original string.
-970  * @returns {String} The processed string.
-971  */
-972 function quote(str) {
-973    if (/[\W\D]/.test(str)) {
-974       str = '"' + str + '"';
-975    }
-976    return str;
-977 }
-978 
-979 /**
-980  * Formats a number according to a pattern and the site’s locale setting.
-981  * @param {Number} number The original number.
-982  * @param {String} pattern The formatting pattern.
-983  * @returns {String} The formatted number string.
-984  */
-985 function formatNumber(number, pattern) {
-986    return Number(number).format(pattern, res.handlers.site.getLocale());
-987 }
-988 
-989 /**
-990  * Formats a date according to a formatting string and the site’s locale and time zone. 
-991  * @param {Date} date The original date.
-992  * @param {String} [format = "full"] The formatting string. Either a {@link http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html Java SimpleDateFormat pattern} or of “short”, “medium”, “long”, “full”, “date”, “time”, “iso” or “text”.
-993  * @returns {String} The formatted date string.
-994  */
-995 function formatDate(date, format) {
-996    if (!date) {
-997       return null;
-998    }
-999    
-1000    var pattern, 
-1001          site = res.handlers.site,
-1002          locale = site.getLocale();
-1003 
-1004    switch (format) {
-1005       case null:
-1006       case undefined:
-1007       format = "full"; // Caution! Passing through to next case block!
-1008       case "short":
-1009       case "medium":
-1010       case "long":
-1011       case "full":
-1012       var type = java.text.DateFormat[format.toUpperCase()];
-1013       pattern = java.text.DateFormat.getDateTimeInstance(type, type, locale).toPattern();
-1014       break;
-1015       
-1016       case "date":
-1017       var type = java.text.DateFormat.FULL
-1018       pattern = java.text.DateFormat.getDateInstance(type, locale).toPattern();
-1019       break;
-1020 
-1021       case "time":
-1022       var type = java.text.DateFormat.SHORT;
-1023       pattern = java.text.DateFormat.getTimeInstance(type, locale).toPattern();
-1024       break;
-1025       
-1026       case "iso":
-1027       pattern = Date.ISOFORMAT;
-1028       break;
-1029       
-1030       case "text":
-1031       var text,
-1032             now = new Date,
-1033             diff = now - date;
-1034       if (diff < 0) {
-1035          // FIXME: Do something similar for future dates
-1036          text = formatDate(date);
-1037       } else if (diff < Date.ONEMINUTE) {
-1038          text = gettext("Right now");
-1039       } else if (diff < Date.ONEHOUR) {
-1040          text = ngettext("{0} minute ago", "{0} minutes ago",
-1041                parseInt(diff / Date.ONEMINUTE, 10));
-1042       } else if (diff < Date.ONEDAY) {
-1043          text = ngettext("{0} hour ago", "{0} hours ago",
-1044                parseInt(diff / Date.ONEHOUR, 10));
-1045       } else if (diff < 2 * Date.ONEDAY) {
-1046          text = gettext("Yesterday");
-1047       } else {
-1048          text = ngettext("{0} day ago", "{0} days ago",
-1049                parseInt(diff / Date.ONEDAY, 10));
-1050       }
-1051       return text;
-1052       
-1053       default:
-1054       pattern = format;
-1055    }
-1056 
-1057    try {
-1058       return date.format(pattern, locale, site.getTimeZone());
-1059    } catch (ex) {
-1060       return "[Invalid date format]";
-1061    }
-1062 
-1063    return String.EMPTY;
-1064 }
-1065 
-1066 /**
-1067  * Injects the XSLT stylesheet declaration into an XML string until Mozilla developers will have mercy.
-1068  * @param {String} xml An XML string
-1069  * @returns {String} An XML string containing the XSLT stylesheet declaration
-1070  */
-1071 function injectXslDeclaration(xml) {
-1072    res.push();
-1073    renderSkin("Global#xslDeclaration");
-1074    return xml.replace(/(\?>\r?\n?)/, "$1" + res.pop());
-1075 }
-1076 
-1077 /**
-1078  * General mail sending function. Mails will be queued in app.data.mails.
-1079  * @param {Object} recipient The recipient's email addresses
-1080  * @param {String} subject The e-mail's subject
-1081  * @param {String} body The body text of the e-mail
-1082  * @returns {Number} The status code of the underlying helma.Mail instance
-1083  */
-1084 function sendMail(recipient, subject, body, options) {
-1085    options || (options = {});
-1086    if (!recipient || !body) {
-1087       throw Error("Insufficient arguments in method sendMail()");
-1088    }
-1089    var mail = new helma.Mail(getProperty("smtp", "localhost"), 
-1090          getProperty("smtp.port", "25"));
-1091    mail.setFrom(root.replyTo || "root@localhost");
-1092    if (recipient instanceof Array) {
-1093       for (var i in recipient) {
-1094          mail.addBCC(recipient[i]);
-1095       }
-1096    } else {
-1097       mail.addTo(recipient);
-1098    }
-1099    mail.setSubject(subject);
-1100    mail.setText(body);
-1101    if (options.footer !== false) { // It is the exception to have no footer
-1102       mail.addText(renderSkinAsString("$Global#mailFooter"));
-1103    }
-1104    mail.queue();
-1105    return mail.status;
-1106 }
-1107 
-1108 /**
-1109  * Retrieves the locale object from a language string.
-1110  * @param {String} language The name of the language.
-1111  * @returns {java.util.Locale} The corresponding locale object.
-1112  */
-1113 function getLocale(language) {
-1114    return new java.util.Locale(language || "english");
-1115 }
-1116 
-1117 /**
-1118  * Creates an array of all available Java locales sorted by their names.
-1119  * @param {String} language The optional language of the locales
-1120  * @returns {Object[]} A sorted array containing the corresponding locales
-1121  */
-1122 function getLocales(language) {
-1123    var result = [], locale, localeString;
-1124    var locales = java.util.Locale.getAvailableLocales();
-1125    for (var i in locales) {
-1126       locale = locales[i];
-1127       localeString = locale.toString();
-1128       if (!localeString.contains("_")) {
-1129          result.push({
-1130             value: localeString,
-1131             display: locale.getDisplayName(locale),
-1132             "class": jala.i18n.getCatalog(jala.i18n.getLocale(localeString)) ? "translated" : ""
-1133          });
-1134       }
-1135    }
-1136    result.sort(new String.Sorter("display"));
-1137    return result;
-1138 }
-1139 
-1140 /**
-1141  * This method returns an array of structs providing two properties each:
-1142  * <code>value</code> – a unique time zone ID
-1143  * <code>display</code> – a (more) user-friendly string
-1144  * Although Java is great in providing all time zones one can imagine, this
-1145  * vast amount of choices fails to support easy time zone selection.
-1146  * Furthermore, the L10n features of the java.util.TimeZone class are insufficient
-1147  * as they do only translate the generic string returned by the getDisplayName()
-1148  * method (e.g. Central European Time), not the more usable time zone IDs 
-1149  * (e.g. Europe/Vienna). Thus, time zone selection in Antville is rather limited.
-1150  * @param {String} language
-1151  * @returns {Object[]} A sorted array containing the corresponding timezones
-1152  */
-1153 function getTimeZones(language) {
-1154    var result = [],
-1155          timeZones = [],
-1156          locale = getLocale(language),
-1157          ids = java.util.TimeZone.getAvailableIDs();
-1158 
-1159    for each (let id in ids) {
-1160       // Exclude confusing time zones
-1161       if (id.length < 4 || !id.contains("/") || 
-1162             id.startsWith("Etc") || id.startsWith("System")) {
-1163          continue;
-1164       }
-1165       let timeZone = java.util.TimeZone.getTimeZone(id);
-1166       // Exclude more confusing time zones
-1167       if (timeZone.getDisplayName().startsWith("GMT")) {
-1168          continue;
-1169       }
-1170       result.push({
-1171          value: timeZone.getID(),
-1172          display: timeZone.getID().replace(/_/g, String.SPACE)
-1173       })
-1174       timeZones.push(timeZone);
-1175    }
-1176 
-1177    return result.sort(new String.Sorter("display"));
-1178 }
-1179 // FIXME:
-1180 /**
-1181  * Replaces <img> elements in a string with <a> elements to fix RSS output which is not capable of displaying images.
-1182  * @param {String} rss The original RSS output.
-1183  * @returns {String} The transformed RSS output.
-1184  */
-1185 function fixRssText(rss) {
-1186    var re = new RegExp("<img src\\s*=\\s*\"?([^\\s\"]+)?\"?[^>]*?(alt\\s*=\\s*\"?([^\"]+)?\"?[^>]*?)?>", "gi");
-1187    rss = rss.replace(re, "[<a href=\"$1\" title=\"$3\">Image</a>]");
-1188    return rss;
-1189 }
-1190 
-1191 // FIXME:
-1192 /**
-1193  * @ignore
-1194  * @param {Object} src
-1195  */
-1196 function doWikiStuff (src) {
-1197    // robert, disabled: didn't get the reason for this:
-1198    // var src= " "+src;
-1199    if (src == null || !src.contains("<*"))
-1200       return src;
-1201 
-1202    // do the Wiki link thing, <*asterisk style*>
-1203    var regex = new RegExp ("<[*]([^*]+)[*]>");
-1204    regex.ignoreCase=true;
-1205    
-1206    var text = "";
-1207    var start = 0;
-1208    while (true) {
-1209       var found = regex.exec (src.substring(start));
-1210       var to = found == null ? src.length : start + found.index;
-1211       text += src.substring(start, to);
-1212       if (found == null)
-1213          break;
-1214       var name = ""+(new java.lang.String (found[1])).trim();
-1215       var item = res.handlers.site.topics.get (name);
-1216       if (item == null && name.lastIndexOf("s") == name.length-1)
-1217          item = res.handlers.site.topics.get (name.substring(0, name.length-1));
-1218       if (item == null || !item.size())
-1219          text += format(name)+" <small>[<a href=\""+res.handlers.site.stories.href("create")+"?topic="+escape(name)+"\">define "+format(name)+"</a>]</small>";
-1220       else
-1221          text += "<a href=\""+item.href()+"\">"+name+"</a>";
-1222       start += found.index + found[1].length+4;
-1223    }
-1224    return text;
-1225 }
-1226 
-1227 // FIXME: Rewrite with jala.ListRenderer?
-1228 /**
-1229  * Renders an HTML list from a HopObject collection or an array.
-1230  * @param {HopObject|Array} collection The original collection of objects.
-1231  * @param {Function|Skin} funcOrSkin A skin name or a rendering function.
-1232  * @param {Number} itemsPerPage The amount of rendered items per page.
-1233  * @param {Number} pageIdx The current page index.
-1234  * @returns {String} The rendered list.
-1235  */
-1236 function renderList(collection, funcOrSkin, itemsPerPage, pageIdx) {
-1237    var currIdx = 0, item;
-1238    var isArray = collection instanceof Array;
-1239    var stop = size = isArray ? collection.length : collection.size();
-1240 
-1241    if (itemsPerPage) {
-1242       var totalPages = Math.ceil(size/itemsPerPage);
-1243       if (isNaN(pageIdx) || pageIdx > totalPages || pageIdx < 0) {
-1244          pageIdx = 0;
-1245       }
-1246       currIdx = pageIdx * itemsPerPage;
-1247       stop = Math.min(currIdx + itemsPerPage, size);
-1248    }
-1249 
-1250    var isFunction = (funcOrSkin instanceof Function) ? true : false;
-1251    res.push();
-1252    while (currIdx < stop) {
-1253       item = isArray ? collection[currIdx] : collection.get(currIdx);
-1254       isFunction ? funcOrSkin(item) : item.renderSkin(funcOrSkin);
-1255       currIdx += 1;
-1256    }
-1257    return res.pop();
-1258 }
-1259 
-1260 // FIXME: Rewrite using jala.ListRenderer or rename (eg. renderIndex)
-1261 /**
-1262  * Renders the page navigation for a collection of HopObjects.
-1263  * @param {HopObject|Array|Number} collectionOrSize A collection or just the size of a collection.
-1264  * @param {String} url The base URL for rendering links.
-1265  * @param {Number} itemsPerPage The amount of rendered items per page.
-1266  * @param {Number} pageIdx The current page index.
-1267  * @returns {String} The rendered page navigation.
-1268  */
-1269 function renderPager(collectionOrSize, url, itemsPerPage, pageIdx) {
-1270    // Render a single item for the navigation bar
-1271    var renderItem = function(text, cssClass, url, page) {
-1272       var param = {"class": cssClass};
-1273       if (!url) {
-1274          param.text = text;
-1275       } else {
-1276          if (url.contains("?"))
-1277             param.text = html.linkAsString({href: url + "&page=" + page}, text);
-1278          else
-1279             param.text = html.linkAsString({href: url + "?page=" + page}, text);
-1280       }
-1281       renderSkin("$Global#pagerItem", param);
-1282       return;
-1283    }
-1284 
-1285    var maxItems = 10;
-1286    var size = 0;
-1287    if (collectionOrSize instanceof Array) {
-1288       size = collectionOrSize.length;
-1289    } else if (collectionOrSize instanceof HopObject) {
-1290       size = collectionOrSize.size();
-1291    } else if (!isNaN(collectionOrSize)) {
-1292       size = parseInt(collectionOrSize, 10);
-1293    }
-1294    var lastPageIdx = Math.ceil(size/itemsPerPage)-1;
-1295    // If there's just one page no navigation will be rendered
-1296    if (lastPageIdx <= 0) {
-1297       return null;
-1298    }
-1299 
-1300    // Initialize the parameter object
-1301    var param = {};
-1302    var pageIdx = parseInt(pageIdx, 10);
-1303    // Check if the passed index is correct
-1304    if (isNaN(pageIdx) || pageIdx > lastPageIdx || pageIdx < 0) {
-1305       pageIdx = 0;
-1306    }
-1307    param.display = ((pageIdx * itemsPerPage) + 1) + "-" + 
-1308          (Math.min((pageIdx * itemsPerPage) + itemsPerPage, size));
-1309    param.total = size;
-1310 
-1311    // Render the navigation-bar
-1312    res.push();
-1313    (pageIdx > 0) && renderItem("[–]", "pageNavItem", url, pageIdx-1);
-1314    var offset = Math.floor(pageIdx / maxItems) * maxItems;
-1315    (offset > 0) && renderItem("[..]", "pageNavItem", url, offset-1);
-1316    var currPage = offset;
-1317    var stop = Math.min(currPage + maxItems, lastPageIdx+1);
-1318    while (currPage < stop) {
-1319       if (currPage === pageIdx) {
-1320          renderItem("[" + (currPage +1) + "]", "pageNavSelItem");
-1321       } else {
-1322          renderItem("[" + (currPage +1) + "]", "pageNavItem", url, currPage);
-1323       }
-1324       currPage += 1;
-1325    }
-1326    if (currPage < lastPageIdx) {
-1327       renderItem("[..]", "pageNavItem", url, offset + maxItems);
-1328    }
-1329    if (pageIdx < lastPageIdx) {
-1330       renderItem("[+]", "pageNavItem", url, pageIdx +1);
-1331    }
-1332    param.pager = res.pop();
-1333    return renderSkinAsString("$Global#pager", param);
-1334 }
-1335 
-1336 /**
-1337  * Transforms an english plural form of a noun into its singular form.
-1338  * @param {String} plural The noun in plural form.
-1339  * @returns {String} The english singular form of the original input.
-1340  */
-1341 function singularize(plural) {
-1342    if (plural.endsWith("ies")) {
-1343       return plural.substring(0, plural.length-3) + "y";
-1344    }
-1345    return plural.substring(0, plural.length-1);
-1346 }
-1347 
-1348 /**
-1349  * Transforms an english singular form of a noun into its plural form.
-1350  * @param {String} singular The noun in singular form.
-1351  * @returns {String} The english plural form of the original input.
-1352  */
-1353 function pluralize(singular) {
-1354    if (singular.endsWith("y")) {
-1355       return singular.substring(0, singular.length-1) + "ies";
-1356    }
-1357    return singular + "s";
-1358 }
-1359 
-1360 /**
-1361  * Halts the execution of the thread for the specified amount of milliseconds.
-1362  * Use only for debugging.
-1363  * @param {Number} millis The amount of milliseconds.
-1364  */
-1365 var wait = function(millis) {
-1366    millis || (millis = Date.ONESECOND);
-1367    var now = new Date;
-1368    while (new Date - now < millis) {
-1369       void null;
-1370    }
-1371    return;
-1372 }
-1373 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Importer.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Importer.js.html deleted file mode 100644 index 38ce9a0a..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Importer.js.html +++ /dev/null @@ -1,82 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Importer namespace.
- 28  */
- 29 
- 30 /**
- 31  * The Importer namespace provides methods for importing a site.
- 32  * @namespace
- 33  */
- 34 var Importer = {}
- 35 
- 36 /**
- 37  * Imports a site and its content for the specified user.
- 38  * @param {Site} site The site to import.
- 39  * @param {User} user The user who will become the creator of the site’s imported content.
- 40  */
- 41 Importer.run = function(site, user) {
- 42    try {
- 43       var xml = File.getById(site.import_id);
- 44       if (xml) {
- 45          var file = new java.io.File(xml.getFile());
- 46          var reader = new rome.XmlReader(file);
- 47          var input = new rome.SyndFeedInput(true);
- 48          var feed = input.build(reader);
- 49          Api.constrain(site, user);
- 50          for (var i=0; i<feed.entries.size(); i+=1) {
- 51             var entry = feed.entries.get(i);
- 52             var category = entry.categories.get(0);
- 53             if (category.name !== "http://schemas.google.com/blogger/2008/kind#post") {
- 54                continue;
- 55             }
- 56             var story = Story.add({
- 57                title: entry.title,
- 58                text: entry.description || entry.contents.get(0).value,
- 59                created: entry.publishedDate.format("yyyy-MM-dd HH:mm"),
- 60                status: Story.CLOSED,
- 61                mode: Story.FEATURED
- 62             }, site, user);
- 63          }
- 64          File.remove.call(xml);
- 65       }
- 66    } catch (ex) {
- 67       app.log(ex);
- 68    }
- 69 
- 70    // Reset the site’s export status
- 71    site.job = null;
- 72    site.import_id = null;
- 73    return;
- 74 }
- 75 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_JSON.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_JSON.js.html deleted file mode 100644 index 9c16512d..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_JSON.js.html +++ /dev/null @@ -1,562 +0,0 @@ -
  1 /**
-  2  * @fileOverview Douglas Crockford’s JSON parser and serializer.
-  3  */
-  4  
-  5 /**
-  6  * @name JSON
-  7  * @namespace
-  8  */
-  9  
- 10 /**
- 11  * This method produces a JSON text from a JavaScript value.
- 12  * @name JSON.stringify
- 13  * @function
- 14  * @param {Object} value Any JavaScript value, usually an object or array.
- 15  * @param {Function|String[]} [replacer] An optional parameter that determines how object
- 16  *             values are stringified for objects. It can be a
- 17  *             function or an array of strings.
- 18  * @param {String|Number} [space] An optional parameter that specifies the indentation
- 19  *           of nested structures. If it is omitted, the text will
- 20  *           be packed without extra whitespace. If it is a number,
- 21  *           it will specify the number of spaces to indent at each
- 22  *           level. If it is a string (such as '\t' or ' '),
- 23  *           it contains the characters used to indent at each level.
- 24  * @returns {String}
- 25  */
- 26 
- 27 /**
- 28  * This method parses a JSON text to produce an object or array.
- 29  * @name JSON.parse
- 30  * @function
- 31  * @param {String} text The JSON text.
- 32  * @param {Function} reviver A function that can filter and
- 33  * transform the results. It receives each of the keys and values,
- 34  * and its return value is used instead of the original value.
- 35  * If it returns what it received, then the structure is not modified.
- 36  * If it returns undefined then the member is deleted.
- 37  * @returns {Object}
- 38  */
- 39 
- 40 
- 41 /*
- 42     http://www.JSON.org/json2.js
- 43     2011-02-23
- 44 
- 45     Public Domain.
- 46 
- 47     NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
- 48 
- 49     See http://www.JSON.org/js.html
- 50 
- 51 
- 52     This code should be minified before deployment.
- 53     See http://javascript.crockford.com/jsmin.html
- 54 
- 55     USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
- 56     NOT CONTROL.
- 57 
- 58 
- 59     This file creates a global JSON object containing two methods: stringify
- 60     and parse.
- 61 
- 62         JSON.stringify(value, replacer, space)
- 63             value       any JavaScript value, usually an object or array.
- 64 
- 65             replacer    an optional parameter that determines how object
- 66                         values are stringified for objects. It can be a
- 67                         function or an array of strings.
- 68 
- 69             space       an optional parameter that specifies the indentation
- 70                         of nested structures. If it is omitted, the text will
- 71                         be packed without extra whitespace. If it is a number,
- 72                         it will specify the number of spaces to indent at each
- 73                         level. If it is a string (such as '\t' or ' '),
- 74                         it contains the characters used to indent at each level.
- 75 
- 76             This method produces a JSON text from a JavaScript value.
- 77 
- 78             When an object value is found, if the object contains a toJSON
- 79             method, its toJSON method will be called and the result will be
- 80             stringified. A toJSON method does not serialize: it returns the
- 81             value represented by the name/value pair that should be serialized,
- 82             or undefined if nothing should be serialized. The toJSON method
- 83             will be passed the key associated with the value, and this will be
- 84             bound to the value
- 85 
- 86             For example, this would serialize Dates as ISO strings.
- 87 
- 88                 Date.prototype.toJSON = function (key) {
- 89                     function f(n) {
- 90                         // Format integers to have at least two digits.
- 91                         return n < 10 ? '0' + n : n;
- 92                     }
- 93 
- 94                     return this.getUTCFullYear()   + '-' +
- 95                          f(this.getUTCMonth() + 1) + '-' +
- 96                          f(this.getUTCDate())      + 'T' +
- 97                          f(this.getUTCHours())     + ':' +
- 98                          f(this.getUTCMinutes())   + ':' +
- 99                          f(this.getUTCSeconds())   + 'Z';
-100                 };
-101 
-102             You can provide an optional replacer method. It will be passed the
-103             key and value of each member, with this bound to the containing
-104             object. The value that is returned from your method will be
-105             serialized. If your method returns undefined, then the member will
-106             be excluded from the serialization.
-107 
-108             If the replacer parameter is an array of strings, then it will be
-109             used to select the members to be serialized. It filters the results
-110             such that only members with keys listed in the replacer array are
-111             stringified.
-112 
-113             Values that do not have JSON representations, such as undefined or
-114             functions, will not be serialized. Such values in objects will be
-115             dropped; in arrays they will be replaced with null. You can use
-116             a replacer function to replace those with JSON values.
-117             JSON.stringify(undefined) returns undefined.
-118 
-119             The optional space parameter produces a stringification of the
-120             value that is filled with line breaks and indentation to make it
-121             easier to read.
-122 
-123             If the space parameter is a non-empty string, then that string will
-124             be used for indentation. If the space parameter is a number, then
-125             the indentation will be that many spaces.
-126 
-127             Example:
-128 
-129             text = JSON.stringify(['e', {pluribus: 'unum'}]);
-130             // text is '["e",{"pluribus":"unum"}]'
-131 
-132 
-133             text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-134             // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-135 
-136             text = JSON.stringify([new Date()], function (key, value) {
-137                 return this[key] instanceof Date ?
-138                     'Date(' + this[key] + ')' : value;
-139             });
-140             // text is '["Date(---current time---)"]'
-141 
-142 
-143         JSON.parse(text, reviver)
-144             This method parses a JSON text to produce an object or array.
-145             It can throw a SyntaxError exception.
-146 
-147             The optional reviver parameter is a function that can filter and
-148             transform the results. It receives each of the keys and values,
-149             and its return value is used instead of the original value.
-150             If it returns what it received, then the structure is not modified.
-151             If it returns undefined then the member is deleted.
-152 
-153             Example:
-154 
-155             // Parse the text. Values that look like ISO date strings will
-156             // be converted to Date objects.
-157 
-158             myData = JSON.parse(text, function (key, value) {
-159                 var a;
-160                 if (typeof value === 'string') {
-161                     a =
-162 /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-163                     if (a) {
-164                         return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-165                             +a[5], +a[6]));
-166                     }
-167                 }
-168                 return value;
-169             });
-170 
-171             myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-172                 var d;
-173                 if (typeof value === 'string' &&
-174                         value.slice(0, 5) === 'Date(' &&
-175                         value.slice(-1) === ')') {
-176                     d = new Date(value.slice(5, -1));
-177                     if (d) {
-178                         return d;
-179                     }
-180                 }
-181                 return value;
-182             });
-183 
-184 
-185     This is a reference implementation. You are free to copy, modify, or
-186     redistribute.
-187 */
-188 
-189 /*jslint evil: true, strict: false, regexp: false */
-190 
-191 /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
-192     call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-193     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-194     lastIndex, length, parse, prototype, push, replace, slice, stringify,
-195     test, toJSON, toString, valueOf
-196 */
-197 
-198 
-199 // Create a JSON object only if one does not already exist. We create the
-200 // methods in a closure to avoid creating global variables.
-201 
-202 var JSON;
-203 if (!JSON) {
-204     JSON = {};
-205 }
-206 
-207 (function () {
-208     "use strict";
-209 
-210     function f(n) {
-211         // Format integers to have at least two digits.
-212         return n < 10 ? '0' + n : n;
-213     }
-214 
-215     if (typeof Date.prototype.toJSON !== 'function') {
-216 
-217         Date.prototype.toJSON = function (key) {
-218 
-219             return isFinite(this.valueOf()) ?
-220                 this.getUTCFullYear()     + '-' +
-221                 f(this.getUTCMonth() + 1) + '-' +
-222                 f(this.getUTCDate())      + 'T' +
-223                 f(this.getUTCHours())     + ':' +
-224                 f(this.getUTCMinutes())   + ':' +
-225                 f(this.getUTCSeconds())   + 'Z' : null;
-226         };
-227 
-228         String.prototype.toJSON      =
-229             Number.prototype.toJSON  =
-230             Boolean.prototype.toJSON = function (key) {
-231                 return this.valueOf();
-232             };
-233     }
-234 
-235     var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-236         escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-237         gap,
-238         indent,
-239         meta = {    // table of character substitutions
-240             '\b': '\\b',
-241             '\t': '\\t',
-242             '\n': '\\n',
-243             '\f': '\\f',
-244             '\r': '\\r',
-245             '"' : '\\"',
-246             '\\': '\\\\'
-247         },
-248         rep;
-249 
-250 
-251     function quote(string) {
-252 
-253 // If the string contains no control characters, no quote characters, and no
-254 // backslash characters, then we can safely slap some quotes around it.
-255 // Otherwise we must also replace the offending characters with safe escape
-256 // sequences.
-257 
-258         escapable.lastIndex = 0;
-259         return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
-260             var c = meta[a];
-261             return typeof c === 'string' ? c :
-262                 '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-263         }) + '"' : '"' + string + '"';
-264     }
-265 
-266 
-267     function str(key, holder) {
-268 
-269 // Produce a string from holder[key].
-270 
-271         var i,          // The loop counter.
-272             k,          // The member key.
-273             v,          // The member value.
-274             length,
-275             mind = gap,
-276             partial,
-277             value = holder[key];
-278 
-279 // If the value has a toJSON method, call it to obtain a replacement value.
-280 
-281         if (value && typeof value === 'object' &&
-282                 typeof value.toJSON === 'function') {
-283             value = value.toJSON(key);
-284         }
-285 
-286 // If we were called with a replacer function, then call the replacer to
-287 // obtain a replacement value.
-288 
-289         if (typeof rep === 'function') {
-290             value = rep.call(holder, key, value);
-291         }
-292 
-293 // What happens next depends on the value's type.
-294 
-295         switch (typeof value) {
-296         case 'string':
-297             return quote(value);
-298 
-299         case 'number':
-300 
-301 // JSON numbers must be finite. Encode non-finite numbers as null.
-302 
-303             return isFinite(value) ? String(value) : 'null';
-304 
-305         case 'boolean':
-306         case 'null':
-307 
-308 // If the value is a boolean or null, convert it to a string. Note:
-309 // typeof null does not produce 'null'. The case is included here in
-310 // the remote chance that this gets fixed someday.
-311 
-312             return String(value);
-313 
-314 // If the type is 'object', we might be dealing with an object or an array or
-315 // null.
-316 
-317         case 'object':
-318 
-319 // Due to a specification blunder in ECMAScript, typeof null is 'object',
-320 // so watch out for that case.
-321 
-322             if (!value) {
-323                 return 'null';
-324             }
-325 
-326 // Make an array to hold the partial results of stringifying this object value.
-327 
-328             gap += indent;
-329             partial = [];
-330 
-331 // Is the value an array?
-332 
-333             if (Object.prototype.toString.apply(value) === '[object Array]') {
-334 
-335 // The value is an array. Stringify every element. Use null as a placeholder
-336 // for non-JSON values.
-337 
-338                 length = value.length;
-339                 for (i = 0; i < length; i += 1) {
-340                     partial[i] = str(i, value) || 'null';
-341                 }
-342 
-343 // Join all of the elements together, separated with commas, and wrap them in
-344 // brackets.
-345 
-346                 v = partial.length === 0 ? '[]' : gap ?
-347                     '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
-348                     '[' + partial.join(',') + ']';
-349                 gap = mind;
-350                 return v;
-351             }
-352 
-353 // If the replacer is an array, use it to select the members to be stringified.
-354 
-355             if (rep && typeof rep === 'object') {
-356                 length = rep.length;
-357                 for (i = 0; i < length; i += 1) {
-358                     if (typeof rep[i] === 'string') {
-359                         k = rep[i];
-360                         v = str(k, value);
-361                         if (v) {
-362                             partial.push(quote(k) + (gap ? ': ' : ':') + v);
-363                         }
-364                     }
-365                 }
-366             } else {
-367 
-368 // Otherwise, iterate through all of the keys in the object.
-369 
-370                 for (k in value) {
-371                     if (Object.prototype.hasOwnProperty.call(value, k)) {
-372                         v = str(k, value);
-373                         if (v) {
-374                             partial.push(quote(k) + (gap ? ': ' : ':') + v);
-375                         }
-376                     }
-377                 }
-378             }
-379 
-380 // Join all of the member texts together, separated with commas,
-381 // and wrap them in braces.
-382 
-383             v = partial.length === 0 ? '{}' : gap ?
-384                 '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
-385                 '{' + partial.join(',') + '}';
-386             gap = mind;
-387             return v;
-388         }
-389     }
-390 
-391 // If the JSON object does not yet have a stringify method, give it one.
-392 
-393     if (typeof JSON.stringify !== 'function') {
-394         JSON.stringify = function (value, replacer, space) {
-395 
-396 // The stringify method takes a value and an optional replacer, and an optional
-397 // space parameter, and returns a JSON text. The replacer can be a function
-398 // that can replace values, or an array of strings that will select the keys.
-399 // A default replacer method can be provided. Use of the space parameter can
-400 // produce text that is more easily readable.
-401 
-402             var i;
-403             gap = '';
-404             indent = '';
-405 
-406 // If the space parameter is a number, make an indent string containing that
-407 // many spaces.
-408 
-409             if (typeof space === 'number') {
-410                 for (i = 0; i < space; i += 1) {
-411                     indent += ' ';
-412                 }
-413 
-414 // If the space parameter is a string, it will be used as the indent string.
-415 
-416             } else if (typeof space === 'string') {
-417                 indent = space;
-418             }
-419 
-420 // If there is a replacer, it must be a function or an array.
-421 // Otherwise, throw an error.
-422 
-423             rep = replacer;
-424             if (replacer && typeof replacer !== 'function' &&
-425                     (typeof replacer !== 'object' ||
-426                     typeof replacer.length !== 'number')) {
-427                 throw new Error('JSON.stringify');
-428             }
-429 
-430 // Make a fake root object containing our value under the key of ''.
-431 // Return the result of stringifying the value.
-432 
-433             return str('', {'': value});
-434         };
-435     }
-436 
-437 
-438 // If the JSON object does not yet have a parse method, give it one.
-439 
-440     if (typeof JSON.parse !== 'function') {
-441         JSON.parse = function (text, reviver) {
-442 
-443 // The parse method takes a text and an optional reviver function, and returns
-444 // a JavaScript value if the text is a valid JSON text.
-445 
-446             var j;
-447 
-448             function walk(holder, key) {
-449 
-450 // The walk method is used to recursively walk the resulting structure so
-451 // that modifications can be made.
-452 
-453                 var k, v, value = holder[key];
-454                 if (value && typeof value === 'object') {
-455                     for (k in value) {
-456                         if (Object.prototype.hasOwnProperty.call(value, k)) {
-457                             v = walk(value, k);
-458                             if (v !== undefined) {
-459                                 value[k] = v;
-460                             } else {
-461                                 delete value[k];
-462                             }
-463                         }
-464                     }
-465                 }
-466                 return reviver.call(holder, key, value);
-467             }
-468 
-469 
-470 // Parsing happens in four stages. In the first stage, we replace certain
-471 // Unicode characters with escape sequences. JavaScript handles many characters
-472 // incorrectly, either silently deleting them, or treating them as line endings.
-473 
-474             text = String(text);
-475             cx.lastIndex = 0;
-476             if (cx.test(text)) {
-477                 text = text.replace(cx, function (a) {
-478                     return '\\u' +
-479                         ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-480                 });
-481             }
-482 
-483 // In the second stage, we run the text against regular expressions that look
-484 // for non-JSON patterns. We are especially concerned with '()' and 'new'
-485 // because they can cause invocation, and '=' because it can cause mutation.
-486 // But just to be safe, we want to reject all unexpected forms.
-487 
-488 // We split the second stage into 4 regexp operations in order to work around
-489 // crippling inefficiencies in IE's and Safari's regexp engines. First we
-490 // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-491 // replace all simple value tokens with ']' characters. Third, we delete all
-492 // open brackets that follow a colon or comma or that begin the text. Finally,
-493 // we look to see that the remaining characters are only whitespace or ']' or
-494 // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-495 
-496             if (/^[\],:{}\s]*$/
-497                     .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
-498                         .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
-499                         .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-500 
-501 // In the third stage we use the eval function to compile the text into a
-502 // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-503 // in JavaScript: it can begin a block or an object literal. We wrap the text
-504 // in parens to eliminate the ambiguity.
-505 
-506                 j = eval('(' + text + ')');
-507 
-508 // In the optional fourth stage, we recursively walk the new structure, passing
-509 // each name/value pair to a reviver function for possible transformation.
-510 
-511                 return typeof reviver === 'function' ?
-512                     walk({'': j}, '') : j;
-513             }
-514 
-515 // If the text is not JSON parseable, then a SyntaxError is thrown.
-516 
-517             throw new SyntaxError('JSON.parse');
-518         };
-519     }
-520 }());
-521 
-522 // Do not enumerate the new JSON methods.
-523 // (These lines are not included in the original code by Crockford.)
-524 Object.prototype.dontEnum("toJSONString");
-525 Object.prototype.dontEnum("parseJSON");
-526 
-527 /**
-528  * Create a JSONP-compatible response from the callback name and the desired data.
-529  * @param {String} callback The name of the JSONP callback method
-530  * @param {Object} data An arbitrary JavaScript object
-531  */
-532 JSON.pad = function(data, callback) {
-533    if (!callback) {
-534       return;
-535    }
-536    return callback + "(" + JSON.stringify(data) + ")";
-537 }
-538 
-539 /**
-540  * Send a JSONP-compatible response if a the request contains callback data.
-541  * This works out-of-the-box with jQuery but can be customized using the key argument.
-542  * @param {Object} data An arbitrary JavaScript object
-543  * @param {String} key The name of the property in req.data containing the JSONP callback method name
-544  * @param {Boolean} resume Switch to define whether further processing should be continued or not
-545  */
-546 JSON.sendPaddedResponse = function(data, key, resume) {
-547    var callback = req.data[key || "callback"];
-548    if (callback) {
-549       res.contentType = "text/javascript";
-550       res.write(JSON.pad(data, callback));
-551       resume || res.stop();
-552    }
-553    return;
-554 }
-555 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Sql.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Sql.js.html deleted file mode 100644 index 27a8733a..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_Sql.js.html +++ /dev/null @@ -1,234 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Sql prototype, a utility for relational queries
- 28  */
- 29 
- 30 /**
- 31  * @constructor
- 32  */
- 33 var Sql = function(options) {
- 34    options || (options = {});
- 35    var db = getDBConnection("antville");
- 36    var query;
- 37 
- 38    var log = new function() {
- 39       var fname = getProperty("sqlLog", "helma." + app.getName() + ".sql");
- 40       return Packages.org.apache.commons.logging.LogFactory.getLog(fname);
- 41    }
- 42 
- 43    var SqlData = function(result) {
- 44       var columns = [];
- 45       this.values = {};
- 46       
- 47       for (var i=1; i<=result.getColumnCount(); i+=1) {
- 48          columns.push(result.getColumnName(i).toLowerCase());
- 49       }
- 50    
- 51       this.next = function() {
- 52          for each (var key in columns) {
- 53             this.values[key] = result.getColumnItem(key);
- 54          }
- 55          return;
- 56       }
- 57       
- 58       return this;
- 59    }
- 60 
- 61    var quote = function(str) {
- 62       if (!options.quote || str === null) {
- 63          return str;
- 64       }
- 65       return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
- 66    }
- 67 
- 68    var value = function(obj) {
- 69       if (obj === null) {
- 70          return obj;
- 71       }
- 72       if (obj === undefined) {
- 73          obj = String(obj);
- 74       }
- 75       switch (obj.constructor) {
- 76          case Number:
- 77          return obj;
- 78          case String:
- 79          return quote(obj);
- 80          case Date:
- 81          return "from_unixtime(" + (obj.getTime() / 1000) + ")";
- 82          case HopObject:
- 83          case Object:
- 84          return quote(obj.toSource());
- 85       }
- 86       return quote(String(obj));
- 87    }
- 88 
- 89    var resolve = function(args) {
- 90       var sql = args[0];
- 91       if (args.length > 1) {
- 92          var values = Array.prototype.splice.call(args, 1);
- 93          if (typeof values[0] === "object") {
- 94             values = values[0];
- 95          }
- 96          sql = sql.replace(/\$(\w*)/g, function() {
- 97             return value(values[arguments[1]]);
- 98          });
- 99       }
-100       return sql;
-101    }
-102    
-103    /**
-104     * Executes an SQL command.
-105     * @param {String} sql The SQL command.
-106     * @returns {Object} The result of the SQL command.
-107     */
-108    this.execute = function(sql) {
-109       sql = resolve(arguments);
-110       log.info(sql);
-111       if (options.test) {
-112          return app.log(sql);
-113       }
-114       var error;
-115       var result = db.executeCommand(sql);
-116       if (error = db.getLastError()) {
-117          app.log(error);
-118       }
-119       return result;
-120    }
-121    
-122    /**
-123     * Retrieves an SQL query.
-124     * @example sql.retrieve('select $1 from $2 order by $1', 'date', 'foo')
-125     * ===> 'select date from foo order by date'
-126     * @returns {String}
-127     */
-128    this.retrieve = function() {
-129       return log.info(query = resolve(arguments));
-130    }
-131    
-132    /**
-133     * Traverses over the results of an SQL query.
-134     * @param {Function} callback The callback function executed for each record.
-135     */
-136    this.traverse = function(callback) {
-137       var rows = db.executeRetrieval(query);
-138       if (rows && rows.next()) {
-139          do {
-140             var sql = new SqlData(rows);
-141             sql.next();
-142             if (!options.test) {
-143                callback.call(sql.values, rows);
-144             }
-145          } while (record = rows.next());
-146          rows.release();
-147       }
-148       return;
-149    }
-150    
-151    /**
-152     * @return {String}
-153     */
-154    this.toString = function() {
-155       return query;
-156    }
-157    
-158    return this;
-159 }
-160 
-161 /** 
-162  * SQL query for retrieving the amount of records in a table.
-163  * @constant 
-164  */
-165 Sql.COUNT = "select count(*) as count from $0";
-166 
-167 /** 
-168  * SQL query for retrieving the referrers of a site or a story.
-169  * @constant 
-170  */
-171 Sql.REFERRERS = "select referrer, count(*) as requests from " +
-172       "log where context_type = '$0' and context_id = $1 and action = " +
-173       "'main' and created > now() - interval '2 days' group " +
-174       "by referrer order by requests desc, referrer asc"; 
-175 
-176 /** 
-177  * SQL command for deleting all log entries older than 2 days.
-178  * @constant 
-179  */
-180 Sql.PURGEREFERRERS = "delete from log where action = 'main' and " +
-181       "created < now() - interval '2 days'";
-182 
-183 /** 
-184  * SQL query for searching stories and comments.
-185  * @constant 
-186  */
-187 Sql.SEARCH = "select content.id from content, site, metadata where site.id = $0 and " +
-188       "site.id = content.site_id and content.status in ('public', 'shared', 'open') and " +
-189       "content.id = metadata.parent_id and metadata.name in ('title', 'text') and " +
-190       "lower(metadata.value) like lower('%$1%') group by content.id, content.created " +
-191       "order by content.created desc limit $2";
-192 
-193 /** 
-194  * SQL query for searching members.
-195  * @constant 
-196  */
-197 Sql.MEMBERSEARCH = "select name from account where name $0 '$1' " +
-198       "order by name asc limit $2";
-199 
-200 /** 
-201  * SQL query for retrieving all story IDs in a site’s archive.
-202  * @constant 
-203  */
-204 Sql.ARCHIVE = "select id from content where site_id = $0 and prototype = 'Story' and " +
-205       "status in ('public', 'shared', 'open') $1 $2 limit $3 offset $4";
-206 
-207 /** 
-208  * SQL command for retrieving the size of a site’s archive.
-209  * @constant 
-210  */
-211 Sql.ARCHIVESIZE = "select count(*) as count from content where site_id = $0 " +
-212       "and prototype = 'Story' and status in ('public', 'shared', 'open') $1";
-213 
-214 /** 
-215  * SQL part filtering the archive query.
-216  * @see Archive#getFilter
-217  * @constant 
-218  */
-219 Sql.ARCHIVEPART = " and extract($0 from created) = $1";
-220 
-221 /** 
-222  * SQL part for applying an order to the archive query.
-223  * @see Archive#stories_macro
-224  * @constant 
-225  */
-226 Sql.ARCHIVEORDER = "order by created desc";
-227 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_i18n.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_i18n.js.html deleted file mode 100644 index 3b2fe348..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Global_i18n.js.html +++ /dev/null @@ -1,152 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Contains redefined or additional methods for 
- 28  * internationalization and localization.
- 29  */
- 30 
- 31 /**
- 32  * This method is called from the build script to extract gettext call strings from scripts and skins.
- 33  * @param {String} script The filename of the script containing the MessageParser code.
- 34  * @param {String} scanDirs The list of directory names to be scanned for i18n.
- 35  * @param {String} potFile The filename for the output POT file.
- 36  */
- 37 Root.prototype.extractMessages = function(script, scanDirs, potFile) {
- 38    var temp = {print: global.print, readFile: global.readFile};
- 39    global.print = function(str) {app.log(str);}
- 40    global.readFile = function(fpath, encoding) {
- 41       res.push();
- 42       var file = new helma.File(fpath);
- 43       file.open({charset: encoding || "UTF-8"});
- 44       var str;
- 45       while ((str = file.readln()) !== null) {
- 46          res.writeln(str);
- 47       }
- 48       file.close();
- 49       return res.pop();
- 50    }
- 51    var args = ["-o", potFile, "-e", "utf-8"];
- 52    for each (var dir in scanDirs.split(" ")) {
- 53       args.push(app.dir + "/../" + dir);
- 54    }
- 55    var file = new helma.File(script);
- 56    var MessageParser = new Function(file.readAll());
- 57    MessageParser.apply(global, args);
- 58    global.print = temp.print;
- 59    global.readFile = temp.readFile;
- 60    return;
- 61 }
- 62 
- 63 /**
- 64  * This method is useful for disambiguation of messages (single words most of the time) that have different meanings depending on the context. Example: comment – the verb "to comment" vs the noun "a comment".
- 65  * @param {Object} key The message ID.
- 66  * @param {Object} context The context of the message.
- 67  * @example cgettext('comment', 'verb')
- 68  * @returns {String}
- 69  */
- 70 function cgettext(key, context) {
- 71    var msgId = cgettext.getKey(key, context);
- 72    var text = jala.i18n.translate(msgId);
- 73    return text === msgId ? key : text;
- 74 }
- 75 
- 76 /**
- 77  * Helper method to define the message ID depending on the context.
- 78  * @param {Object} key The message ID.
- 79  * @param {Object} context The context of the message.
- 80  * @returns {String} The message ID, probably suffixed with '//' plus the context
- 81  * @example cgettext.getKey('comment', 'verb') ===> 'comment // verb'
- 82  */
- 83 cgettext.getKey = function(key, context) {
- 84    return context ? key + " // " + context : key;
- 85 }
- 86 
- 87 /**
- 88  * Helma macro wrapper for the gettext() method.
- 89  * @param {Object} param The default Helma macro parameter object.
- 90  * @param {String} text The text used as message ID.
- 91  * @returns {String} Either the translated or the original text.
- 92  * @see jala.i18n.gettext
- 93  */
- 94 function gettext_macro(param, text /*, value1, value2, ...*/) {
- 95    if (!text) {
- 96       return;
- 97    }
- 98    var re = gettext_macro.REGEX;
- 99    var args = [text.toString().replace(re, String.SPACE)];
-100    for (var i=2; i<arguments.length; i+=1) {
-101       args.push(arguments[i]);
-102    }
-103    if (param.context) {
-104       return cgettext.call(this, args[0], param.context);
-105    }
-106    return gettext.apply(this, args);
-107 }
-108 
-109 /**
-110  * The regular expression used to reduce multiple whitespace characters.
-111  * @constant
-112  */
-113 gettext_macro.REGEX = /\s+/g;
-114 
-115 /**
-116  * Helma macro wrapper for the ngettext() method.
-117  * @param {Object} param The default Helma macro parameter object.
-118  * @param {String} singular The text used as the singular message ID.
-119  * @param {String} plural The text used as the plural message ID.
-120  * @returns String Either the translated or the original string.
-121  * @see jala.i18n.ngettext
-122  */
-123 function ngettext_macro(param, singular, plural /*, value1, value2, ...*/) {
-124    if (!singular || !plural) {
-125       return;
-126    }
-127    var re = gettext_macro.REGEX;
-128    var args = [singular.toString().replace(re, String.SPACE), plural.replace(re, String.SPACE)];
-129    for (var i=3; i<arguments.length; i+=1) {
-130       args.push(arguments[i]);
-131    }
-132    return ngettext.apply(this, args);
-133 }
-134 
-135 /**
-136  * Helma macro wrapper for the markgettext() method.
-137  * @param {Object} param The default Helma macro parameter object.
-138  * @param {Object} singular The text used as the singular message ID.
-139  * @param {Object} plural The text used as the plural message ID.
-140  * @see jala.i18n.markgettext
-141  */
-142 function markgettext_macro(param, singular, plural) {
-143    return markgettext.call(this, singular, plural);
-144 }
-145 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_HopObject.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_HopObject.js.html deleted file mode 100644 index caaf8959..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_HopObject.js.html +++ /dev/null @@ -1,728 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the extensions of Helma’s built-in 
- 28  * HopObject prototype.
- 29  */
- 30 
- 31 app.addRepository('modules/helma/Aspects');
- 32 
- 33 /**
- 34  * 
- 35  * @param {HopObject} collection
- 36  * @param {Object} options Optional flags, e.g. to force or prevent any  
- 37  * conditional checks of individual prototype’s remove() methods
- 38  */
- 39 HopObject.remove = function(options) {
- 40    var item;
- 41    while (this.size() > 0) {
- 42       item = this.get(0);
- 43       if (item.constructor.remove) {
- 44          item.constructor.remove.call(item, options);
- 45       } else if (!options) {
- 46          item.remove();
- 47       } else {
- 48          throw Error("Missing static " + item.constructor.name + 
- 49                ".remove() method");
- 50       }
- 51    }
- 52    return;
- 53 }
- 54 
- 55 /**
- 56  * 
- 57  * @param {String} name
- 58  * @param {HopObject} collection
- 59  */
- 60 HopObject.getFromPath = function(name, collection) {
- 61    if (name) {
- 62       var site;
- 63       if (name.contains("/")) {
- 64          var parts = name.split("/");
- 65          site = root.get(parts[0]);
- 66          name = parts[1];
- 67       } else {
- 68          site = res.handlers.site;
- 69       }
- 70       if (site && site.getPermission("main")) {
- 71          return site[collection].get(name);
- 72       }
- 73    }
- 74    return null;
- 75 }
- 76 
- 77 /**
- 78  * Debugging method to detect direct constructor calls which 
- 79  * should be replaced with static add() method.
- 80  */
- 81 HopObject.confirmConstructor = function(ref) {
- 82    var KEY = '__confirmedConstructors__';
- 83    if (!res.meta[KEY]) {
- 84       res.meta[KEY] = {};
- 85    }
- 86    var confirmed = res.meta[KEY];
- 87    if (typeof ref === 'function') {
- 88       confirmed[ref.name] = true;
- 89    } else {
- 90       ref = (ref || this).constructor.name;
- 91       if (!confirmed[ref]) {
- 92          app.logger.warn('Calling unconfirmed constructor for ' + 
- 93                ref + ' prototype – please check!');
- 94       }
- 95    }
- 96    return;
- 97 }
- 98 
- 99 /**
-100  * Helma’s built-in HopObject with Antville’s extensions.
-101  * @name HopObject
-102  * @constructor
-103  */
-104 
-105 /**
-106  *
-107  */
-108 HopObject.prototype.onCodeUpdate = function() {
-109    skinMayDisplayEditLink = function(name) {
-110       return req.cookies[User.COOKIE + 'LayoutSandbox'] &&
-111          res.handlers.layout.getPermission('main') &&
-112          typeof name === 'string' && 
-113          !name.startsWith('$') && 
-114          res.contentType === 'text/html';
-115    }
-116 
-117    // Overriding the HopObject.renderSkin() methods for displaying skin edit controls.
-118    helma.aspects.addAround(this, 'renderSkin', function(args, func, object) {
-119       var name = args[0];
-120       var id = name.replace('#', '-').toLowerCase();
-121 
-122       if (skinMayDisplayEditLink(name)) {
-123          var parts = name.split('#');
-124          var prototype = parts[0];
-125          var skinName = parts[1];
-126          var skin = new Skin(prototype, skinName);
-127          res.writeln('<div id="skin-' + id + '" class="skin" data-name="' + 
-128                name + '" data-href="' + skin.href('edit') + '">');
-129       }
-130 
-131       func.apply(object, args);
-132 
-133       if (skinMayDisplayEditLink(name)) {
-134          res.writeln('</div><!-- End of #skin-' + id + ' -->');
-135       }
-136       
-137       helma.aspects.addAround(this, 'renderSkinAsString', function(args, func, object) {
-138          var name = args[0];
-139          if (skinMayDisplayEditLink(name)) {
-140             res.push();
-141             object.renderSkin.apply(object, args);
-142             return res.pop();
-143          }
-144          return func.apply(object, args);
-145       });
-146 
-147       return;      
-148    });
-149 }
-150 
-151 /**
-152  * 
-153  */
-154 HopObject.prototype.onRequest = function() {
-155    // Checking if we are on the correct host to prevent at least some XSS issues
-156    if (req.action !== "notfound" && req.action !== "error" && 
-157          this.href().contains("://") && 
-158          !this.href().toLowerCase().startsWith(req.servletRequest.scheme + 
-159          "://" + req.servletRequest.serverName.toLowerCase())) {   
-160       res.redirect(this.href(req.action === "main" ? String.EMPTY : req.action));
-161    }
-162 
-163    User.autoLogin();
-164    res.handlers.membership = User.getMembership();
-165    
-166    if (User.getCurrentStatus() === User.BLOCKED) {
-167       session.data.status = 403;
-168       session.data.error = gettext("Your account has been blocked.") + String.SPACE + 
-169             gettext("Please contact an administrator for further information.");
-170       User.logout();
-171       res.redirect(root.href("error"));
-172    }
-173    
-174    if (res.handlers.site.status === Site.BLOCKED && 
-175          !User.require(User.PRIVILEGED)) {
-176       session.data.status = 403;
-177       session.data.error = gettext("The site you requested has been blocked.") +
-178             String.SPACE + gettext("Please contact an administrator for further information.");
-179       res.redirect(root.href("error"));
-180    }
-181    
-182    HopObject.confirmConstructor(Layout);
-183    res.handlers.layout = res.handlers.site.layout || new Layout;
-184    res.skinpath = res.handlers.layout.getSkinPath();
-185 
-186    if (!this.getPermission(req.action)) {
-187       if (!session.user) {
-188          User.setLocation(root.href() + req.path);
-189          res.message = gettext("Please login first.");
-190          res.redirect(res.handlers.site.members.href("login"));
-191       }
-192       User.getLocation();
-193       res.status = 401;
-194       res.data.title = gettext("{0} 401 Error", root.title);
-195       res.data.body = root.renderSkinAsString("$Root#error", {error: 
-196             gettext("You are not allowed to access this part of the site.")});
-197       res.handlers.site.renderSkin("Site#page");
-198       session.data.error = null;
-199       res.stop();
-200    }
-201 
-202    res.meta.values = {};
-203    res.handlers.site.renderSkinAsString("Site#values");
-204    return;
-205 }
-206 
-207 /**
-208  * @returns Boolean
-209  */
-210 HopObject.prototype.getPermission = function() {
-211    return true;
-212 }
-213 
-214 // Marking some prototype names used in res.message of HopObject.delete_action()
-215 markgettext("Comment");
-216 markgettext("File");
-217 markgettext("Image");
-218 markgettext("Membership");
-219 markgettext("Poll");
-220 markgettext("Story");
-221 
-222 HopObject.prototype.delete_action = function() {
-223    if (req.postParams.proceed) {
-224       try {
-225          var parent = this._parent;
-226          var url = this.constructor.remove.call(this, req.postParams) || 
-227                parent.href();
-228          res.message = gettext("{0} was successfully deleted.", gettext(this._prototype));
-229          res.redirect(User.getLocation() || url);
-230       } catch(ex) {
-231          res.message = ex;
-232          app.log(ex);
-233       }
-234    }
-235 
-236    res.data.action = this.href(req.action);
-237    res.data.title = gettext("Confirm Deletion");
-238    res.data.body = this.renderSkinAsString("$HopObject#confirm", {
-239       text: this.getConfirmText()
-240    });
-241    res.handlers.site.renderSkin("Site#page");
-242    return;
-243 }
-244 
-245 /**
-246  * @returns {Object}
-247  */
-248 HopObject.prototype.touch = function() {
-249    return this.map({
-250       modified: new Date,
-251       modifier: session.user
-252    });
-253 }
-254 
-255 /**
-256  * 
-257  */
-258 HopObject.prototype.log = function() {
-259    var entry = new LogEntry(this, "main");
-260    app.data.entries.push(entry);
-261    return;
-262 }
-263 
-264 /**
-265  * 
-266  * @param {String} action
-267  */
-268 HopObject.prototype.notify = function(action) {
-269    var self = this;
-270    var site = res.handlers.site;
-271    
-272    var getPermission = function(scope, mode, status) {
-273       if (scope === Admin.NONE || mode === Site.NOBODY || 
-274             status === Site.BLOCKED) {
-275          return false;
-276       }
-277       var scopes = [Admin.REGULAR, Admin.TRUSTED];
-278       if (scopes.indexOf(status) < scopes.indexOf(scope)) {
-279          return false;
-280       }
-281       if (!Membership.require(mode)) {
-282          return false;
-283       }
-284       return true;
-285    }
-286    
-287    // Helper method for debugging
-288    var renderMatrix = function() {
-289       var buf = ['<table border=1 cellspacing=0>'];
-290       for each (var scope in Admin.getNotificationScopes()) {
-291          for each (var mode in Site.getNotificationModes()) {
-292             for each (var status in Site.getStatus()) {
-293                var perm = getPermission(scope.value, mode.value, status.value);
-294                buf.push('<tr style="');
-295                perm && buf.push('color: blue;');
-296                if (scope.value === root.notificationScope && mode.value === 
-297                      site.notificationMode && status.value === site.status) {
-298                   buf.push(' background-color: yellow;');
-299                }
-300                buf.push('">');
-301                buf.push('<td>', scope.value, '</td>');
-302                buf.push('<td>', status.value, '</td>');
-303                buf.push('<td>', mode.value, '</td>');
-304                buf.push('<td>', perm, '</td>');
-305                buf.push('</tr>');
-306             }
-307          }
-308       }
-309       buf.push('</table>');
-310       res.write(buf.join(""));
-311       return;
-312    }
-313 
-314    switch (action) {
-315       case "comment":
-316       action = "create"; break;
-317    }
-318 
-319    var currentMembership = res.handlers.membership;
-320    site.members.forEach(function() {
-321       var membership = res.handlers.membership = this;
-322       if (getPermission(root.notificationScope, site.notificationMode, site.status)) {
-323          sendMail(membership.creator.email, gettext("[{0}] Notification of site changes", 
-324                root.title), self.renderSkinAsString("$HopObject#notify_" + action));
-325       }
-326    });
-327    res.handlers.membership = currentMembership;
-328    return;
-329 }
-330 
-331 /**
-332  * @returns {Tag[]}
-333  */
-334 HopObject.prototype.getTags = function() {
-335    var tags = [];
-336    if (typeof this.tags === "object") {
-337       this.tags.list().forEach(function(item) {
-338          item.tag && tags.push(item.tag.name);
-339       });
-340    }
-341    return tags;
-342 }
-343 
-344 /**
-345  * 
-346  * @param {Tag[]|String} tags
-347  */
-348 HopObject.prototype.setTags = function(tags) {
-349    if (typeof this.tags !== "object") {
-350       return String.EMPTY;
-351    }
-352 
-353    if (!tags) {
-354       tags = [];
-355    } else if (tags.constructor === String) {
-356       tags = tags.split(/\s*,\s*/);
-357    }
-358    
-359    var diff = {};
-360    var tag;
-361    for (var i in tags) {
-362       // Trim and remove troublesome characters  (like ../.. etc.)
-363       // We call getAccessName with a virgin HopObject to allow most names
-364       tag = tags[i] = this.getAccessName.call(new HopObject, File.getName(tags[i]));
-365       if (tag && diff[tag] == null) {
-366          diff[tag] = 1;
-367       }
-368    }
-369    this.tags.forEach(function() {
-370       if (!this.tag) {
-371          return;
-372       }
-373       diff[this.tag.name] = (tags.indexOf(this.tag.name) < 0) ? this : 0;
-374    });
-375    
-376    for (var tag in diff) {
-377       switch (diff[tag]) {
-378          case 0:
-379          // Do nothing (tag already exists)
-380          break;
-381          case 1:
-382          // Add tag to story
-383          this.addTag(tag);
-384          break;
-385          default:
-386          // Remove tag
-387          this.removeTag(diff[tag]);
-388       }
-389    }
-390    return;
-391 }
-392 
-393 /**
-394  * 
-395  * @param {String} name
-396  */
-397 HopObject.prototype.addTag = function(name) {
-398    TagHub.add(name, this, session.user);
-399    return;
-400 }
-401 
-402 /**
-403  * 
-404  * @param {String} tag
-405  */
-406 HopObject.prototype.removeTag = function(tag) {
-407    var parent = tag._parent;
-408    if (parent.size() === 1) {
-409       parent.remove();
-410    }
-411    tag.remove();
-412    return;
-413 }
-414 
-415 /**
-416  * 
-417  * @param {Object} values
-418  */
-419 HopObject.prototype.map = function(values) {
-420    for (var i in values) {
-421       this[i] = values[i];
-422    }
-423    return;
-424 }
-425 
-426 /**
-427  * 
-428  * @param {Object} param
-429  * @param {String} name
-430  */
-431 HopObject.prototype.skin_macro = function(param, name) {
-432    if (!name) {
-433       return;
-434    }
-435    if (name.contains("#")) {
-436       this.renderSkin(name);
-437    } else {
-438       var prototype = this._prototype || "Global";
-439       this.renderSkin(prototype + "#" + name);
-440    }
-441    return;
-442 }
-443 
-444 /**
-445  * 
-446  * @param {Object} param
-447  * @param {String} name
-448  */
-449 HopObject.prototype.input_macro = function(param, name) {
-450    param.name = name;
-451    param.id = name;
-452    param.value = this.getFormValue(name);
-453    return html.input(param);
-454 }
-455 
-456 /**
-457  * 
-458  * @param {Object} param
-459  * @param {String} name
-460  */
-461 HopObject.prototype.textarea_macro = function(param, name) {
-462    param.name = name;
-463    param.id = name;
-464    param.value = this.getFormValue(name);
-465    return html.textArea(param);
-466 }
-467 
-468 /**
-469  * 
-470  * @param {Object} param
-471  * @param {String} name
-472  */
-473 HopObject.prototype.select_macro = function(param, name) {
-474    param.name = name;
-475    param.id = name;
-476    var options = this.getFormOptions(name);
-477    if (options.length < 2) {
-478       param.disabled = "disabled";
-479    }
-480    return html.dropDown(param, options, this.getFormValue(name));
-481 }
-482 
-483 /**
-484  * 
-485  * @param {Object} param
-486  * @param {String} name
-487  */
-488 HopObject.prototype.checkbox_macro = function(param, name) {
-489    param.name = name;
-490    param.id = name;
-491    var options = this.getFormOptions(name);
-492    if (options.length < 2) {
-493       param.disabled = "disabled";
-494    }
-495    param.value = String((options[1] || options[0]).value);
-496    param.selectedValue = String(this.getFormValue(name));
-497    var label = param.label;
-498    delete param.label;
-499    html.checkBox(param);
-500    if (label) {
-501       html.element("label", label, {"for": name});
-502    }
-503    return;
-504 }
-505 
-506 /**
-507  * 
-508  * @param {Object} param
-509  * @param {String} name
-510  */
-511 HopObject.prototype.radiobutton_macro = function(param, name) {
-512    param.name = name;
-513    param.id = name;
-514    var options = this.getFormOptions(name);
-515    if (options.length < 2) {
-516       param.disabled = "disabled";
-517    }
-518    param.value = String(options[0].value);
-519    param.selectedValue = String(this.getFormValue(name));
-520    var label = param.label;
-521    delete param.label;
-522    html.radioButton(param);
-523    if (label) {
-524       html.element("label", label, {"for": name});
-525    }
-526    return;
-527 }
-528 
-529 /**
-530  * 
-531  * @param {Object} param
-532  * @param {String} name
-533  */
-534 HopObject.prototype.upload_macro = function(param, name) {
-535    param.name = name;
-536    param.id = name;
-537    param.value = this.getFormValue(name);
-538    renderSkin("$Global#upload", param);
-539    return;
-540 }
-541 
-542 /**
-543  * 
-544  * @param {Object} param
-545  * @param {HopObject} [handler]
-546  */
-547 HopObject.prototype.macro_macro = function(param, handler) {
-548    var ctor = this.constructor;
-549    if ([Story, Image, File, Poll].indexOf(ctor) > -1) {
-550       res.write('<span class="macro-code">');
-551       res.encode("<% ");
-552       res.write(handler || ctor.name.toLowerCase());
-553       res.write(String.SPACE);
-554       res.write(quote(this.name || this._id));
-555       res.encode(" %>");
-556       res.write('</span>');
-557    }
-558    return;
-559 }
-560 
-561 /**
-562  * 
-563  */
-564 HopObject.prototype.kind_macro = function() {
-565    var type = this.constructor.name.toLowerCase();
-566    switch (type) {
-567       default:
-568       res.write(gettext(type));
-569       break;
-570    }
-571    return;
-572 }
-573 
-574 /**
-575  * 
-576  * @param {String} name
-577  * @returns {Number|String}
-578  */
-579 HopObject.prototype.getFormValue = function(name) {
-580    if (req.isPost()) {
-581       return req.postParams[name];
-582    } else {
-583       var value = this[name] || req.queryParams[name] || String.EMPTY;
-584       return value instanceof HopObject ? value._id : value;
-585    }
-586 }
-587 
-588 /**
-589  * @returns {Object[]}
-590  */
-591 HopObject.prototype.getFormOptions = function() {
-592    return [{value: true, display: "enabled"}];
-593 }
-594 
-595 /**
-596  * @returns {HopObject}
-597  * @param {Object} param
-598  * @param {String} property
-599  */
-600 HopObject.prototype.self_macro = function(param, property) {
-601    return property ? this[property] : this;
-602 }
-603 
-604 /**
-605  * 
-606  */
-607 HopObject.prototype.type_macro = function() {
-608    return res.write(this.constructor.name);
-609 }
-610 
-611 /**
-612  * 
-613  * @param {Object} param
-614  * @param {String} url
-615  * @param {String} text
-616  */
-617 HopObject.prototype.link_macro = function(param, url, text) {
-618    if (url && text) {
-619       var action = url.split(/#|\?/)[0];
-620       if (this.getPermission(action)) {
-621          renderLink.call(global, param, url, text, this);
-622       }
-623    } else {
-624       res.write("[Insufficient link parameters]");
-625    }
-626    return;
-627 }
-628 
-629 /**
-630  * 
-631  * @param {Object} param
-632  * @param {String} format
-633  */
-634 HopObject.prototype.created_macro = function(param, format) {
-635    if (this.isPersistent()) {
-636       format || (format = param.format);
-637       res.write(formatDate(this.created, format));
-638    }
-639    return;
-640 }
-641 
-642 /**
-643  * 
-644  * @param {Object} param
-645  * @param {String} format
-646  */
-647 HopObject.prototype.modified_macro = function(param, format) {
-648    if (this.isPersistent()) {
-649       format || (format = param.format);
-650       res.write(formatDate(this.modified, format));
-651    }
-652    return;
-653 }
-654 
-655 /**
-656  * 
-657  * @param {Object} param
-658  * @param {String} mode
-659  */
-660 HopObject.prototype.creator_macro = function(param, mode) {
-661    if (!this.creator || this.isTransient()) {
-662       return;
-663    }
-664    mode || (mode = param.as);
-665    if (mode === "link" && this.creator.url) {
-666       html.link({href: this.creator.url}, this.creator.name);
-667    } else if (mode === "url") {
-668       res.write(this.creator.url);
-669    } else {
-670       res.write(this.creator.name);
-671    } return;
-672 }
-673 
-674 /**
-675  * 
-676  * @param {Object} param
-677  * @param {String} mode
-678  */
-679 HopObject.prototype.modifier_macro = function(param, mode) {
-680    if (!this.modifier || this.isTransient()) {
-681       return;
-682    }
-683    mode || (mode = param.as);
-684    if (mode === "link" && this.modifier.url) {
-685       html.link({href: this.modifier.url}, this.modifier.name);
-686    } else if (mode === "url") {
-687       res.write(this.modifier.url);
-688    } else {
-689       res.write(this.modifier.name);
-690    }
-691    return;
-692 }
-693 
-694 /**
-695  * @returns {String}
-696  */
-697 HopObject.prototype.getTitle = function() {
-698    return this.title || gettext(this.__name__.capitalize());
-699 }
-700 
-701 /**
-702  * @returns {String}
-703  */
-704 HopObject.prototype.toString = function() {
-705    return this.constructor.name + " #" + this._id;
-706 }
-707 
-708 /**
-709  * 
-710  * @param {String} text
-711  * @param {Object} param
-712  * @param {String} action
-713  * @returns {String}
-714  */
-715 HopObject.prototype.link_filter = function(text, param, action) {
-716    action || (action = ".");
-717    res.push();
-718    renderLink(param, action, text, this);
-719    return res.pop();
-720 }
-721 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_metadata.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_metadata.js.html deleted file mode 100644 index 7287fdde..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_HopObject_metadata.js.html +++ /dev/null @@ -1,160 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines metadata extensions of Helma’s built-in
- 28  * HopObject prototype.
- 29  */
- 30 
- 31 /**
- 32  *
- 33  * @param {String} name
- 34  */
- 35 HopObject.prototype.handleMetadata = function(name) {
- 36    this.__defineGetter__(name, function() {
- 37       return this.getMetadata(name);
- 38    });
- 39    this.__defineSetter__(name, function(value) {
- 40       return this.setMetadata(name, value);
- 41    });
- 42    this[name + "_macro"] = function(param) {
- 43       var value;
- 44       if (value = this[name]) {
- 45          res.write(value);
- 46       }
- 47       return;
- 48    };
- 49    return;
- 50 }
- 51 
- 52 /**
- 53  *
- 54  * @param {String} name
- 55  * @returns {Object}
- 56  */
- 57 HopObject.prototype.getMetadata = function(name) {
- 58    if (!this.metadata) {
- 59       throw Error("No metadata collection defined for prototype " + this.constructor.name);
- 60    } else {
- 61       this.metadata.prefetchChildren();
- 62    }
- 63 
- 64    var self = this;
- 65 
- 66    if (!name) {
- 67       var result = {};
- 68       this.metadata.forEach(function() {
- 69          var name = this.name;
- 70          if (name) {
- 71             result[name] = self.getMetadata(name);
- 72          }
- 73       });
- 74       return result;
- 75    }
- 76 
- 77    var meta = this.metadata.get(name);
- 78    if (!meta) {
- 79       return null;
- 80    }
- 81 
- 82    return meta.getValue();
- 83 }
- 84 
- 85 /**
- 86  *
- 87  * @param {String} name
- 88  * @param {Object} value
- 89  */
- 90 HopObject.prototype.setMetadata = function(name, value) {
- 91    if (!this.metadata) {
- 92       throw Error("No metadata collection defined for prototype " + this.constructor.name);
- 93    }
- 94 
- 95    if (!name) {
- 96       throw Error("Insufficient arguments");
- 97    }
- 98 
- 99    if (typeof name === "object") {
-100       for (var i in name) {
-101          this.setMetadata(i, name[i]);
-102       }
-103       return;
-104    }
-105 
-106    var metadata = this.metadata.get(name);
-107 
-108    if (metadata) {
-109       metadata.setValue(value);
-110    } else {
-111       metadata = new Metadata(this, name, value);
-112       if (metadata.value !== null) {
-113          // metadata.persist() is not enough or there will be redundant records!
-114          this.metadata.add(metadata);
-115       }
-116    }
-117    return;
-118 }
-119 
-120 /**
-121  *
-122  * @param {String} name
-123  */
-124 HopObject.prototype.deleteMetadata = function(name) {
-125    if (!this.metadata) {
-126       throw Error("No metadata collection defined for prototype " + this.constructor.name);
-127    }
-128 
-129    var self = this;
-130 
-131    if (arguments.length === 0) {
-132       return HopObject.remove.call(this.metadata);
-133    }
-134 
-135    Array.prototype.forEach.call(arguments, function(name) {
-136       var metadata = self.metadata.get(name);
-137       metadata && metadata.remove();
-138       return;
-139    });
-140    return;
-141 }
-142 
-143 /**
-144  *
-145  * @param {Object} param
-146  * @param {String} name
-147  */
-148 HopObject.prototype.metadata_macro = function(param, name) {
-149    var value = this.getMetadata(name);
-150    value && res.write(value);
-151    return;
-152 }
-153 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Image_Image.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Image_Image.js.html deleted file mode 100644 index 17209691..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Image_Image.js.html +++ /dev/null @@ -1,547 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Image prototype.
- 28  */
- 29 
- 30 markgettext("Image");
- 31 markgettext("image");
- 32 
- 33 this.handleMetadata("contentLength");
- 34 this.handleMetadata("contentType");
- 35 this.handleMetadata("description");
- 36 this.handleMetadata("fileName");
- 37 this.handleMetadata("height");
- 38 this.handleMetadata("thumbnailHeight");
- 39 this.handleMetadata("thumbnailName");
- 40 this.handleMetadata("thumbnailWidth");
- 41 this.handleMetadata("origin");
- 42 this.handleMetadata("width");
- 43 
- 44 /** @constant */
- 45 Image.THUMBNAILWIDTH = 100;
- 46 
- 47 /** @constant */
- 48 Image.KEYS = ["name", "created", "modified", "origin", "description", 
- 49       "contentType", "contentLength", "width", "height", "thumbnailName", 
- 50       "thumbnailWidth", "thumbnailHeight", "fileName", "site"];
- 51 
- 52 /**
- 53  * @param {Object} data
- 54  * @param {Site|Layout} parent
- 55  * @param {User} user
- 56  * @returns {Image}
- 57  */
- 58 Image.add = function(data, parent, user) {
- 59    HopObject.confirmConstructor(Image);
- 60    parent || (parent = res.handlers.site);
- 61    user || (user = session.user);
- 62    var image = new Image;
- 63    if (data) {
- 64       for each (var key in Image.KEYS) {
- 65          image[key] = data[key];
- 66       }
- 67    }
- 68    image.parent = parent;
- 69    image.created = image.modified = new Date;
- 70    image.creator = image.modifier = user;
- 71    image.update(data);
- 72    parent.images.add(image);
- 73    return image;
- 74 }
- 75 
- 76 /**
- 77  * 
- 78  */
- 79 Image.remove = function() {
- 80    if (this.constructor === Image) {
- 81       this.removeFiles();
- 82       this.setTags(null);
- 83       this.deleteMetadata();
- 84       this.remove();
- 85    }
- 86    return;
- 87 }
- 88 
- 89 /**
- 90  * 
- 91  * @param {String} type
- 92  * @returns {String}
- 93  */
- 94 Image.getFileExtension = function(type) {
- 95    type = String(type);
- 96    // Sometimes type is like "image/jpeg;charset=ISO-8859-1"
- 97    var index = type.lastIndexOf(";");
- 98    if (index > -1) {
- 99       type = type.substr(0, index);
-100    }
-101    switch (type) {
-102       //case "image/x-icon":
-103       //return ".ico";
-104       case "image/gif":
-105       return ".gif";
-106       case "image/jpeg":
-107       case "image/pjpeg":
-108       return ".jpg";
-109       case "image/png":
-110       case "image/x-png":
-111       return ".png";
-112    }
-113    return null;
-114 }
-115 
-116 /**
-117  * @name Image
-118  * @constructor
-119  * @param {Object} data
-120  * @property {Number} contentLength
-121  * @property {String} contentType
-122  * @property {Date} created
-123  * @property {User} creator
-124  * @property {String} description
-125  * @property {String} fileName
-126  * @property {Number} height
-127  * @property {Metadata} metadata
-128  * @property {Date} modified
-129  * @property {User} modifier
-130  * @property {String} name
-131  * @property {} origin
-132  * @property {HopObject} parent
-133  * @property {Number} parent_id
-134  * @property {String} parent_type
-135  * @property {String} prototype
-136  * @property {Tag[]} tags 
-137  * @property {Number} thumbnailHeight
-138  * @property {String} thumbnailName
-139  * @property {Number} thumbnailWidth
-140  * @property {Number} width
-141  * @extends HopObject
-142  */
-143 Image.prototype.constructor = function(data) {
-144    HopObject.confirmConstructor.call(this);
-145    return this;
-146 }
-147 
-148 /**
-149  * 
-150  * @param {String} action
-151  * @return {Boolean}
-152  */
-153 Image.prototype.getPermission = function(action) {
-154    var defaultGrant = this._parent.getPermission("main");
-155    switch (action) {
-156       case ".":
-157       case "main":
-158       return true;
-159       case "delete":
-160       return defaultGrant && this.creator === session.user || 
-161             Membership.require(Membership.MANAGER) ||
-162             User.require(User.PRIVILEGED);            
-163       case "edit":
-164       return defaultGrant && this.creator === session.user || 
-165             Membership.require(Membership.MANAGER) || 
-166             User.require(User.PRIVILEGED) &&
-167             this.parent_type !== "Layout" ||
-168             this.parent === path.layout;
-169    }
-170    return false;
-171 }
-172 
-173 /**
-174  * 
-175  * @param {String} action
-176  * @returns {String}
-177  */
-178 Image.prototype.href = function(action) {
-179    if (action !== "replace") {
-180       if (this.parent_type === "Layout" && this.parent !== path.layout) {
-181          return this.getUrl();
-182       }
-183    } else {
-184       return res.handlers.images.href("create") + "?name=" + this.name;
-185    }
-186    return HopObject.prototype.href.apply(this, arguments);
-187 }
-188 
-189 Image.prototype.main_action = function() {
-190    res.data.title = gettext("Image: {0}", this.getTitle());
-191    res.data.body = this.renderSkinAsString("Image#main");
-192    res.handlers.site.renderSkin("Site#page");
-193    return;
-194 }
-195 
-196 Image.prototype.edit_action = function() {
-197    File.redirectOnUploadError(this.href(req.action));
-198 
-199    if (req.postParams.save) {
-200       try {
-201          File.redirectOnExceededQuota(this.href(req.action));
-202          this.update(req.postParams);
-203          res.message = gettext("The changes were saved successfully.");
-204          res.redirect(this.href());
-205       } catch (ex) {
-206          res.message = ex;
-207          app.log(ex);
-208       }
-209    }
-210 
-211    res.data.action = this.href(req.action);
-212    res.data.title = gettext("Edit Image");
-213    res.data.body = this.renderSkinAsString("$Image#edit");
-214    res.handlers.site.renderSkin("Site#page");
-215    return;
-216 }
-217 
-218 /**
-219  * 
-220  * @param {String} name
-221  * @returns {Object}
-222  */
-223 Image.prototype.getFormValue = function(name) {
-224    var self = this;
-225    
-226    var getOrigin = function(str) {
-227       var origin = req.postParams.file_origin || self.origin;
-228       if (origin && origin.contains("://")) {
-229          return origin;
-230       }
-231       return null;
-232    }
-233    
-234    if (req.isPost()) {
-235       if (name === "file") {
-236          return getOrigin();
-237       }
-238       return req.postParams[name];
-239    }
-240    switch (name) {
-241       case "file":
-242       return getOrigin();
-243       case "maxWidth":
-244       case "maxHeight":
-245       return this[name] || 400;
-246       case "tags":
-247       return this.getTags();
-248    }
-249    return this[name] || req.queryParams[name];
-250 }
-251 
-252 /**
-253  * 
-254  * @param {Object} data
-255  */
-256 Image.prototype.update = function(data) {
-257    var origin = data.file_origin;
-258 
-259    if (!origin) {
-260       if (this.isTransient()) { 
-261          throw Error(gettext("There was nothing to upload. Please be sure to choose a file."));
-262       }
-263    } else if (origin !== this.origin) {
-264       var mime = data.file;
-265       // Check if mime is not null to allow post requests with no file upload at all
-266       if (!mime || mime.contentLength < 1) {
-267          mime = getURL(origin);
-268          if (!mime) {
-269             throw Error(gettext("Could not fetch the image from the given URL."));
-270          }
-271       }
-272 
-273       var extension = Image.getFileExtension(mime.contentType);
-274       if (!extension) {
-275          throw Error(gettext("This does not seem to be a (valid) JPG, PNG or GIF image file."));
-276       }
-277       
-278       this.origin = origin;
-279       var mimeName = mime.normalizeFilename(mime.name);
-280       this.contentLength = mime.contentLength;
-281       this.contentType = mime.contentType;
-282    
-283       if (!this.name) {
-284           var name = File.getName(data.name) || mimeName.split(".")[0];
-285           this.name = this.parent.images.getAccessName(name);
-286       }
-287 
-288       var image = this.getConstraint(mime, data.maxWidth, data.maxHeight);
-289       this.height = image.height; 
-290       this.width = image.width;
-291 
-292       var thumbnail;
-293       if (image.width > Image.THUMBNAILWIDTH) {
-294          thumbnail = this.getConstraint(mime, Image.THUMBNAILWIDTH);
-295          this.thumbnailWidth = thumbnail.width; 
-296          this.thumbnailHeight = thumbnail.height; 
-297       } else if (this.isPersistent()) {
-298          this.getThumbnailFile().remove();
-299          // NOTE: delete operator won't work here due to getter/setter methods
-300          this.deleteMetadata("thumbnailName", "thumbnailWidth", "thumbnailHeight");
-301       }
-302 
-303       // Make the image persistent before proceeding with writing files and 
-304       // setting tags (also see Helma bug #607)
-305       this.isTransient() && this.persist();
-306       
-307       var fileName = this.name + extension;
-308       if (fileName !== this.fileName) {
-309          // Remove existing image files if the file name has changed
-310          this.removeFiles();
-311       }
-312       this.fileName = fileName;
-313       thumbnail && (this.thumbnailName = this.name + "_small" + extension);
-314       this.writeFiles(image.resized || mime, thumbnail && thumbnail.resized);
-315       image.resized && (this.contentLength = this.getFile().getLength());
-316    }
-317 
-318    if (this.parent_type !== "Layout") {
-319       this.setTags(data.tags || data.tag_array);
-320    }
-321    this.description = data.description;
-322    this.touch();
-323    return;
-324 }
-325 
-326 /**
-327  * 
-328  */
-329 Image.prototype.tags_macro = function() {
-330    return res.write(this.getFormValue("tags"));
-331 }
-332 
-333 /**
-334  * 
-335  */
-336 Image.prototype.contentLength_macro = function() {
-337    return res.write((this.contentLength / 1024).format("###,###") + " KB");
-338 }
-339 
-340 /**
-341  * 
-342  */
-343 Image.prototype.url_macro = function() {
-344    return res.write(this.getUrl());
-345 }
-346 
-347 /**
-348  * 
-349  */
-350 Image.prototype.macro_macro = function() {
-351    return HopObject.prototype.macro_macro.call(this, null,  
-352          this.parent.constructor === Layout ? "layout.image" : "image");
-353 }
-354 
-355 /**
-356  * 
-357  * @param {Object} param
-358  */
-359 Image.prototype.thumbnail_macro = function(param) {
-360    if (!this.thumbnailName) {
-361       return this.render_macro(param);
-362    }
-363    param.src = this.getUrl(this.getThumbnailFile().getName());
-364    param.title || (param.title = encode(this.description));
-365    param.alt = encode(param.alt || param.title);
-366    param.width = this.thumbnailWidth || String.EMPTY;
-367    param.height = this.thumbnailHeight || String.EMPTY;
-368    param.border = (param.border = 0);
-369    html.tag("img", param);
-370    return;
-371 }
-372 
-373 /**
-374  * 
-375  * @param {Object} param
-376  */
-377 Image.prototype.render_macro = function(param) {
-378    param.src = this.getUrl();
-379    param.title || (param.title = encode(this.description));
-380    param.alt = encode(param.alt || param.title);
-381    param.width || (param.width = this.width);
-382    param.height || (param.height = this.height);
-383    param.border || (param.border = 0);
-384    html.tag("img", param);
-385    return;
-386 }
-387 
-388 /**
-389  * 
-390  * @param {Object} name
-391  * @returns {helma.File}
-392  * @see Site#getStaticFile
-393  */
-394 Image.prototype.getFile = function(name) {
-395    name || (name = this.fileName);
-396    if (this.parent_type === "Layout") {
-397       var layout = this.parent || res.handlers.layout;
-398       return layout.getFile(name);
-399    }
-400    var site = this.parent || res.handlers.site;
-401    return site.getStaticFile("images/" + name);
-402 }
-403 
-404 /**
-405  * 
-406  * @param {Object} name
-407  * @returns {String}
-408  * @see Site#getStaticUrl
-409  */
-410 Image.prototype.getUrl = function(name) {
-411    name || (name = this.fileName);
-412    //name = encodeURIComponent(name);
-413    if (this.parent_type === "Layout") {
-414       var layout = this.parent || res.handlers.layout;
-415       res.push();
-416       res.write("layout/");
-417       res.write(name);
-418       return layout.site.getStaticUrl(res.pop());
-419    }
-420    var site = this.parent || res.handlers.site;
-421    return site.getStaticUrl("images/" + name);
-422 }
-423 
-424 /**
-425  * @returns {helma.File}
-426  */
-427 Image.prototype.getThumbnailFile = function() {
-428    return this.getFile(this.thumbnailName);
-429 }
-430 
-431 /**
-432  * @returns {String}
-433  */
-434 Image.prototype.getJSON = function() {
-435    return {
-436       name: this.name,
-437       origin: this.origin,
-438       description: this.description,
-439       contentType: this.contentType,
-440       contentLength: this.contentLength,
-441       width: this.width,
-442       height: this.height,
-443       thumbnailName: this.thumbnailName,
-444       thumbnailWidth: this.thumbnailWidth,
-445       thumbnailHeight: this.thumbnailHeight,
-446       created: this.created,
-447       creator: this.creator ? this.creator.name : null,
-448       modified: this.modified,
-449       modifier: this.modifier ? this.modifier.name : null,
-450    }.toSource();
-451 }
-452 
-453 /**
-454  * 
-455  * @param {helma.util.MimePart} mime
-456  * @param {Number} maxWidth
-457  * @param {Number} maxHeight
-458  * @throws {Error}
-459  * @returns {Object}
-460  */
-461 Image.prototype.getConstraint = function(mime, maxWidth, maxHeight) {
-462    try {
-463       var image = new helma.Image(mime.inputStream);
-464       var factorH = 1, factorV = 1;
-465       if (maxWidth && image.width > maxWidth) {
-466          factorH = maxWidth / image.width;
-467       }
-468       if (maxHeight && image.height > maxHeight) {
-469          factorV = maxHeight / image.height;
-470       }
-471       if (factorH !== 1 || factorV !== 1) {
-472          var width = Math.ceil(image.width * 
-473                (factorH < factorV ? factorH : factorV));
-474          var height = Math.ceil(image.height * 
-475                (factorH < factorV ? factorH : factorV));
-476          image.resize(width, height);
-477          if (mime.contentType.endsWith("gif")) {
-478             image.reduceColors(256);
-479          }
-480          return {resized: image, width: image.width, height: image.height};
-481       }
-482       return {width: image.width, height: image.height};
-483    } catch (ex) {
-484       app.log(ex);
-485       throw Error(gettext("Could not resize the image."));
-486    }
-487 }
-488 
-489 /**
-490  * 
-491  * @param {helma.Image|helma.util.MimePart} data
-492  * @param {Object} thumbnail
-493  * @throws {Error}
-494  */
-495 Image.prototype.writeFiles = function(data, thumbnail) {
-496    if (data) {
-497       try {
-498          // If data is a MimeObject (ie. has the writeToFile method)
-499          // the image was not resized and thus, we directly write it to disk
-500          var file = this.getFile();
-501          if (data.saveAs) {
-502             data.saveAs(file);
-503          } else if (data.writeToFile) {
-504             data.writeToFile(file.getParent(), file.getName());
-505          }
-506          if (thumbnail) {
-507             thumbnail.saveAs(this.getThumbnailFile());
-508          }
-509       } catch (ex) {
-510          app.log(ex);
-511          throw Error(gettext("Could not save the image file on disk."));         
-512       }
-513    }
-514    return;
-515 }
-516 
-517 /**
-518  * @throws {Error}
-519  */
-520 Image.prototype.removeFiles = function() {
-521    try {
-522       this.getFile().remove();
-523       var thumbnail = this.getThumbnailFile();
-524       if (thumbnail) {
-525          thumbnail.remove();
-526       }
-527    } catch (ex) {
-528       app.log(ex);
-529       throw Error(gettext("Could not remove the image file from disk."));
-530    }
-531    return;
-532 }
-533 
-534 /**
-535  * @returns {String}
-536  */
-537 Image.prototype.getConfirmText = function() {
-538    return gettext("You are about to delete the image {0}.", this.name);
-539 }
-540 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Images_Images.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Images_Images.js.html deleted file mode 100644 index 88df0dfe..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Images_Images.js.html +++ /dev/null @@ -1,214 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Images prototype
- 28  */
- 29 
- 30 markgettext("Images");
- 31 markgettext("images");
- 32 
- 33 /**
- 34  * @name Images
- 35  * @constructor
- 36  * @property {Image} _children
- 37  * @property {Tag[]} alphabeticalGalleries 
- 38  * @property {Tag[]} galleries
- 39  * @property {Tag[]} otherGalleries
- 40  * @extends HopObject
- 41  */
- 42 
- 43 /**
- 44  * 
- 45  * @param {String} action
- 46  * @returns {Boolean}
- 47  */
- 48 Images.prototype.getPermission = function(action) {
- 49    if (!this._parent.getPermission("main")) {
- 50       return false;
- 51    }
- 52    switch (action) {
- 53       case ".":
- 54       case "main":
- 55       case "create":
- 56       // FIXME: case "tags":
- 57       return Site.require(Site.OPEN) && session.user ||
- 58             Membership.require(Membership.CONTRIBUTOR) ||
- 59             User.require(User.PRIVILEGED);
- 60       case "all":
- 61       return this._parent.constructor !== Layout &&
- 62             (Membership.require(Membership.MANAGER) ||
- 63             User.require(User.PRIVILEGED));
- 64    }
- 65    return false;
- 66 }
- 67 
- 68 Images.prototype.main_action = function() {
- 69    var images, skin;
- 70    switch (this._parent.constructor) {
- 71       case Root:
- 72       case Site:
- 73       images = User.getMembership().images;
- 74       skin = "$Images#main";
- 75       res.data.title = gettext("Member Images");
- 76       break;
- 77       
- 78       case Layout:
- 79       images = res.handlers.layout.images;
- 80       skin = "$Images#layout";
- 81       res.data.title = gettext("Layout Images");
- 82       break;
- 83    }
- 84    res.data.list = renderList(images, "$Image#listItem", 
- 85          10, req.queryParams.page);
- 86    res.data.pager = renderPager(images, 
- 87          this.href(req.action), 10, req.queryParams.page);
- 88    res.data.body = this.renderSkinAsString(skin);
- 89    res.handlers.site.renderSkin("Site#page");
- 90    return;
- 91 }
- 92 
- 93 Images.prototype.create_action = function() {
- 94    File.redirectOnUploadError(this.href(req.action));
- 95    File.redirectOnExceededQuota(this.href());
- 96 
- 97    if (req.data.save) {
- 98       try {
- 99          var image = Image.add(req.params, this._parent);
-100          image.notify(req.action);
-101          JSON.sendPaddedResponse(image._id);
-102          res.message = gettext('The image was successfully added.');
-103          res.redirect(image.href());
-104       } catch (ex) {
-105          JSON.sendPaddedResponse(null);
-106          res.status = 400;
-107          res.message = ex.toString();
-108          app.log(ex);
-109       }
-110    }
-111 
-112    res.data.action = this.href(req.action);
-113    res.data.title = gettext("Add Image");
-114    HopObject.confirmConstructor(Image);
-115    res.data.body = (new Image).renderSkinAsString("$Image#edit");
-116    res.handlers.site.renderSkin("Site#page");
-117    return;
-118 }
-119 
-120 Images.prototype.all_action = function() {
-121    res.data.pager = renderPager(this, this.href(req.action), 
-122          10, req.queryParams.page);
-123    res.data.list = renderList(this, "$Image#listItem", 
-124          10, req.queryParams.page);
-125    res.data.title = gettext("All Images");
-126    res.data.body = this.renderSkinAsString("$Images#main");
-127    res.handlers.site.renderSkin("Site#page");
-128    return;
-129 }
-130 
-131 /**
-132  * @namespace
-133  * @field
-134  */
-135 Images.Default = new function() {
-136    var Image = function(name, description) {
-137       var dir = new helma.File(app.appsProperties['static'], "www");
-138       var image = new helma.Image(new helma.File(dir, name));
-139       this.name = name;
-140       this.description = description;
-141       this.width = image.width;
-142       this.height = image.height;
-143       this.getUrl = function() {
-144          return app.appsProperties.staticMountpoint + "/www/" + name;
-145       }
-146       this.render_macro = global.Image.prototype.render_macro;
-147       this.thumbnail_macro = global.Image.prototype.thumbnail_macro;
-148       return this;
-149    }
-150 
-151    var images = {};
-152    var add = function(name, description) {
-153       images[name] = new Image(name, description);
-154       return;
-155    }
-156    add("ant.png", "Ant");
-157    add("ant-icon.png", "Tiny Ant");
-158    add("big.gif", String.EMPTY);
-159    add("bullet.gif", "*");
-160    add("dot.gif", String.EMPTY);
-161    add("headbg.gif", String.EMPTY);
-162    add("helma.png", "Helma Object Publisher");
-163    add("hop.gif", "Helma Object Publisher");
-164    add("manage.gif", "manage");
-165    add("marquee.gif", String.EMPTY);
-166    add("menu.gif", "menu");
-167    add("pixel.gif", String.EMPTY);
-168    add("recent.gif", "recent");
-169    add("rss.png", "RSS feed");
-170    add("smallanim.gif", "Made with Antville");
-171    add("smallchaos.gif", "Made with Antville");
-172    add("smallstraight.gif", "Made with Antville");
-173    add("smalltrans.gif", "Made with Antville");
-174    add("status.gif", "status");
-175    add("webloghead.gif", "Antville");
-176    add("xmlbutton.gif", "XML version of this page");
-177    return images;
-178 }
-179 
-180 /**
-181  * @returns {Image[]}
-182  */
-183 Images.prototype.mergeImages = function() {
-184    var images = [];
-185    var layout = this._parent;
-186    while (layout) {
-187       layout.images.forEach(function() {
-188          if (images.indexOf(this) < 0) {
-189             images.push(this);
-190          }
-191          return;
-192       });
-193       layout = layout.parent;
-194    }
-195    return images.sort(Number.Sorter("created", Number.Sorter.DESC));
-196 }
-197 
-198 /**
-199  * 
-200  * @param {String} group
-201  * @returns {Tag[]}
-202  * @see Site#getTags
-203  */
-204 Images.prototype.getTags = function(group) {
-205    return this._parent.getTags("galleries", group);
-206 }
-207 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Layout_Layout.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Layout_Layout.js.html deleted file mode 100644 index 829fad8d..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Layout_Layout.js.html +++ /dev/null @@ -1,530 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Layout prototype
- 28  */
- 29 
- 30 markgettext("Layout");
- 31 markgettext("layout");
- 32 
- 33 /** @constant */
- 34 Layout.VALUES = [
- 35    "background color",
- 36    "link color",
- 37    "active link color",
- 38    "visited link color",
- 39    "big font",
- 40    "big font size",
- 41    "big font color",
- 42    "base font",
- 43    "base font size",
- 44    "base font color",
- 45    "small font",
- 46    "small font size",
- 47    "small font color"
- 48 ];
- 49 
- 50 /**
- 51  * @param {Site} site
- 52  * @param {User} user
- 53  * @returns {Layout}
- 54  */
- 55 Layout.add = function(site, user) {
- 56    HopObject.confirmConstructor(Layout);
- 57    var layout = new Layout;
- 58    layout.site = site;
- 59    layout.creator = user || session.user;
- 60    layout.created = new Date;
- 61    layout.mode = Layout.DEFAULT;
- 62    layout.reset();
- 63    layout.touch();
- 64    site.layout = layout;
- 65    return layout
- 66 }
- 67 
- 68 /**
- 69  * 
- 70  * @param {Layout} layout
- 71  * @param {Boolean} includeSelf
- 72  */
- 73 Layout.remove = function(options) {
- 74    if (this.constructor === Layout) {
- 75       // Backup current layout in temporary directory if possible
- 76       var dir = this.getFile();
- 77       // FIXME: Evaluate if using res.skinpath is necessary; dir could be fully sufficient.
- 78       if (res.skinpath && res.skinpath[0] && res.skinpath[0].equals(dir) &&
- 79                dir.exists() && dir.list().length > 0) {
- 80          var zip = this.getArchive(res.skinpath);
- 81          var file = java.io.File.createTempFile(this.site.name + "-layout-", ".zip");
- 82          zip.save(file);
- 83       }
- 84       HopObject.remove.call(this.skins);
- 85       HopObject.remove.call(this.images);
- 86       this.getFile().removeDirectory();
- 87       // The “force” flag is set e.g. when a whole site is removed
- 88       if (options && options.force) {
- 89          this.deleteMetadata();
- 90          this.remove();
- 91       }
- 92    }
- 93    return;
- 94 }
- 95 
- 96 /**
- 97  * @function
- 98  * @param {Boolean} [value]
- 99  * @returns {Boolean}
-100  */
-101 Layout.sandbox = function(value) {
-102    var cookie = User.COOKIE + 'LayoutSandbox';
-103    if (typeof value === 'undefined') {
-104       return req.cookies[cookie] === 'true';
-105    } 
-106    if (value === true) {
-107       res.setCookie(cookie, true);
-108    } else if (value === false) {
-109       res.unsetCookie(cookie);
-110    }
-111    return value;
-112 }
-113 
-114 /** 
-115  * @function
-116  * @returns {String[]}
-117  * @see defineConstants
-118  */
-119 Layout.getModes = defineConstants(Layout, "default", "shared");
-120 
-121 this.handleMetadata("origin");
-122 this.handleMetadata("originator");
-123 this.handleMetadata("originated");
-124 
-125 /**
-126  * @name Layout
-127  * @constructor
-128  * @property {Date} created
-129  * @property {User} creator
-130  * @property {Images} images
-131  * @property {Metadata} metadata
-132  * @property {String} mode
-133  * @property {Date} modified
-134  * @property {User} modifier
-135  * @property {String} origin
-136  * @property {String} originator
-137  * @property {Date} originated
-138  * @property {Site} site
-139  * @property {Skins} skins
-140  * @extends HopObject
-141  */
-142 Layout.prototype.constructor = function() {
-143    HopObject.confirmConstructor.call(this);
-144    return this;
-145 }
-146 
-147 /**
-148  * 
-149  * @param {String} action
-150  * @returns {Boolean}
-151  */
-152 Layout.prototype.getPermission = function(action) {
-153    switch (action) {
-154       case ".":
-155       case "main":
-156       case "export":
-157       case "images":
-158       case "import":
-159       case "reset":
-160       case "skins":
-161       case "sandbox":
-162       return res.handlers.site.getPermission("main") &&
-163             Membership.require(Membership.OWNER) ||
-164             User.require(User.PRIVILEGED);
-165    }
-166    return false;
-167 }
-168 
-169 // FIXME: The Layout.href method is overwritten to guarantee that
-170 // URLs won't contain the layout ID instead of "layout"
-171 /**
-172  * 
-173  * @param {String} action
-174  * @returns {String}
-175  */
-176 Layout.prototype.href = function(action) {
-177    res.push();
-178    res.write(res.handlers.site.href());
-179    res.write("layout/");
-180    action && res.write(action);
-181    return res.pop();
-182 }
-183 
-184 Layout.prototype.main_action = function() {
-185    if (req.postParams.save) {
-186       try {
-187          this.update(req.postParams);
-188          res.message = gettext("Successfully updated the layout.");
-189          res.redirect(this.href());
-190       } catch (ex) {
-191          res.message = ex;
-192          app.log(ex);
-193       }
-194    }
-195    res.data.title = gettext("Layout");
-196    res.data.body = this.renderSkinAsString("$Layout#main");
-197    res.handlers.site.renderSkin("Site#page");
-198    return;
-199 }
-200 
-201 /**
-202  * 
-203  * @param {String} name
-204  * @returns {Object}
-205  */
-206 Layout.prototype.getFormOptions = function(name) {
-207    switch (name) {
-208       case "mode":
-209       return Layout.getModes();
-210       case "parent":
-211       return this.getParentOptions();
-212    }
-213 }
-214 
-215 /**
-216  * 
-217  * @param {Object} data
-218  */
-219 Layout.prototype.update = function(data) {
-220    var skin = this.skins.getSkin("Site", "values");
-221    if (!skin) {
-222       Skin.add("Site", "values", this);
-223    }
-224    res.push();
-225    for (var key in data) {
-226       if (key.startsWith("value_")) {
-227          var value = data[key];
-228          key = key.substr(6);
-229          res.write("<% value ");
-230          res.write(quote(key));
-231          res.write(" ");
-232          res.write(quote(value));
-233          res.write(" %>\n");
-234       }
-235    }
-236    res.write("\n");
-237    skin.setSource(res.pop());
-238    Layout.sandbox(!!data.sandbox);   
-239    this.description = data.description;
-240    this.mode = data.mode;
-241    this.touch();
-242    return;
-243 }
-244 
-245 Layout.prototype.reset_action = function() {
-246    if (req.data.proceed) {
-247       try {
-248          Layout.remove.call(this);
-249          this.reset();
-250          res.message = gettext("{0} was successfully reset.", gettext("Layout"));
-251          res.redirect(this.href());
-252       } catch(ex) {
-253          res.message = ex;
-254          app.log(ex);
-255       }
-256    }
-257 
-258    res.data.action = this.href(req.action);
-259    res.data.title = gettext("Confirm Reset");
-260    res.data.body = this.renderSkinAsString("$HopObject#confirm", {
-261       text: this.getConfirmText()
-262    });
-263    res.handlers.site.renderSkin("Site#page");
-264 }
-265 
-266 Layout.prototype.export_action = function() {
-267    res.contentType = "application/zip";
-268    var zip = this.getArchive(res.skinpath);
-269    res.setHeader("Content-Disposition",
-270          "attachment; filename=" + this.site.name + "-layout.zip");
-271    res.writeBinary(zip.getData());
-272    return;
-273 }
-274 
-275 Layout.prototype.import_action = function() {
-276    var self = this;
-277    var data = req.postParams;
-278    if (data.submit) {
-279       try {
-280          if (!data.upload || data.upload.contentLength === 0) {
-281             throw Error(gettext("Please upload a zipped layout archive"));
-282          }
-283          // Extract zipped layout to temporary directory
-284          var dir = this.site.getStaticFile();
-285          var temp = new helma.File(dir, "import.temp");
-286          var fname = data.upload.writeToFile(dir);
-287          var zip = new helma.File(dir, fname);
-288          (new helma.Zip(zip)).extractAll(temp);
-289          zip.remove();
-290          var data = Xml.read(new helma.File(temp, "data.xml"));
-291          if (!data.version) {
-292             throw Error(gettext("Sorry, this layout is not compatible with Antville."));
-293          }
-294          // Remove current layout and replace it with imported one
-295          Layout.remove.call(this);
-296          temp.renameTo(this.getFile());
-297          this.origin = data.origin;
-298          this.originator = data.originator;
-299          this.originated = data.originated;
-300          data.images.forEach(function() {
-301             Image.add(this);
-302          });
-303          this.touch();
-304          res.message = gettext("The layout was successfully imported.");
-305       } catch (ex) {
-306          res.message = ex;
-307          app.log(ex);
-308          temp && temp.removeDirectory();
-309          res.redirect(this.href(req.action));
-310       }
-311       res.redirect(this.href());
-312       return;
-313    }
-314    res.data.title = gettext("Import Layout");
-315    res.data.body = this.renderSkinAsString("$Layout#import");
-316    res.handlers.site.renderSkin("Site#page");
-317    return;
-318 }
-319 
-320 /**
-321  * 
-322  * @param {String} name
-323  * @param {String} fallback
-324  * @returns {Image}
-325  */
-326 Layout.prototype.getImage = function(name, fallback) {
-327    var layout = this;
-328    while (layout) {
-329       layout.images.prefetchChildren();
-330       if (layout.images.get(name)) {
-331          return layout.images.get(name);
-332       }
-333       if (fallback && layout.images.get(fallback)) {
-334          return layout.images.get(fallback);
-335       }
-336       layout = layout.parent;
-337    }
-338    return null;
-339 }
-340 
-341 /**
-342  * 
-343  * @param {String} name
-344  * @returns {helma.File}
-345  */
-346 Layout.prototype.getFile = function(name) {
-347    name || (name = String.EMPTY);
-348    return this.site.getStaticFile("layout/" + name);
-349 }
-350 
-351 /**
-352  * @returns {String[]}
-353  */
-354 Layout.prototype.getSkinPath = function() {
-355    if (!this.site) {
-356       return null;
-357    }
-358    var skinPath = [this.getFile().toString()];
-359    return skinPath;
-360 }
-361 
-362 /**
-363  * 
-364  */
-365 Layout.prototype.reset = function() {
-366    var skinFiles = app.getSkinfilesInPath([app.dir]);
-367    var content, dir, file;
-368    for (var name in skinFiles) {
-369       if (content = skinFiles[name][name]) {
-370          dir = this.getFile(name);
-371          file = new helma.File(dir, name + ".skin");
-372          dir.makeDirectory();
-373          file.open();
-374          file.write(content);
-375          file.close();
-376       }
-377    }
-378 
-379    // FIXME: Reset the Site skin of root separately
-380    content = skinFiles.Root.Site;
-381    file = new helma.File(this.getFile("Root"), "Site.skin");
-382    dir.makeDirectory();
-383    file.open();
-384    file.write(content);
-385    file.close()
-386 
-387    this.touch();
-388    return;
-389 }
-390 
-391 /**
-392  * 
-393  * @param {String} skinPath
-394  * @returns {helma.Zip}
-395  */
-396 Layout.prototype.getArchive = function(skinPath) {
-397    var zip = new helma.Zip();
-398    var skinFiles = app.getSkinfilesInPath(skinPath);
-399    for (var name in skinFiles) {
-400       if (skinFiles[name][name]) {
-401          var file = new helma.File(this.getFile(name), name + ".skin");
-402          if (file.exists()) {
-403             zip.add(file, name);
-404          }
-405       }
-406    }
-407 
-408    // FIXME: Add the Site skin of root separately
-409    file = new helma.File(this.getFile("Root"), "Site.skin");
-410    file.exists() && zip.add(file, "Root");
-411 
-412    var data = new HopObject;
-413    data.images = new HopObject;
-414    this.images.forEach(function() {
-415       zip.add(this.getFile());
-416       try {
-417          zip.add(this.getThumbnailFile());
-418       } catch (ex) {
-419          /* Most likely the thumbnail file is identical to the image */ 
-420       }
-421       var image = new HopObject;
-422       for each (var key in Image.KEYS) {
-423          image[key] = this[key];
-424          data.images.add(image);
-425       }
-426    });
-427       
-428    data.version = Root.VERSION.toString();
-429    data.origin = this.origin || this.site.href();
-430    data.originator = this.originator || session.user.name;
-431    data.originated = this.originated || new Date;
-432    
-433    // FIXME: XML encoder is losing all mixed-case properties :(
-434    var xml = new java.lang.String(Xml.writeToString(data));
-435    zip.addData(xml.getBytes("UTF-8"), "data.xml");
-436    zip.close();
-437    return zip;
-438 }
-439 
-440 
-441 /**
-442  * @returns {String}
-443  */
-444 Layout.prototype.getConfirmText = function() {
-445    return gettext("You are about to reset the layout of site {0}.", 
-446          this.site.name);
-447 }
-448 /**
-449  * 
-450  * @param {String} name
-451  * @returns {HopObject}
-452  */
-453 Layout.prototype.getMacroHandler = function(name) {
-454    switch (name) {
-455       case "skins":
-456       return this[name];
-457       
-458       default:
-459       return null;
-460    }
-461 }
-462 
-463 /**
-464  * 
-465  * @param {Object} param
-466  * @param {String} name
-467  * @param {String} mode
-468  */
-469 Layout.prototype.image_macro = function(param, name, mode) {
-470    name || (name = param.name);
-471    if (!name) {
-472       return;
-473    }
-474 
-475    var image = this.getImage(name, param.fallback);
-476    if (!image) {
-477       return;
-478    }
-479 
-480    mode || (mode = param.as);
-481    var action = param.linkto;
-482    delete(param.name);
-483    delete(param.as);
-484    delete(param.linkto);
-485 
-486    switch (mode) {
-487       case "url" :
-488       return res.write(image.getUrl());
-489       case "thumbnail" :
-490       action || (action = image.getUrl());
-491       return image.thumbnail_macro(param);
-492    }
-493    image.render_macro(param);
-494    return;
-495 }
-496 
-497 /**
-498  * 
-499  */
-500 Layout.prototype.values_macro = function() {
-501    var values = [];
-502    for (var key in res.meta.values) {
-503       values.push({key: key, value: res.meta.values[key]});
-504    }
-505    values.sort(new String.Sorter("key"));
-506    for each (var pair in values) {
-507       this.renderSkin("$Layout#value", {
-508          key: pair.key.capitalize(), 
-509          value: pair.value
-510       });
-511    }
-512    return;
-513 }
-514 
-515 /**
-516  *
-517  */
-518 Layout.prototype.sandbox_macro = function() {
-519    res.write(Layout.sandbox());
-520    return;
-521 }
-522 
-523 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_LogEntry_LogEntry.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_LogEntry_LogEntry.js.html deleted file mode 100644 index 19db8e1e..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_LogEntry_LogEntry.js.html +++ /dev/null @@ -1,107 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the LogEntry prototype.
- 28  */
- 29 
- 30 markgettext("Log Entry");
- 31 markgettext("log entry");
- 32 
- 33 /**
- 34  * @name LogEntry
- 35  * @constructor
- 36  * @param {HopObject} context
- 37  * @param {String} action
- 38  * @property {String} action
- 39  * @property {HopObject} context
- 40  * @property {Number} context_id
- 41  * @property {String} context_type
- 42  * @property {Date} created
- 43  * @property {User} creator
- 44  * @property {String} referrer 
- 45  * @extends HopObject
- 46  */
- 47 LogEntry.prototype.constructor = function(context, action) {
- 48    this.context = context;
- 49    this.action = action;
- 50    this.referrer = req.data.http_referer;
- 51    this.creator = session.user;
- 52    this.created = new Date;
- 53    this.ip = req.data.http_remotehost; // Won't be stored in database
- 54    this.site = res.handlers.site;
- 55    return this;
- 56 }
- 57 
- 58 /**
- 59  * @returns {String}
- 60  */
- 61 LogEntry.prototype.toString = function() {
- 62    return "[LogEntry #" + this._id + ": " + (this.creator || "anonymous") + 
- 63          " requested " + this.action + " action of " + this.context_type + 
- 64          " #" + this.context_id + " on " + formatDate(this.created) + "]";
- 65 } 
- 66 
- 67 /**
- 68  * 
- 69  * @param {String} name
- 70  * @returns {HopObject}
- 71  */
- 72 LogEntry.prototype.getMacroHandler = function(name) {
- 73    switch (name) {
- 74       case "context":
- 75       return this.context || {name: this.context_id};
- 76    }
- 77    return null;
- 78 }
- 79 
- 80 /**
- 81  * 
- 82  * @param {Object} param
- 83  */
- 84 LogEntry.prototype.label_macro = function(param) {
- 85    if (!User.require(User.PRIVILEGED)) {
- 86       return;
- 87    }
- 88    switch (this.context_type) {
- 89       case "Site" :
- 90       res.write("<span class=\"flagDark\" style=\"background-color:#006600;\">SITE</span>");
- 91       break;
- 92       case "User" :
- 93       res.write("<span class=\"flagDark\" style=\"background-color:#009900;\">USER</span>");
- 94       break;
- 95       default :
- 96       res.write("<span class=\"flagLight\" style=\"background-color:#FFCC00;\">ROOT</span>");
- 97    }
- 98    return;
- 99 }
-100 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Members_Members.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Members_Members.js.html deleted file mode 100644 index e4c7b225..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Members_Members.js.html +++ /dev/null @@ -1,405 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Members prototype.
- 28  */
- 29 
- 30 markgettext("Members");
- 31 markgettext("members");
- 32 
- 33 /**
- 34  * @name Members
- 35  * @constructor
- 36  * @property {Membership[]} _children
- 37  * @property {Membership[]} contributors
- 38  * @property {Membership[]} managers
- 39  * @property {Membership[]} owners
- 40  * @property {Membership[]} subscribers
- 41  * @extends HopObject
- 42  */
- 43 
- 44 /**
- 45  * 
- 46  * @param {String} action
- 47  * @returns {Boolean}
- 48  */
- 49 Members.prototype.getPermission = function(action) {
- 50    switch (action) {
- 51       case "login":
- 52       case "logout":
- 53       case "register":
- 54       case "reset":
- 55       case "salt.txt":
- 56       return true;
- 57    }
- 58       
- 59    if (!this._parent.getPermission("main")) {
- 60       return false;
- 61    }
- 62 
- 63    switch (action) {
- 64       case "edit":
- 65       case "privileges":
- 66       case "subscriptions":
- 67       case "updated":
- 68       return !!session.user;
- 69       
- 70       case ".":
- 71       case "main":
- 72       case "add":
- 73       case "owners":
- 74       case "managers":
- 75       case "contributors":
- 76       case "subscribers":
- 77       return Membership.require(Membership.OWNER) ||
- 78             User.require(User.PRIVILEGED);
- 79    }
- 80 
- 81    return Feature.getPermission.apply(this, arguments);
- 82 }
- 83 
- 84 Members.prototype.main_action = function() {
- 85    res.data.title = gettext("Site Members");
- 86    res.data.list = renderList(this, "$Membership#member", 
- 87          10, req.queryParams.page);
- 88    res.data.pager = renderPager(this, this.href(req.action), 
- 89          10, req.queryParams.page);
- 90    res.data.body = this.renderSkinAsString("$Members#main");
- 91    res.handlers.site.renderSkin("Site#page");
- 92    return;
- 93 }
- 94 
- 95 Members.prototype.register_action = function() {
- 96    if (req.postParams.register) {
- 97       try {
- 98          var title = res.handlers.site.title;
- 99          var user = User.register(req.postParams);
-100          var membership = Membership.add(user, Membership.SUBSCRIBER, this._parent);
-101          membership.notify(req.action, user.email, 
-102                gettext('[{0}] Welcome to {1}!', root.title, title));
-103          res.message = gettext('Welcome to “{0}”, {1}. Have fun!',
-104                title, user.name);
-105          res.redirect(User.getLocation() || this._parent.href());
-106       } catch (ex) {
-107          res.message = ex;
-108       }
-109    }
-110 
-111    session.data.token = User.getSalt();
-112    res.data.action = this.href(req.action);
-113    res.data.title = gettext("Register");
-114    res.data.body = this.renderSkinAsString("$Members#register");
-115    this._parent.renderSkin("Site#page");
-116    return;
-117 }
-118 
-119 Members.prototype.reset_action = function() {
-120    if (req.postParams.reset) {
-121       try {
-122          if (!req.postParams.name || !req.postParams.email) {
-123             throw Error(gettext("Please enter a user name and e-mail address."));
-124          }
-125          var user = User.getByName(req.postParams.name);
-126          if (!user || user.email !== req.postParams.email) {
-127             throw Error(gettext("User name and e-mail address do not match."))
-128          }
-129          var token = User.getSalt();
-130          user.setMetadata("resetToken", token);
-131          sendMail(user.email, gettext("[{0}] Password reset confirmation", root.title),
-132                user.renderSkinAsString("$User#notify_reset", {
-133                   href: this.href("reset"),
-134                   token: token
-135                }));
-136          res.message = gettext("A confirmation mail was sent to your e-mail address.");
-137          res.redirect(this._parent.href());
-138       } catch(ex) {
-139          res.message = ex;
-140       }
-141    } else if (req.data.user && req.data.token) {
-142       var user = User.getById(req.data.user);
-143       if (user) {
-144          var token = user.getMetadata("resetToken");
-145          if (token && token === req.data.token) {
-146             session.login(user);
-147             if (req.postParams.save) {
-148                var password = req.postParams.password;
-149                if (!password) {
-150                   res.message = gettext("Please enter a new password.");
-151                } else if (password !== req.postParams.passwordConfirm) {
-152                   res.message = gettext("The passwords do not match.");
-153                } else {
-154                   user.hash = (password + user.salt).md5();
-155                   user.setMetadata("resetToken", null);
-156                   res.message = gettext("Your password was changed.");
-157                   res.redirect(this._parent.href());
-158                }
-159             }
-160             res.data.title = gettext("Reset Password");
-161             res.data.body = this.renderSkinAsString("$Members#password");
-162             this._parent.renderSkin("Site#page");
-163             return;
-164          }
-165       }
-166       res.message = gettext("This URL is not valid for resetting your password.");
-167       res.redirect(this.href(req.action));
-168    }
-169    res.data.action = this.href(req.action);
-170    res.data.title = gettext("Request Password Reset");
-171    res.data.body = this.renderSkinAsString("$Members#reset");
-172    this._parent.renderSkin("Site#page");
-173    return;
-174 }
-175 
-176 Members.prototype.login_action = function() {
-177    if (req.postParams.login) {
-178       try {
-179          var user = User.login(req.postParams);
-180          res.message = gettext('Welcome to {0}, {1}. Have fun!',
-181                res.handlers.site.getTitle(), user.name);
-182          res.redirect(User.getLocation() || this._parent.href());
-183       } catch (ex) {
-184          res.message = ex;
-185       }
-186    }
-187    session.data.token = User.getSalt();
-188    res.data.action = this.href(req.action);
-189    res.data.title = gettext("Login");
-190    res.data.body = this.renderSkinAsString("$Members#login");
-191    this._parent.renderSkin("Site#page");
-192    return;
-193 }
-194 
-195 Members.prototype.logout_action = function() {
-196    if (session.user) {
-197       res.message = gettext("Good bye, {0}! Looking forward to seeing you again!", 
-198             session.user.name);
-199       User.logout();
-200    }
-201    res.redirect(this._parent.href());
-202    return;
-203 }
-204 
-205 Members.prototype.edit_action = function() {
-206    if (req.postParams.save) {
-207       try {
-208          session.user.update(req.postParams);
-209          res.message = gettext("The changes were saved successfully.");
-210          res.redirect(this._parent.href());
-211       } catch (err) {
-212          res.message = err.toString();
-213       }
-214    }
-215 
-216    session.data.token = User.getSalt();
-217    session.data.salt = session.user.salt; // FIXME
-218    res.data.title = gettext("User Profile");
-219    res.data.body = session.user.renderSkinAsString("$User#edit");
-220    this._parent.renderSkin("Site#page");
-221    return;
-222 }
-223 
-224 Members.prototype.salt_txt_action = function() {
-225    res.contentType = "text/plain";
-226    var user;
-227    if (user = User.getByName(req.queryParams.user)) {
-228       res.write(user.salt || String.EMPTY);
-229    }
-230    return;
-231 }
-232 
-233 Members.prototype.owners_action = function() {
-234    res.data.title = gettext("Site Owners");
-235    res.data.list = renderList(this.owners, 
-236          "$Membership#member", 10, req.queryParams.page);
-237    res.data.pager = renderPager(this.owners, 
-238          this.href(req.action), 10, req.queryParams.page);
-239    res.data.body = this.renderSkinAsString("$Members#main");
-240    res.handlers.site.renderSkin("Site#page");
-241    return;
-242 }
-243 
-244 Members.prototype.managers_action = function() {
-245    res.data.title = gettext("Site Managers");
-246    res.data.list = renderList(this.managers, 
-247          "$Membership#member", 10, req.queryParams.page); 
-248    res.data.pager = renderPager(this.managers, 
-249          this.href(req.action), 10, req.queryParams.page);
-250    res.data.body = this.renderSkinAsString("$Members#main");
-251    res.handlers.site.renderSkin("Site#page");
-252    return;
-253 }
-254 
-255 Members.prototype.contributors_action = function() {
-256    res.data.title = gettext("Site Contributors");
-257    res.data.list = renderList(this.contributors, 
-258          "$Membership#member", 10, req.queryParams.page);
-259    res.data.pager = renderPager(this.contributors, 
-260          this.href(req.action), 10, req.data.page);
-261    res.data.body = this.renderSkinAsString("$Members#main");
-262    res.handlers.site.renderSkin("Site#page");
-263    return;
-264 }
-265 
-266 Members.prototype.subscribers_action = function() {
-267    res.data.title = gettext("Site Subscribers");
-268    res.data.list = renderList(this.subscribers, 
-269          "$Membership#member", 10, req.queryParams.page);
-270    res.data.pager = renderPager(this.subscribers, 
-271          this.href(req.action), 10, req.queryParams.page);
-272    res.data.body = this.renderSkinAsString("$Members#main");
-273    res.handlers.site.renderSkin("Site#page");
-274    return;
-275 }
-276 
-277 Members.prototype.updated_action = function() {
-278    res.data.title = gettext("Updates");
-279    res.data.list = session.user.renderSkinAsString("$User#sites");
-280    res.data.body = session.user.renderSkinAsString("$User#subscriptions");
-281    res.handlers.site.renderSkin("Site#page");
-282    return;
-283 }
-284 
-285 Members.prototype.privileges_action = function() {
-286    var site = res.handlers.site;
-287    res.data.title = gettext("Privileges");
-288    res.data.list = renderList(session.user.memberships, function(item) {
-289       res.handlers.subscription = item.site;
-290       item.renderSkin("$Membership#subscription");
-291       return;
-292    });
-293    res.handlers.site = site;
-294    res.data.body = session.user.renderSkinAsString("$User#subscriptions");
-295    res.handlers.site.renderSkin("Site#page");
-296    return;
-297 }
-298 
-299 Members.prototype.subscriptions_action = function() {
-300    var site = res.handlers.site;
-301    res.data.title = gettext("Subscriptions");
-302    res.data.list = renderList(session.user.subscriptions, function(item) {
-303       res.handlers.subscription = item.site;
-304       item.renderSkin("$Membership#subscription");
-305       return;
-306    });
-307    res.handlers.site = site;
-308    res.data.body = session.user.renderSkinAsString("$User#subscriptions");
-309    res.handlers.site.renderSkin("Site#page");
-310    return;
-311 }
-312 
-313 Members.prototype.add_action = function() {
-314    if (req.postParams.term) {
-315       try {
-316          var result = this.search(req.postParams.term);
-317          if (result.length < 1) {
-318             res.message = gettext("No user found to add as member.");
-319          } else {
-320             if (result.length >= 100) {
-321                res.message = gettext("Too many users found, displaying the first {0} matches only.", 
-322                      result.length);
-323             } else {
-324                res.message = ngettext("One user found.", "{0} users found.", 
-325                       result.length);
-326             }
-327             res.data.result = this.renderSkinAsString("$Members#results", result);
-328          }
-329       } catch (ex) {
-330          res.message = ex;
-331          app.log(ex);
-332       }
-333    } else if (req.postParams.add) {
-334       try {
-335          var membership = this.addMembership(req.postParams);
-336          membership.notify(req.action, membership.creator.email,  
-337                gettext('[{0}] Notification of membership change', root.title));
-338          res.message = gettext("Successfully added {0} to the list of members.", 
-339                req.postParams.name);
-340          res.redirect(membership.href("edit"));
-341       } catch (ex) {
-342          res.message = ex;
-343          app.log(ex);
-344       }
-345       res.redirect(this.href());
-346    }
-347    res.data.action = this.href(req.action);
-348    res.data.title = gettext('Add Member');
-349    res.data.body = this.renderSkinAsString("$Members#add");
-350    res.handlers.site.renderSkin("Site#page");
-351    return;
-352 }
-353 
-354 /**
-355  * 
-356  * @param {String} searchString
-357  * @returns {Object}
-358  */
-359 Members.prototype.search = function(searchString) {
-360    var self = this;
-361    var mode = "=";
-362    if (searchString.contains("*")) {
-363       searchString = searchString.replace(/\*/g, "%");
-364       mode = "like";
-365    }
-366    var sql = new Sql;
-367    sql.retrieve(Sql.MEMBERSEARCH, mode, searchString, 100);
-368    var counter = 0, name;
-369    res.push();
-370    sql.traverse(function() {
-371       // Check if the user is not already a member
-372       if (!self.get(this.name)) {
-373          self.renderSkin("$Members#result", {name: this.name});
-374          counter += 1;
-375       }
-376    });
-377    return {
-378       result: res.pop(),
-379       length: counter
-380    };
-381 }
-382 
-383 /**
-384  * 
-385  * @param {Object} data
-386  * @returns {Membership}
-387  */
-388 Members.prototype.addMembership = function(data) {
-389    var user = root.users.get(data.name);
-390    if (!user) {
-391       throw Error(gettext("Sorry, your input did not match any registered user."));
-392    } else if (this.get(data.name)) {
-393       throw Error(gettext("This user is already a member of this site."));
-394    }
-395    var membership = Membership.add(user, Membership.SUBSCRIBER, this._parent);
-396    return membership;
-397 }
-398 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Membership_Membership.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Membership_Membership.js.html deleted file mode 100644 index ebb4ccf1..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Membership_Membership.js.html +++ /dev/null @@ -1,347 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Membership prototype
- 28  */
- 29 
- 30 markgettext("Membership");
- 31 markgettext("membership");
- 32 
- 33 /**
- 34  * 
- 35  * @param {String} name
- 36  * @param {Site} site
- 37  * @returns {Membership}
- 38  */
- 39 Membership.getByName = function(name, site) {
- 40    return (site || res.handlers.site).members.get(name);
- 41 }
- 42 
- 43 /**
- 44  * 
- 45  * @param {String} role
- 46  * @returns {Boolean}
- 47  */
- 48 Membership.require = function(role) {
- 49    if (res.handlers.membership) {
- 50       return res.handlers.membership.require(role);
- 51    }
- 52    return false;
- 53 }
- 54 
- 55 /**
- 56  * @function
- 57  * @returns {String[]}
- 58  * @see defineConstants
- 59  */
- 60 Membership.getRoles = defineConstants(Membership, markgettext("Subscriber"), 
- 61       markgettext("Contributor"), markgettext("Manager"), markgettext("Owner"));
- 62 
- 63 
- 64 /**
- 65  * @param {User} user
- 66  * @param {String} role
- 67  * @param {Site} site
- 68  */
- 69 Membership.add = function(user, role, site) {
- 70    HopObject.confirmConstructor(Membership);
- 71    user || (user = session.user);
- 72    var membership = new Membership(user, role);
- 73    membership.created = new Date;
- 74    membership.touch();
- 75    site.members.add(membership);
- 76    return membership;
- 77 }
- 78 /**
- 79  * 
- 80  * @param {Membership} membership
- 81  * @param {Object} options
- 82  */
- 83 Membership.remove = function(options) {
- 84    options || (options = {});
- 85    if (this.constructor !== Membership) {
- 86       return;
- 87    }
- 88    if (!options.force && !this.getPermission("delete")) {
- 89       throw Error(gettext("Sorry, an owner of a site cannot be removed."));
- 90    }
- 91    var recipient = this.creator.email;
- 92    this.remove();
- 93    if (!options.force) {
- 94       this.notify(req.action, recipient,  
- 95             gettext("[{0}] Notification of membership cancellation", root.title));
- 96    }
- 97    return;
- 98 }
- 99 
-100 /**
-101  * @name Membership
-102  * @constructor
-103  * @param {User} user
-104  * @param {String} role
-105  * @property {Comment[]} comments
-106  * @property {Story[]} content
-107  * @property {Date} created
-108  * @property {User} creator
-109  * @property {File[]} files
-110  * @property {Image[]} images
-111  * @property {Date} modified
-112  * @property {User} modifier
-113  * @property {String} name
-114  * @property {Poll[]} polls
-115  * @property {String} role
-116  * @property {Site} site
-117  * @property {Story[]} stories
-118  * @extends HopObject
-119  */
-120 Membership.prototype.constructor = function(user, role) {
-121    HopObject.confirmConstructor(this);
-122    user || (user = session.user);
-123    if (user) {
-124       this.map({
-125          creator: user,
-126          name: user.name,
-127          role: role
-128       });
-129    }
-130    return this;
-131 }
-132 
-133 /**
-134  * 
-135  * @param {String} action
-136  * @return {Boolean}
-137  */
-138 Membership.prototype.getPermission = function(action) {
-139    if (!res.handlers.site.getPermission("main")) {
-140       return false;
-141    }
-142    switch (action) {
-143       case "contact":
-144       return true;
-145       case "edit":
-146       case "delete":
-147       return User.require(User.PRIVILEGED) || 
-148             this.role !== Membership.OWNER || this.creator !== session.user;
-149    }
-150    return false;
-151 }
-152 
-153 /**
-154  * 
-155  * @param {String} name
-156  * @returns {Object}
-157  */
-158 Membership.prototype.getFormOptions = function(name) {
-159    switch (name) {
-160       case "role":
-161       return Membership.getRoles();
-162    }
-163    return;
-164 }
-165 
-166 Membership.prototype.edit_action = function() {
-167    if (req.postParams.save) {
-168       try {
-169          this.update(req.postParams);
-170          res.message = gettext("The changes were saved successfully.");
-171          res.redirect(this._parent.href());
-172       } catch(ex) {
-173          res.message = ex;
-174          app.log(ex);
-175       }
-176    }
-177    
-178    res.data.action = this.href(req.action);
-179    res.data.title = gettext("Edit Membership: {0}", this.name);
-180    res.data.body = this.renderSkinAsString("$Membership#edit");
-181    this.site.renderSkin("Site#page");
-182    return;
-183 }
-184 
-185 /**
-186  * 
-187  * @param {Object} data
-188  */
-189 Membership.prototype.update = function(data) {
-190    if (!data.role) {
-191       throw Error(gettext("Please choose a role for this member."));
-192    } else if (this.user === session.user) {
-193       throw Error(gettext("Sorry, you are not allowed to edit your own membership."));
-194    } else if (data.role !== this.role) {
-195       this.role = data.role || Membership.SUBSCRIBER;
-196       this.touch();
-197       this.notify(req.action, this.creator.email, 
-198             gettext("[{0}] Notification of membership change", root.title));
-199    }
-200    return;
-201 }
-202 
-203 Membership.prototype.contact_action = function() {
-204    if (req.postParams.send) {
-205       try {
-206          if (!req.postParams.text) {
-207             throw Error(gettext("Please enter the message text."));
-208          }
-209          Feature.invoke("recaptcha", function() {
-210             return this.verify(req.postParams);
-211          });
-212          this.notify(req.action, this.creator.email, session.user ?
-213                gettext('[{0}] Message from user {1}', root.title, session.user.name) :
-214                gettext('[{0}] Message from anonymous user', root.title));
-215          res.message = gettext("Your message was sent successfully.");
-216          res.redirect(this._parent.getPermission() ? 
-217                this._parent.href() : this.site.href());
-218       } catch(ex) {
-219          res.message = ex;
-220          app.log(ex);
-221       }
-222    }
-223    
-224    res.data.action = this.href(req.action);
-225    res.data.title = gettext('Contact User: {0}', this.name);
-226    res.data.body = this.renderSkinAsString("$Membership#contact");
-227    this.site.renderSkin("Site#page");
-228    return;
-229 }
-230 
-231 Membership.prototype.content_action = function() {
-232    res.data.list = renderList(this.content, "$Story#listItem", 
-233          10, req.queryParams.page);
-234    res.data.pager = renderPager(this.content, 
-235          this.href(), 10, req.queryParams.page);
-236    res.data.title = gettext("Content of User: {0}", this.name);
-237    res.data.body = this.renderSkinAsString("$Membership#content");
-238    this.site.renderSkin("Site#page");
-239 }
-240 
-241 /**
-242  * 
-243  * @param {String} name
-244  * @returns {HopObject}
-245  */
-246 Membership.prototype.getMacroHandler = function(name) {
-247    switch (name) {
-248       case "user":
-249       return this.creator;
-250    }
-251    return null;
-252 }
-253 
-254 /**
-255  * 
-256  * @param {String} role
-257  * @returns {Boolean}
-258  */
-259 Membership.prototype.require = function(role) {
-260    var roles = [Membership.SUBSCRIBER, Membership.CONTRIBUTOR, 
-261          Membership.MANAGER, Membership.OWNER];
-262    if (role) {
-263       return roles.indexOf(this.role) >= roles.indexOf(role);
-264    }
-265    return false;
-266 }
-267 
-268 /**
-269  * 
-270  * @param {String} action
-271  * @param {String} recipient
-272  * @param {String} subject
-273  */
-274 Membership.prototype.notify = function(action, recipient, subject) {
-275    switch (action) {
-276       case "add":
-277       case "contact":
-278       case "delete":
-279       case "edit":
-280       case "register":
-281       res.handlers.sender = User.getMembership();
-282       sendMail(recipient, subject, this.renderSkinAsString("$Membership#notify_" + action),
-283             {footer: action !== "contact"});
-284       break;
-285    }
-286    return;
-287 }
-288 
-289 /**
-290  * @returns {String}
-291  */
-292 Membership.prototype.getConfirmText = function() {
-293    return gettext("You are about to delete the membership of user {0}.", 
-294          this.creator.name);
-295 }
-296 
-297 /**
-298  * @returns {String}
-299  */
-300 Membership.prototype.toString = function() {
-301    return (this.role || "Transient") + " membership of user " + this.name;
-302 }
-303 
-304 /**
-305  * @function
-306  * @see #toString
-307  */
-308 Membership.prototype.valueOf = Membership.prototype.toString;
-309 
-310 /**
-311  * 
-312  */
-313 Membership.prototype.status_macro = function() {
-314    this.renderSkin(session.user ? "Membership#status" : "Membership#login");
-315    return;
-316 }
-317 
-318 /**
-319  * 
-320  */
-321 Membership.prototype.role_macro = function() {
-322    this.role && res.write(gettext(this.role.capitalize()));
-323    return;
-324 }
-325 
-326 /**
-327  * 
-328  * @param {Object} value
-329  * @param {Object} param
-330  * @returns {String}
-331  * @see HopObject#link_filter
-332  */
-333 Membership.prototype.link_filter = function(value, param) {
-334    if (!session.user || !session.user.url) {
-335       return value;
-336    }
-337    return HopObject.prototype.link_filter.call(this, value, 
-338          param, session.user.url); // || this.href());
-339 }
-340 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Metadata_Metadata.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Metadata_Metadata.js.html deleted file mode 100644 index 80be993f..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Metadata_Metadata.js.html +++ /dev/null @@ -1,168 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileoverview Defines the Metadata prototype (version 2).
- 28  */
- 29 
- 30 /**
- 31  * Get an object representing the type properties settings suitable for 
- 32  * defining prototypes with the definePrototype() method.
- 33  * @returns {Object} The type properties settings as object.
- 34  * @see <a href="http://helma.org/wiki/Defining+HopObject+mappings+programmatically">Helma documentation</a>
- 35  */
- 36 Metadata.getTypeProperties = function() {
- 37    return {
- 38       collection: "Metadata",
- 39       "local.1": "$id",
- 40       "foreign.1": "parent_id",
- 41       "local.2": "$prototype",
- 42       "foreign.2": "parent_type",
- 43       accessName: "name"
- 44    }
- 45 }
- 46 
- 47 /**
- 48  * Prepare a value for writing it to the metadata database table.
- 49  * The type of each metadata is stored along with its value.
- 50  * The normalize() method determines the type and possibly modifies 
- 51  * the value accordingly.
- 52  * @param {Object} value
- 53  * @returns {Array} Compound value consisting of two elements, 
- 54  * the (normalized) metadata value and its type.
- 55  */
- 56 Metadata.normalize = function(value) {
- 57    if (value === null || value === undefined) {
- 58       return [null, null];
- 59    }
- 60 
- 61    if (!value.constructor) {
- 62       value = String(value);
- 63    }
- 64 
- 65    var Constructor = value.constructor;
- 66    switch (Constructor) {
- 67       case Boolean:
- 68       case String:
- 69       case Number:
- 70       value = String(value);
- 71       break;
- 72 
- 73       case Date:
- 74       value = Number(value);
- 75       break;
- 76 
- 77       default:
- 78       value = value.toSource();
- 79    }
- 80    return [value, Constructor.name];
- 81 }
- 82 
- 83 /**
- 84  * @name Metadata
- 85  * @constructor
- 86  * @description The Metadata prototype provides means to store one metadata key-value
- 87  * pair per record in the metadata database table. Each record is assigned to a
- 88  * parent HopObject which is fitted with convenient methods to easily retrieve 
- 89  * and modify the attached metadata objects.
- 90  * @see HopObject#handleMetadata
- 91  * @property {HopObject} parent The HopObject the metadata belongs to.
- 92  * @property {String} name The name (key) of the metadata object.
- 93  * @property {Object} value The value of the metadata object.
- 94  * @property {String} type The type of the metadata object.
- 95  */
- 96 Metadata.prototype.constructor = function(parent, name, value) {
- 97    if (parent && name && value) {
- 98       this.parent = parent;
- 99       this.name = name;
-100       this.setValue(value);
-101    }
-102    return this;
-103 }
-104 
-105 /**
-106  * Set the value of a metadata object. If the value equals null
-107  * the metadata object will be removed.
-108  * @param {Object} value The desired metadata value.
-109  */
-110 Metadata.prototype.setValue = function(value) {
-111    [this.value, this.type] = Metadata.normalize(value);
-112    if (this.value === null) {
-113       this.remove();
-114    }
-115    return;
-116 }
-117 
-118 /**
-119  * Get the value of a metadata object.
-120  * @returns {Object} The value of the metadata object.
-121  */
-122 Metadata.prototype.getValue = function() {
-123    var Constructor = global[this.type];
-124    switch (Constructor) {
-125       case null:
-126       case undefined:
-127       return null;
-128 
-129       case Boolean:
-130       return eval(this.value).valueOf();
-131 
-132       case Date:
-133       return new Date(Number(this.value));
-134 
-135       case Number:
-136       case String:
-137       return (new Constructor(this.value)).valueOf();
-138 
-139       default:
-140       return eval(this.value);
-141    }
-142 }
-143 
-144 /**
-145  * Get a textual representation of the metadata object.
-146  * @returns {String} A textual representation of the metadata object. 
-147  */
-148 Metadata.prototype.toString = function() {
-149    return "Metadata of " + this.parent + " (" + this.name + " = " + this.value + ")";
-150 }
-151 
-152 /**
-153  * Handle macros which are not defined elsewhere.
-154  * @param {String} name The name of the macro.
-155  * @returns {Object} The resulting value.
-156  */
-157 // FIXME: Is this obsolete?
-158 Metadata.prototype.onUnhandledMacro = function(name) {
-159    return this.get(name);
-160 }
-161 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Poll_Poll.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Poll_Poll.js.html deleted file mode 100644 index d0033ec1..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Poll_Poll.js.html +++ /dev/null @@ -1,333 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Poll prototype
- 28  */
- 29 
- 30 markgettext("Poll");
- 31 markgettext("poll");
- 32 
- 33 /**
- 34  * @function
- 35  * @param {String} ctor
- 36  * @returns {String[]}
- 37  * @see defineConstants
- 38  */
- 39 Poll.getStatus = defineConstants(Poll, markgettext("closed"), markgettext("open"));
- 40 
- 41 /**
- 42  * @param {String} question
- 43  */
- 44 Poll.add = function(data, site) {
- 45    HopObject.confirmConstructor(Poll);
- 46    var poll = new Poll;
- 47    poll.creator = session.user;
- 48    poll.created = new Date;
- 49    poll.update(data);
- 50    site.polls.add(poll);
- 51    return poll;
- 52 }
- 53 
- 54 /**
- 55  * 
- 56  */
- 57 Poll.remove = function() {
- 58    if (this.constructor === Poll) {
- 59       HopObject.remove.call(this);
- 60       this.remove();
- 61    }
- 62    return;
- 63 }
- 64 
- 65 /**
- 66  * @name Poll
- 67  * @constructor
- 68  * @param {String} question
- 69  * @property {Choice[]} _children
- 70  * @property {String} closed
- 71  * @property {Date} created
- 72  * @property {User} creator
- 73  * @property {Date} modified
- 74  * @property {User} modifier
- 75  * @property {String} question
- 76  * @property {Site} site
- 77  * @property {String} status
- 78  * @property {Vote[]} votes
- 79  * @extends HopObject
- 80  */
- 81 Poll.prototype.constructor = function() {
- 82    HopObject.confirmConstructor(this);
- 83    return this;
- 84 }
- 85 
- 86 /**
- 87  * 
- 88  * @param {String} action
- 89  * @returns {Boolean}
- 90  */
- 91 Poll.prototype.getPermission = function(action) {
- 92    if (!this.site.getPermission("main")) {
- 93       return false;
- 94    }
- 95    switch (action) {
- 96       case ".":
- 97       case "main":
- 98       return !!session.user;
- 99       case "result":
-100       return true;
-101       case "edit":
-102       return Membership.require(Membership.OWNER) ||
-103             User.require(User.PRIVILEGED);
-104       case "rotate":
-105       case "delete":
-106       return this.creator === session.user || 
-107             Membership.require(Membership.MANAGER) ||
-108             User.require(User.PRIVILEGED);            
-109    }
-110    return false;
-111 }
-112 
-113 /**
-114  * 
-115  * @param {String} name
-116  * @returns {Object}
-117  */
-118 Poll.prototype.getFormOptions = function(name) {
-119    switch (name) {
-120       case "status":
-121       return Poll.getStatus();
-122    }
-123    return;
-124 }
-125 
-126 Poll.prototype.main_action = function() {
-127    if (this.status !== Poll.OPEN) {
-128       res.redirect(this.href("result"));
-129       return;
-130    }
-131    if (req.postParams.vote) {
-132       try {
-133          this.vote(req.postParams);
-134          res.message = gettext("Thanks, your vote was registered. You can change your mind until the poll is closed.");
-135          res.redirect(this.href("result"));
-136       } catch (ex) {
-137          res.message = ex;
-138          app.log(ex);
-139       }
-140    }
-141    res.data.action = this.href();
-142    res.data.title = gettext("Poll: {0}", this.question);
-143    res.data.body = this.renderSkinAsString("$Poll#main", {header: true});
-144    this.site.renderSkin("Site#page");
-145    return;
-146 }
-147 
-148 /**
-149  * 
-150  * @param {Object} data
-151  */
-152 Poll.prototype.vote = function(data) {
-153 	if (!data.choice) {
-154 	   throw Error(gettext("You did not vote, yet. You can vote until the poll is closed."));
-155 	}
-156 	var choice = this.get(data.choice);
-157 	var vote = session.user && this.votes.get(session.user.name);
-158 	if (vote) {
-159 		vote.choice = choice;
-160 		vote.modified = new Date;
-161 	} else {
-162 	   vote = Vote.add(choice, this);
-163 	}
-164 	return vote;
-165 }
-166 
-167 Poll.prototype.edit_action = function() {
-168    if (req.postParams.save) {
-169       try {
-170          this.update(req.postParams);
-171          res.message = gettext("The poll was updated successfully.");
-172          res.redirect(this.href());
-173       } catch (ex) {
-174          res.message = ex;
-175          app.log(ex);
-176       }
-177    }
-178    res.data.action = this.href(req.action);
-179    res.data.title = gettext("Edit Poll: {0}", this.question);
-180    res.data.body = this.renderSkinAsString("$Poll#edit");
-181    this.site.renderSkin("Site#page");
-182    return;
-183 }
-184 
-185 /**
-186  * 
-187  * @param {Object} data
-188  */
-189 Poll.prototype.update = function(data) {
-190    var choices = [];
-191    for each (var title in data.title_array) {
-192       if (title = title.trim()) {
-193          choices.push(title);
-194       }
-195    }
-196    if (choices.length < 2 || !data.question) {
-197       throw Error(gettext("Please fill out the whole form to create a valid poll."));
-198    }
-199    var size = this.size();
-200    // Update or remove choices
-201    for (var i=size-1; i>-1; i-=1) {
-202       var choice = this.get(i);
-203       var title = choices[i];
-204       if (title) {
-205          choice.title = title;
-206          choice.touch();
-207       } else {
-208          Choice.remove.call(choice);
-209       }
-210    }
-211    // Add new choices
-212    for (var i=size; i<choices.length; i+=1) {
-213       Choice.add(choices[i], this);
-214    }
-215    if (data.save !== Poll.CLOSED) {
-216       delete this.closed;
-217    } else if (this.status === Poll.OPEN) {
-218       this.closed = new Date;
-219    }
-220    this.status = data.save;
-221    this.question = data.question;
-222    this.touch();
-223    return;
-224 }
-225 
-226 Poll.prototype.result_action = function() {
-227    res.data.title = gettext('Poll Results: {0}', this.question);
-228    res.data.body = this.renderSkinAsString("$Poll#results", {header: true});
-229    this.site.renderSkin("Site#page");
-230    return;
-231 }
-232 
-233 Poll.prototype.rotate_action = function() {
-234    if (this.status === Poll.CLOSED) {
-235       this.status = Poll.OPEN;
-236    } else if (this.status === Poll.OPEN) {
-237       this.status = Poll.CLOSED;
-238       this.closed = new Date;
-239    }
-240    this.touch();
-241    return res.redirect(this.href());
-242 }
-243 
-244 /**
-245  * @returns {String}
-246  */
-247 Poll.prototype.getConfirmText = function() {
-248    return gettext("You are about to delete a poll by user {0}.", 
-249          this.creator.name);
-250 }
-251 
-252 /**
-253  * 
-254  * @param {Object} param
-255  * @param {String} action
-256  * @param {String} text
-257  * @see HopObject#link_macro
-258  */
-259 Poll.prototype.link_macro = function(param, action, text) {
-260    switch (action) {
-261       case ".":
-262       case "main":
-263       if (this.status === Poll.CLOSED) {
-264          return;
-265       }
-266       break;
-267       case "rotate":
-268       if (this.status === Poll.OPEN) {
-269          text = gettext("Stop");
-270       } else {
-271          text = this.closed ? gettext("Re-run") : gettext("Run");  
-272       }
-273       break;
-274   }
-275    return HopObject.prototype.link_macro.call(this, param, action, text);
-276 }
-277 
-278 /**
-279  * 
-280  * @param {Object} param
-281  * @param {String} name
-282  * @see HopObject#link_macro
-283  */
-284 Poll.prototype.input_macro = function(param, name) {
-285    switch (name) {
-286       case "choices":
-287       var index = 0;
-288       var add = function(choice) {
-289          index += 1;
-290          return choice.renderSkin("$Choice#edit", {index: index});
-291       };
-292       var choices;
-293       if (choices = req.postParams.title_array) {
-294          HopObject.confirmConstructor(Choice);
-295          choices.forEach(function(title) {
-296             return add(new Choice(title));
-297          });
-298       } else {
-299          this.forEach(function() {
-300             return add(this);
-301          });
-302       }
-303       return;
-304    }
-305    return HopObject.prototype.input_macro.apply(this, arguments);
-306 }
-307 
-308 /**
-309  * 
-310  */
-311 Poll.prototype.votes_macro = function() {
-312    return this.votes.size();
-313 }
-314 
-315 /**
-316  * 
-317  * @param {Object} param
-318  * @param {String} format
-319  */
-320 Poll.prototype.closed_macro = function(param, format) {
-321    if (this.status === Poll.CLOSED) {
-322       res.write(formatDate(this.closed, param.format || format));
-323    }
-324    return;
-325 }
-326 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Polls_Polls.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Polls_Polls.js.html deleted file mode 100644 index 7e694d6c..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Polls_Polls.js.html +++ /dev/null @@ -1,124 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Polls prototype
- 28  */
- 29 
- 30 markgettext("Polls");
- 31 markgettext("polls");
- 32 
- 33 /**
- 34  * @name Polls
- 35  * @constructor
- 36  * @property {Poll[]} _children
- 37  * @property {Poll[]} open
- 38  * @extends HopObject
- 39  */
- 40 
- 41 /**
- 42  * 
- 43  * @param {String} action
- 44  * @returns {Boolean}
- 45  */
- 46 Polls.prototype.getPermission = function(action) {
- 47    if (!this._parent.getPermission("main")) {
- 48       return false;
- 49    }
- 50    switch (action) {
- 51       case ".":
- 52       case "main":
- 53       case "create":
- 54       case "running":
- 55       return Site.require(Site.OPEN) && session.user ||
- 56             Membership.require(Membership.CONTRIBUTOR) ||
- 57             User.require(User.PRIVILEGED);
- 58       case "all":
- 59       return Membership.require(Membership.MANAGER) ||
- 60             User.require(User.PRIVILEGED);
- 61    }
- 62    return false;
- 63 }
- 64 
- 65 Polls.prototype.main_action = function() {
- 66    var polls = User.getMembership().polls;
- 67    res.data.list = renderList(polls, "$Poll#listItem", 10, req.queryParams.page);
- 68    res.data.pager = renderPager(polls, this.href(req.action), 
- 69          10, req.queryParams.page);
- 70    res.data.title = gettext("Member Polls");
- 71    res.data.body = this.renderSkinAsString("$Polls#main");
- 72    this._parent.renderSkin("Site#page");
- 73    return;
- 74 }
- 75 
- 76 Polls.prototype.create_action = function() {
- 77    if (req.postParams.save) {
- 78       try {
- 79          var poll = Poll.add(req.postParams, this._parent);
- 80          poll.notify(req.action);
- 81          res.message = gettext("The poll was created successfully.");
- 82          res.redirect(poll.href());
- 83       } catch (err) {
- 84          res.message = err.toString();
- 85       }
- 86    } else {
- 87       req.postParams.title_array = [null, null];
- 88    }
- 89    res.data.action = this.href(req.action);
- 90    res.data.title = gettext("Add Poll");
- 91    HopObject.confirmConstructor(Poll);
- 92    res.data.body = (new Poll).renderSkinAsString("$Poll#edit");
- 93    this._parent.renderSkin("Site#page");
- 94    return;
- 95 }
- 96 
- 97 Polls.prototype.running_action = function() {
- 98    res.data.list = renderList(this.running, 
- 99          "$Poll#listItem", 10, req.queryParams.page);
-100    res.data.pager = renderPager(this.running, 
-101          this.href(req.action), 10, req.queryParams.page);
-102    res.data.title = gettext("Running Polls");
-103    res.data.body = this.renderSkinAsString("$Polls#main");
-104    this._parent.renderSkin("Site#page");
-105    return;
-106 }
-107 
-108 Polls.prototype.all_action = function() {
-109    res.data.list = renderList(this, "$Poll#listItem", 10, req.queryParams.page);
-110    res.data.pager = renderPager(this, 
-111          this.href(), 10, req.queryParams.page);
-112    res.data.title = gettext("All Polls");
-113    res.data.body = this.renderSkinAsString("$Polls#main");
-114    this._parent.renderSkin("Site#page");
-115    return;
-116 }
-117 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Root_Root.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Root_Root.js.html deleted file mode 100644 index c1a1cf7f..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Root_Root.js.html +++ /dev/null @@ -1,425 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Root prototype.
- 28  */
- 29 
- 30 /** @constant */
- 31 Root.VERSION = (function(versionString, buildDate) {
- 32    // A valid version string is e.g. "1.2.3alpha.4711".
- 33    // Repositories could add something like "-compatible" to it,
- 34    // FIXME: This should be refactored for modular extension.
- 35    var re = /^(\d+)\.(\d+)(?:\.(\d+))?(.+)?\.(\d+)(?:-(.*))?$/;
- 36    var parts = re.exec(versionString);
- 37    if (parts) {
- 38       var result = {
- 39          parts: parts,
- 40          toString: function() {return parts[0]},
- 41          major: parseInt(parts[1]),
- 42          revision: parseInt(parts[5]),
- 43          date: new Date(buildDate)
- 44       };
- 45       result.minor = result.major + parseInt(parts[2] || 0) / 10;
- 46       result.bugfix = result.minor + "." + (parts[3] || 0);
- 47       result.development = parts[4] || "";
- 48       result["default"] = result[parts[3] ? "bugfix" : "minor"] + result.development +
- 49             (parts[6] ? "-" + parts[6] : String.EMPTY);
- 50       return result;
- 51    }
- 52    return versionString;
- 53 })("@version@.@revision@", "@buildDate@");
- 54 
- 55 this.handleMetadata("creationDelay");
- 56 this.handleMetadata("creationScope");
- 57 this.handleMetadata("notificationScope");
- 58 this.handleMetadata("phaseOutGracePeriod");
- 59 this.handleMetadata("phaseOutNotificationPeriod");
- 60 this.handleMetadata("phaseOutMode");
- 61 this.handleMetadata("probationPeriod");
- 62 this.handleMetadata("quota");
- 63 this.handleMetadata("replyTo");
- 64 
- 65 /**
- 66  * Antville’s Root prototype is an extent of the Site prototype.
- 67  * The singleton instance root is the first created site (“www”).
- 68  * @name Root
- 69  * @constructor
- 70  * @extends Site
- 71  * @property {Site[]} _children 
- 72  * @property {Admin} admin
- 73  * @property {User[]} admins
- 74  * @property {Api} api
- 75  * @property {String} creationDelay
- 76  * @property {String} creationScope
- 77  * @property {String} notificationScope
- 78  * @property {String} phaseOutGracePeriod
- 79  * @property {String} phaseOutMode
- 80  * @property {String} phaseOutNotificationPeriod
- 81  * @property {String} probationPeriod
- 82  * @property {String} quote
- 83  * @property {String} replyTo
- 84  * @property {Site[]} sites
- 85  * @property {Site[]} updates
- 86  * @property {User[]} users
- 87  */
- 88 
- 89 /**
- 90  * The permission framework handler for the Root prototype.
- 91  * @param {String} action
- 92  * @returns {Boolean}
- 93  */
- 94 Root.prototype.getPermission = function(action) {
- 95    if (action.contains("admin")) {
- 96       return User.require(User.PRIVILEGED);
- 97    }
- 98    switch (action) {
- 99       case "debug":
-100       case "default.hook":
-101       case "health":
-102       case "jala.test":
-103       case "jala.test.css":
-104       case "mrtg":
-105       case "sites":
-106       case "updates.xml":
-107       return true;
-108       case "create":
-109       return this.getCreationPermission();
-110    }
-111    return Site.prototype.getPermission.apply(this, arguments);
-112 }
-113 
-114 Root.prototype.main_action = function() {
-115    if (this.users.size() < 1) {
-116       this.title = "Antville";
-117       this.created = new Date;
-118       this.replyTo = "root@localhost";
-119       this.locale = java.util.Locale.getDefault().getLanguage();
-120       this.timeZone = java.util.TimeZone.getDefault().getID();
-121       this.layout.reset();
-122       res.redirect(this.members.href("register"));
-123    } else if (session.user && this.members.owners.size() < 1) {
-124       this.creator = this.modifier = this.layout.creator = 
-125             this.layout.modifier = session.user;
-126       this.created = this.modified = this.layout.created = 
-127             this.layout.modified = new Date;
-128       session.user.role = User.PRIVILEGED;
-129       res.handlers.membership.role = Membership.OWNER;
-130    }
-131    return Site.prototype.main_action.apply(this);
-132 }
-133 
-134 Root.prototype.error_action = function() {
-135    res.message = String.EMPTY;
-136    var param = res.error ? res : session.data;
-137    res.status = param.status || 500;
-138    res.data.title = gettext("{0} {1} Error", root.getTitle(), param.status);
-139    res.data.body = root.renderSkinAsString("$Root#error", param);
-140    res.handlers.site.renderSkin("Site#page");
-141    return;
-142 }
-143 
-144 Root.prototype.notfound_action = function() {
-145    res.status = 404;
-146    res.data.title = gettext("{0} {1} Error", root.getTitle(), res.status);
-147    res.data.body = root.renderSkinAsString("$Root#notfound", req);
-148    res.handlers.site.renderSkin("Site#page");
-149    return;
-150 }
-151 
-152 Root.prototype.create_action = function() {
-153    if (req.postParams.create) {
-154       try {
-155          var site = Site.add(req.postParams);
-156          Membership.add(session.user, Membership.OWNER, site);
-157          root.admin.log(root, "Added site " + site.name);
-158          res.message = gettext("Successfully created your site.");
-159          res.redirect(site.href());
-160       } catch (ex) {
-161          res.message = ex;
-162          app.log(ex);
-163       }
-164    }
-165 
-166    // Cannot use res.handlers.site because somehow it is always root 
-167    res.handlers.newSite = new Site;
-168    res.handlers.example = new Site;
-169    res.handlers.example.name = "foo";
-170    res.data.action = this.href(req.action);
-171    res.data.title = gettext("Add Site");
-172    res.data.body = root.renderSkinAsString("$Root#create");
-173    root.renderSkin("Site#page");
-174    return;
-175 }
-176 
-177 Root.prototype.sites_action = function() {
-178    var now = new Date;
-179    if (!this.cache.sites || (now - this.cache.sites.modified > Date.ONEHOUR)) {
-180       var sites = this.sites.list();
-181       sites.sort(new String.Sorter("title"));
-182       this.cache.sites = {list: sites, modified: now};
-183    }
-184    res.data.list = renderList(this.cache.sites.list, 
-185          "$Site#listItem", 25, req.queryParams.page);
-186    res.data.pager = renderPager(this.cache.sites.list, 
-187          this.href(req.action), 25, req.queryParams.page);
-188    res.data.title = gettext("Public Sites");
-189    res.data.body = this.renderSkinAsString("$Root#sites");
-190    root.renderSkin("Site#page");
-191    return;
-192 }
-193 
-194 Root.prototype.updates_xml_action = function() {
-195    res.contentType = "text/xml"; 
-196    var now = new Date;
-197    var feed = new rome.SyndFeedImpl();   
-198    feed.setFeedType("rss_2.0");
-199    feed.setLink(root.href());
-200    feed.setTitle("Recently updated sites at " + root.title);
-201    feed.setDescription(root.tagline || String.EMPTY);
-202    feed.setLanguage(root.locale.replace("_", "-"));
-203    feed.setPublishedDate(now);
-204    var entries = new java.util.ArrayList();
-205    var entry, description;
-206    var sites = root.updates.list(0, 25).sort(Number.Sorter("modified", 
-207          Number.Sorter.DESC));
-208    for each (var site in sites) {
-209       entry = new rome.SyndEntryImpl();
-210       entry.setTitle(site.title);
-211       entry.setLink(site.href());
-212       entry.setAuthor(site.creator.name);
-213       entry.setPublishedDate(site.modified);
-214       description = new rome.SyndContentImpl();
-215       description.setType("text/plain");
-216       description.setValue(site.tagline);
-217       entry.setDescription(description);
-218       entries.add(entry);
-219    }
-220    feed.setEntries(entries);
-221    var output = new rome.SyndFeedOutput();
-222    //output.output(feed, res.servletResponse.writer); return;
-223    var xml = output.outputString(feed);
-224    res.write(xml); //injectXslDeclaration(xml));
-225    return;
-226 }
-227 
-228 // Sitemap for Google Webmaster Tools
-229 // (Unfortunately, utterly useless.)
-230 Root.prototype.sitemap_xml_action = function() {
-231    res.contentType = "text/xml";
-232    res.writeln('<?xml version="1.0" encoding="UTF-8"?>');
-233    res.writeln('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
-234    this.sites.forEach(function() {
-235       res.writeln('<url>');
-236       res.writeln('<loc>' + this.href() + '</loc>');
-237       if (this.modified) {
-238          res.writeln('<lastmod>' + this.modified.format("yyyy-MM-dd") + '</lastmod>');
-239       }
-240       res.writeln('</url>');
-241    });
-242    res.writeln('</urlset>');
-243    return;
-244 }
-245 
-246 Root.prototype.health_action = function() {
-247    var jvm = java.lang.Runtime.getRuntime();
-248    var totalMemory = jvm.totalMemory() / 1024 / 1024;
-249    var freeMemory = jvm.freeMemory()  / 1024 / 1024;
-250 
-251    var param = {
-252       uptime: formatNumber((new Date - app.upSince.getTime()) / 
-253             Date.ONEDAY, "0.##"),
-254       freeMemory: formatNumber(freeMemory),
-255       totalMemory: formatNumber(totalMemory),
-256       usedMemory: formatNumber(totalMemory - freeMemory),
-257       sessions: formatNumber(app.countSessions()),
-258       cacheSize: formatNumber(getProperty("cacheSize"))
-259    };
-260 
-261    for each (key in ["activeThreads", "freeThreads", "requestCount", 
-262          "errorCount", "xmlrpcCount", "cacheusage"]) {
-263       param[key] = formatNumber(app[key]);
-264    }
-265    
-266    param.errorRatio = formatNumber(100 * app.errorCount / app.requestCount);
-267    param.errorRatioPerUnit = formatNumber(Admin.health.errorsPerUnit / Admin.health.requestsPerUnit);
-268 
-269    if (Admin.health) {
-270       param.requestsPerUnit = formatNumber(Admin.health.requestsPerUnit);
-271       param.errorsPerUnit = formatNumber(Admin.health.errorsPerUnit);
-272    }
-273    
-274    param.entries = app.data.entries.length;
-275    param.mails = app.data.mails.length;
-276    param.requests = 0;
-277    for (var i in app.data.requests) {
-278       param.requests += 1;
-279    }
-280    param.callbacks = app.data.callbacks.length;
-281 
-282    res.data.title = gettext("{0} Health", root.getTitle());
-283    res.data.body = this.renderSkinAsString("$Root#health", param);
-284    this.renderSkin("Site#page");
-285 }
-286 
-287 Root.prototype.mrtg_action = function() {
-288    res.contentType = "text/plain";
-289    var target = req.queryParams.target; 
-290    if (!target) {
-291       return;
-292    }
-293    switch (target) {
-294       case "cache":
-295       res.writeln(0);
-296       res.writeln(app.cacheusage * 100 / getProperty("cacheSize", 100));
-297       break;
-298       case "threads":
-299       res.writeln(0);
-300       res.writeln(app.activeThreads * 100 / app.freeThreads);
-301       break;
-302       case "requests":
-303       res.writeln(app.errorCount);
-304       res.writeln(app.requestCount);
-305       break;
-306       case "users":
-307       res.writeln(app.countSessions());
-308       res.writeln(root.users.size());
-309       break;
-310       case "postings":
-311       res.writeln(0);
-312       var sql = new Sql;
-313       sql.retrieve(Sql.COUNT, "content");
-314       sql.traverse(function() {
-315          res.writeln(this.count);
-316       });
-317       break;
-318       case "uploads":
-319       var sql = new Sql;
-320       sql.retrieve(Sql.COUNT, "file");
-321       sql.traverse(function() {
-322          res.writeln(this.count);
-323       });
-324       sql.retrieve(Sql.COUNT, "image");
-325       sql.traverse(function() {
-326          res.writeln(this.count);
-327       });
-328       break;
-329    }
-330    res.writeln(app.upSince);
-331    res.writeln("mrtg." + target + " of Antville version " + Root.VERSION);
-332    return;
-333 } 
-334 
-335 /**
-336  * Catch some undefined macro handlers, then delegate to the super prototype.
-337  * @param {String} name
-338  * @returns {HopObject}
-339  * @see Site#getMacroHandler
-340  */
-341 Root.prototype.getMacroHandler = function(name) {
-342    switch (name) {
-343       case "admin":
-344       case "api":
-345       case "sites":
-346       return this[name];
-347    }
-348    return Site.prototype.getMacroHandler.apply(this, arguments);
-349 }
-350 
-351 /**
-352  * 
-353  * @param {String} name
-354  * @returns {Object}
-355  * @see Site#getFormOptions
-356  */
-357 Root.prototype.getFormOptions = function(name) {
-358    switch (name) {
-359       case "creationScope":
-360       return Admin.getCreationScopes();
-361       case "notificationScope":
-362       return Admin.getNotificationScopes();
-363       case "phaseOutMode":
-364       return Admin.getPhaseOutModes();
-365    }
-366    return Site.prototype.getFormOptions.apply(root, arguments);
-367 }
-368 
-369 /**
-370  * @returns {Boolean}
-371  */
-372 Root.prototype.getCreationPermission = function() {
-373    var user;
-374    if (!(user = session.user)) {
-375       return false;
-376    } if (User.require(User.PRIVILEGED)) {
-377       return true;
-378    }
-379    
-380    switch (root.creationScope) {
-381       case User.PRIVILEGED:
-382       return false;
-383       case User.TRUSTED:
-384       return User.require(User.TRUSTED);
-385       default:
-386       case User.REGULAR:
-387       var now = new Date, delta;
-388       if (root.probationPeriod) {
-389          delta = root.probationPeriod - Math.floor((now - 
-390                user.created) / Date.ONEDAY);
-391          if (delta > 0) {
-392             session.data.error = gettext("You need to wait {0} before you are allowed to create a new site.", 
-393                   ngettext("{0} day", "{0} days", delta));
-394             return false;
-395          }
-396       } 
-397       if (root.creationDelay && user.sites.count() > 0) {
-398          delta = root.creationDelay - Math.floor((now - 
-399                user.sites.get(0).created) / Date.ONEDAY);
-400          if (delta > 0) {
-401             session.data.error = gettext("You need to wait {0} before you are allowed to create a new site.", 
-402                   ngettext("{0} day", "{0} days", delta));
-403             return false;
-404          }
-405       }
-406    }
-407    return true;
-408 }
-409 
-410 /**
-411  * 
-412  * @param {Object} param
-413  * @param {String} name
-414  */
-415 Root.prototype.static_macro = function(param, name) {
-416    return this.getStaticUrl(name);
-417 }
-418 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Site_Site.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Site_Site.js.html deleted file mode 100644 index 141de643..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Site_Site.js.html +++ /dev/null @@ -1,1046 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Site prototype.
- 28  */
- 29 
- 30 markgettext("Site");
- 31 markgettext("site");
- 32 
- 33 this.handleMetadata("archiveMode");
- 34 this.handleMetadata("callbackMode");
- 35 this.handleMetadata("callbackUrl");
- 36 this.handleMetadata("closed");
- 37 this.handleMetadata("commentMode");
- 38 this.handleMetadata("configured");
- 39 this.handleMetadata("deleted");
- 40 this.handleMetadata("export_id");
- 41 this.handleMetadata("import_id");
- 42 this.handleMetadata("job");
- 43 this.handleMetadata("locale");
- 44 this.handleMetadata("notificationMode");
- 45 this.handleMetadata("notified");
- 46 this.handleMetadata("pageSize");
- 47 this.handleMetadata("pageMode");
- 48 this.handleMetadata("spamfilter");
- 49 this.handleMetadata("tagline");
- 50 this.handleMetadata("timeZone");
- 51 this.handleMetadata("title");
- 52 
- 53 /**
- 54  * @function
- 55  * @returns {String[]}
- 56  * @see defineConstants
- 57  */
- 58 Site.getStatus = defineConstants(Site, markgettext("Blocked"), 
- 59       markgettext("Regular"), markgettext("Trusted"));
- 60 /**
- 61  * @function
- 62  * @returns {String[]}
- 63  * @see defineConstants
- 64  */
- 65 Site.getModes = defineConstants(Site, markgettext("Deleted"), 
- 66       markgettext("Closed"), markgettext("Restricted"), 
- 67       markgettext("Public"), markgettext("Open"));
- 68 /**
- 69  * @function
- 70  * @returns {String[]}
- 71  * @see defineConstants
- 72  */
- 73 Site.getPageModes = defineConstants(Site, markgettext("days") /* , 
- 74       markgettext("stories") */ );
- 75 /**
- 76  * @function
- 77  * @returns {String[]}
- 78  * @see defineConstants
- 79  */
- 80 Site.getCommentModes = defineConstants(Site, markgettext("disabled"), 
- 81       markgettext("enabled"));
- 82 /**
- 83  * @function
- 84  * @returns {String[]}
- 85  * @see defineConstants
- 86  */
- 87 Site.getArchiveModes = defineConstants(Site, markgettext("closed"), 
- 88       markgettext("public"));
- 89 /**
- 90  * @function
- 91  * @returns {String[]}
- 92  * @see defineConstants
- 93  */
- 94 Site.getNotificationModes = defineConstants(Site, markgettext("Nobody"), 
- 95       markgettext("Owner"), markgettext("Manager"), markgettext("Contributor"), 
- 96       markgettext("Subscriber"));
- 97 /**
- 98  * @function
- 99  * @returns {String[]}
-100  * @see defineConstants
-101  */
-102 Site.getCallbackModes = defineConstants(Site, markgettext("disabled"), 
-103       markgettext("enabled"));
-104 
-105 /**
-106  * @param {String} name A unique identifier also used in the URL of a site
-107  * @param {String} title An arbitrary string branding a site
-108  * @param {User} user
-109  */
-110 Site.add = function(data, user) {
-111    HopObject.confirmConstructor(Site);
-112 
-113    var now = new Date;
-114    var user = user || session.user || {};
-115    var site = new Site;
-116 
-117    if (!data.name) {
-118       throw Error(gettext("Please enter a name for your new site."));
-119    }
-120 
-121    if (data.name.length > 30) {
-122       throw Error(gettext("The chosen name is too long. Please enter a shorter one."));
-123    }
-124    
-125    var name = stripTags(decodeURIComponent(data.name));
-126    if (name !== data.name || /[^\u00a0-\uffff\w\-]/.test(data.name)) {
-127       // We check if name can be used in vhost environment by allowing all Unicode characters
-128       // but only ASCII letters A—z, digits 0—9, the underscore “_” and the hyphen “-”.
-129       throw Error(gettext("Please avoid special characters or HTML code in the name field."));
-130    } else if (name !== root.getAccessName(name)) {
-131       throw Error(gettext("There already is a site with this name."));
-132    }
-133 
-134    site.name = java.net.IDN.toASCII.constructor === Function ?
-135          java.net.IDN.toASCII(name, java.net.IDN.ALLOW_UNASSIGNED) : name;
-136    site.title = data.title || name;
-137 
-138    site.map({
-139       created: now,
-140       creator: user,
-141       modified: now,
-142       modifier: user,
-143       status: user.status === User.PRIVILEGED ? Site.TRUSTED : user.status,
-144       mode: Site.CLOSED,
-145       commentMode: Site.DISABLED,
-146       archiveMode: Site.CLOSED
-147    });
-148 
-149    site.update(data);
-150    Layout.add(site);
-151    root.add(site);
-152    return site;
-153 }
-154 
-155 /**
-156  * 
-157  * @param {Site} site
-158  */
-159 Site.remove = function() {
-160    if (this.constructor === Site || this === root) {
-161       HopObject.remove.call(this.stories);
-162       HopObject.remove.call(this.images);
-163       HopObject.remove.call(this.files);
-164       HopObject.remove.call(this.polls);
-165       HopObject.remove.call(this.entries);
-166       HopObject.remove.call(this.members, {force: true});
-167       // The root site needs some special treatment (it will not be removed)
-168       if (this === root) {
-169          Membership.add(root.users.get(0), Membership.OWNER, this);
-170          Layout.remove.call(this.layout);
-171          this.layout.reset();
-172          this.getStaticFile("images").removeDirectory();
-173          this.getStaticFile("files").removeDirectory();
-174       } else {
-175          Layout.remove.call(this.layout, {force: true});
-176          this.getStaticFile().removeDirectory();
-177          this.deleteMetadata();
-178          this.remove();
-179       }
-180    }
-181    return;
-182 }
-183 
-184 /**
-185  * 
-186  * @param {String} name
-187  * @returns {Site}
-188  */
-189 Site.getByName = function(name) {
-190    return root.get(name);
-191 }
-192 
-193 /**
-194  * 
-195  * @param {String} mode
-196  * @returns {Boolean}
-197  */
-198 Site.require = function(mode) {
-199    var modes = [Site.CLOSED, Site.RESTRICTED, Site.PUBLIC, Site.OPEN];
-200    return modes.indexOf(res.handlers.site.mode) >= modes.indexOf(mode);
-201 }
-202 
-203 /**
-204  * A Site object is the basic container of Antville.
-205  * @name Site
-206  * @constructor
-207  * @property {Tag[]} $tags
-208  * @property {Archive} archive
-209  * @property {String} archiveMode The way the archive of a site is displayed
-210  * @property {String} commentMode The way comments of a site are displayed
-211  * @property {Date} created The date and time of site creation
-212  * @property {User} creator A reference to a user who created a site
-213  * @property {Date} deleted 
-214  * @property {String} export_id
-215  * @property {Files} files
-216  * @property {Tags} galleries
-217  * @property {Images} images
-218  * @property {String} import_id
-219  * @property {String} job
-220  * @property {Layout} layout
-221  * @property {String} locale The place and language settings of a site
-222  * @property {Members} members
-223  * @property {Metadata} metadata
-224  * @property {String} mode The access level of a site
-225  * @property {Date} modified The date and time when a site was last modified
-226  * @property {User} modifier A reference to a user who modified a site
-227  * @property {String} notificationMode The way notifications are sent from a site
-228  * @property {Date} notified The date and time of the last notification sent to 
-229  * the owners of a site
-230  * @property {String} pageMode The way stories of a site are displayed
-231  * @property {Number} pageSize The amount of stories to be displayed simultaneously
-232  * @property {Polls} polls
-233  * @property {String} status The trust level of a site
-234  * @property {Stories} stories
-235  * @property {String} tagline An arbitrary text describing a site
-236  * @property {Tags} tags
-237  * @property {String} timeZone The time and date settings of a site
-238  * @extends HopObject
-239  */
-240 Site.prototype.constructor = function() {
-241    HopObject.confirmConstructor(this);
-242    return this;
-243 }
-244 
-245 /**
-246  * 
-247  * @param {String} action
-248  * @returns {Boolean}
-249  */
-250 Site.prototype.getPermission = function(action) {
-251    switch (action) {
-252       case "backup.js":
-253       case "main.js":
-254       case "main.css":
-255       case "error":
-256       case "notfound":
-257       case "robots.txt":
-258       case "search.xml":
-259       case "user.js":
-260       return true;
-261 
-262       case ".":
-263       case "main":
-264       case "comments.xml":
-265       case "rss.xml":
-266       case "rss.xsl":
-267       case "search":
-268       case "stories.xml":
-269       return Site.require(Site.PUBLIC) ||
-270             (Site.require(Site.RESTRICTED) && 
-271             Membership.require(Membership.CONTRIBUTOR)) ||
-272             ((Site.require(Site.DELETED) || Site.require(Site.CLOSED)) &&
-273             Membership.require(Membership.OWNER)) ||
-274             User.require(User.PRIVILEGED);
-275 
-276       case "edit":
-277       case "export":
-278       case "referrers":
-279       return Membership.require(Membership.OWNER) ||
-280             User.require(User.PRIVILEGED);
-281 
-282       case "subscribe":
-283       return Site.require(Site.PUBLIC) &&
-284             User.require(User.REGULAR) &&
-285             !Membership.require(Membership.SUBSCRIBER);
-286 
-287       case "unsubscribe":
-288       if (User.require(User.REGULAR)) {
-289          var membership = Membership.getByName(session.user.name, this);
-290          return membership && !membership.require(Membership.OWNER);
-291       }
-292 
-293       case "import":
-294       return User.require(User.PRIVILEGED);
-295    }
-296 
-297    return Feature.getPermission.apply(this, arguments);
-298 }
-299 
-300 Site.prototype.main_action = function() {
-301    res.data.body = this.renderSkinAsString(this.mode === Site.DELETED ? 
-302          "$Site#deleted" : "Site#main");
-303    res.data.title = this.getTitle();
-304    this.renderSkin("Site#page");
-305    this.log();
-306    return;
-307 }
-308 
-309 Site.prototype.edit_action = function() {
-310    if (req.postParams.save) {
-311       try {
-312          this.update(req.postParams);
-313          res.message = gettext("The changes were saved successfully.");
-314          res.redirect(this.href(req.action));
-315       } catch (ex) {
-316          res.message = ex;
-317          app.log(ex);
-318       }
-319    }
-320 
-321    res.data.action = this.href(req.action);
-322    res.data.title = gettext("Site Preferences");
-323    res.data.body = this.renderSkinAsString("$Site#edit");
-324    this.renderSkin("Site#page");
-325    return;
-326 }
-327 
-328 /**
-329  * 
-330  * @param {String} name
-331  * @returns {Object}
-332  */
-333 Site.prototype.getFormOptions = function(name) {
-334    switch (name) {
-335       case "archiveMode":
-336       return Site.getArchiveModes();
-337       case "commentMode":
-338       return Site.getCommentModes();
-339       case "locale":
-340       return getLocales(this.getLocale());
-341       case "layout":
-342       return this.getLayouts();
-343       case "mode":
-344       return Site.getModes();
-345       case "notificationMode":
-346       return Site.getNotificationModes(); 
-347       case "pageMode":
-348       return Site.getPageModes();
-349       case "status":
-350       return Site.getStatus();
-351       case "timeZone":
-352       return getTimeZones(this.getLocale());
-353       case "callbackMode":
-354       return Site.getCallbackModes();
-355       default:
-356       return HopObject.prototype.getFormOptions.apply(this, arguments);
-357    }
-358 }
-359 
-360 /**
-361  * 
-362  * @param {Object} data
-363  */
-364 Site.prototype.update = function(data) {
-365    if (this.mode !== Site.DELETED && data.mode === Site.DELETED) {
-366       this.deleted = new Date;
-367    } else if (this.job && this.mode === Site.DELETED && data.mode !== Site.DELETED) {
-368       var job = new Admin.Job(this.job);
-369       job.remove();
-370       this.job = null;
-371    }
-372 
-373    this.map({
-374       title: stripTags(data.title) || this.name,
-375       tagline: data.tagline || '',
-376       mode: data.mode || Site.PRIVATE,
-377       callbackUrl: data.callbackUrl || '',
-378       callbackMode: data.callbackMode || Site.DISABLED,
-379       pageMode: data.pageMode || Site.DAYS,
-380       pageSize: parseInt(data.pageSize, 10) || 3,
-381       commentMode: data.commentMode || Site.DISABLED,
-382       archiveMode: data.archiveMode || Site.CLOSED,
-383       notificationMode: data.notificationMode || Site.NOBODY,
-384       timeZone: data.timeZone || root.getTimeZone().getID(),
-385       locale: data.locale || root.getLocale().toString(),
-386       spamfilter: data.spamfilter || ''
-387    });
-388 
-389    this.configured = new Date;
-390    this.modifier = session.user;
-391    this.clearCache();
-392    return;
-393 }
-394 
-395 Site.prototype.main_css_action = function() {
-396    res.contentType = "text/css";
-397    res.dependsOn(String(Root.VERSION));
-398    res.dependsOn(this.layout.modified);
-399    HopObject.confirmConstructor(Skin);
-400    res.dependsOn((new Skin("Site", "stylesheet")).getStaticFile().lastModified());
-401    res.digest();
-402    res.push();
-403    root.renderSkin("$Root#stylesheet");
-404    this.renderSkin("Site#stylesheet");
-405    var lessCss = res.pop();
-406    try {
-407       lessParser.parse(lessCss, function(error, tree) {
-408          if (error) {
-409             res.writeln('/** ');
-410             res.writeln(error.toSource())
-411             res.writeln('**/');
-412             return;
-413          }
-414          res.writeln(tree.toCSS());
-415       });
-416    } catch (ex) {
-417       res.writeln('/** ');
-418       res.writeln(ex.toSource());
-419       res.writeln('**/');
-420    }
-421    return;
-422 }
-423 
-424 Site.prototype.main_js_action = function() {
-425    res.contentType = "text/javascript";
-426    res.dependsOn(String(Root.VERSION));
-427    res.digest();
-428    this.renderSkin("$Site#include", {href: "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"});
-429    this.renderSkin("$Site#include", {href: root.getStaticUrl("jquery.cookie.js")});
-430    this.renderSkin("$Site#include", {href: root.getStaticUrl("antville.js?v=" + Root.VERSION)});
-431    this.renderSkin("$Site#include", {href: this.href("user.js")});
-432    return;
-433 }
-434 
-435 Site.prototype.user_js_action = function() {
-436    res.contentType = "text/javascript";
-437    HopObject.confirmConstructor(Skin);
-438    res.dependsOn((new Skin("Site", "javascript")).getStaticFile().lastModified());
-439    res.digest();
-440    this.renderSkin("Site#javascript");
-441    return;  
-442 }
-443 
-444 Site.prototype.backup_js_action = function() {
-445    if (req.isPost()) {
-446       var data = session.data.backup = {};
-447       for (var key in req.postParams) {
-448          data[key] = req.postParams[key];
-449       }
-450    } else {
-451       res.contentType = "text/javascript";
-452       res.write((session.data.backup || {}).toSource());
-453       session.data.backup = null;
-454    }
-455    return;
-456 }
-457 
-458 Site.prototype.rss_xml_action = function() {
-459    res.contentType = "text/xml";
-460    res.dependsOn(this.modified);
-461    res.digest();
-462    res.write(this.getXml(this.stories.union));
-463    return;
-464 }
-465 
-466 Site.prototype.stories_xml_action = function() {
-467    res.contentType = "text/xml";
-468    res.dependsOn(this.modified);
-469    res.digest();
-470    res.write(this.getXml(this.stories.recent));
-471    return;
-472 }
-473 
-474 Site.prototype.comments_xml_action = function() {
-475    res.contentType = "text/xml";
-476    res.dependsOn(this.modified);
-477    res.digest();
-478    res.write(this.getXml(this.stories.comments));
-479    return;
-480 }
-481 
-482 Site.prototype.search_xml_action = function() {
-483    res.contentType = "application/opensearchdescription+xml";
-484    this.renderSkin("$Site#opensearchdescription");
-485    return;   
-486 }
-487 
-488 /**
-489  * 
-490  * @param {Story[]} collection
-491  */
-492 Site.prototype.getXml = function(collection) {
-493    collection || (collection = this.stories.recent);
-494    var now = new Date;
-495    var feed = new rome.SyndFeedImpl();   
-496    feed.setFeedType("rss_2.0");
-497    feed.setLink(this.href());
-498    feed.setTitle(this.title);
-499    feed.setDescription(this.tagline || String.EMPTY);
-500    feed.setLanguage(this.locale.replace("_", "-"));
-501    feed.setPublishedDate(now);
-502 
-503    /*
-504    var feedInfo = new rome.FeedInformationImpl();
-505    var feedModules = new java.util.ArrayList();
-506    feedModules.add(feedInfo);
-507    feed.setModules(feedModules);
-508    //feedInfo.setImage(new java.net.URL(this.getProperty("imageUrl")));
-509    feedInfo.setSubtitle(this.tagline);
-510    feedInfo.setSummary(this.description);
-511    feedInfo.setAuthor(this.creator.name);
-512    feedInfo.setOwnerName(this.creator.name);
-513    //feedInfo.setOwnerEmailAddress(this.getProperty("email"));
-514    */
-515 
-516    var entry, entryInfo, entryModules;
-517    var enclosure, enclosures, keywords;
-518    var entries = new java.util.ArrayList();
-519    var description;
-520 
-521    var list = collection.constructor === Array ? 
-522          collection : collection.list(0, 25);
-523    for each (var item in list) {
-524       entry = new rome.SyndEntryImpl();
-525       entry.setTitle(item.title || formatDate(item.created, "date"));
-526       entry.setLink(item.href());
-527       entry.setAuthor(item.creator.name);
-528       entry.setPublishedDate(item.created);
-529       if (item.text) {
-530          description = new rome.SyndContentImpl();
-531          //description.setType("text/plain");
-532          // FIXME: Work-around for org.jdom.IllegalDataException caused by some ASCII control characters 
-533          description.setValue(item.renderSkinAsString("Story#rss").replace(/[\x00-\x1f^\x0a^\x0d]/g, function(c) {
-534             return "&#" + c.charCodeAt(0) + ";";
-535          }));
-536          entry.setDescription(description);
-537       }
-538       entries.add(entry);
-539       
-540       /*
-541       entryInfo = new rome.EntryInformationImpl();
-542       entryModules = new java.util.ArrayList();
-543       entryModules.add(entryInfo);
-544       entry.setModules(entryModules);
-545 
-546       enclosure = new rome.SyndEnclosureImpl();
-547       enclosure.setUrl(episode.getProperty("fileUrl"));
-548       enclosure.setType(episode.getProperty("contentType"));
-549       enclosure.setLength(episode.getProperty("filesize") || 0);
-550       enclosures = new java.util.ArrayList();
-551       enclosures.add(enclosure);
-552       entry.setEnclosures(enclosures);
-553 
-554       entryInfo.setAuthor(entry.getAuthor());
-555       entryInfo.setBlock(false);
-556       entryInfo.setDuration(new rome.Duration(episode.getProperty("length") || 0));
-557       entryInfo.setExplicit(false);
-558       entryInfo.setKeywords(episode.getProperty("keywords"));
-559       entryInfo.setSubtitle(episode.getProperty("subtitle"));
-560       entryInfo.setSummary(episode.getProperty("description"));
-561       */
-562    }
-563    feed.setEntries(entries);
-564    
-565    var output = new rome.SyndFeedOutput();
-566    //output.output(feed, res.servletResponse.writer); return;
-567    var xml = output.outputString(feed);
-568    // FIXME: Ugly hack for adding PubSubHubbub and rssCloud elements to XML
-569    xml = xml.replace("<rss", '<rss xmlns:atom="http://www.w3.org/2005/Atom"');
-570    xml = xml.replace("<channel>", '<channel>\n    <cloud domain="rpc.rsscloud.org" port="5337" path="/rsscloud/pleaseNotify" registerProcedure="" protocol="http-post" />');
-571    xml = xml.replace("<channel>", '<channel>\n    <atom:link rel="hub" href="' + getProperty("parss.hub") + '"/>'); 
-572    return xml; //injectXslDeclaration(xml);
-573 }
-574 
-575 Site.prototype.rss_xsl_action = function() {
-576    res.charset = "UTF-8";
-577    res.contentType = "text/xml";
-578    renderSkin("Global#xslStylesheet");
-579    return;
-580 }
-581 
-582 Site.prototype.referrers_action = function() {
-583    if (req.data.permanent && this.getPermission("edit"))  {
-584       var urls = req.data.permanent_array;
-585       res.push();
-586       res.write(this.getMetadata("spamfilter"));
-587       for (var i in urls) {
-588          res.write("\n");
-589          res.write(urls[i].replace(/\?/g, "\\\\?"));
-590       }
-591       this.setMetadata("spamfilter", res.pop());
-592       res.redirect(this.href(req.action));
-593       return;
-594    }
-595    res.data.action = this.href(req.action);
-596    res.data.title = gettext("Site Referrers");
-597    res.data.body = this.renderSkinAsString("$Site#referrers");
-598    this.renderSkin("Site#page");
-599    return;
-600 }
-601 
-602 Site.prototype.search_action = function() {
-603    var term = req.data.q && stripTags(decodeURIComponent(String(req.data.q)));
-604    if (!term) {
-605       res.message = gettext("Please enter a query in the search form.");
-606       res.data.body = this.renderSkinAsString("Site#search");
-607    } else {
-608       term = term.replace(/(?:\x22|\x27)/g, String.EMPTY); // Remove single and double ticks (aka false quotes)
-609       var sql = new Sql({quote: false});
-610       sql.retrieve(Sql.SEARCH, this._id, term, 50);
-611       res.push();
-612       var counter = 0;
-613       sql.traverse(function() {
-614          var content = Story.getById(this.id);
-615          if (!content.story || (content.story.status !== Story.CLOSED && 
-616                content.story.commentMode !== Story.CLOSED)) {
-617             content.renderSkin("Story#result");
-618             counter += 1;
-619          }
-620       });
-621       res.message = ngettext("Found {0} result.", "Found {0} results.", counter);
-622       res.data.body = res.pop();
-623    }
-624    
-625    res.data.title = gettext('Search results');
-626    this.renderSkin("Site#page");
-627    return;
-628 }
-629 
-630 Site.prototype.subscribe_action = function() {
-631    try {
-632       Membership.add(session.user, Membership.SUBSCRIBER, this);
-633       res.message = gettext('Successfully subscribed to site {0}.', 
-634             this.title);
-635    } catch (ex) {
-636       app.log(ex);
-637       res.message = ex.toString();
-638    }
-639    res.redirect(this.href());
-640    return;
-641 }
-642 
-643 Site.prototype.unsubscribe_action = function() {
-644    if (req.postParams.proceed) {
-645       try {
-646          Membership.remove.call(Membership.getByName(session.user.name));
-647          res.message = gettext("Successfully unsubscribed from site {0}.",
-648                this.title);
-649          res.redirect(User.getLocation() || this.href());
-650       } catch (ex) {
-651          app.log(ex)
-652          res.message = ex.toString();
-653       }
-654    }
-655 
-656    User.setLocation();
-657    res.data.title = gettext("Confirm Unsubscribe");
-658    res.data.body = this.renderSkinAsString("$HopObject#confirm", {
-659       text: gettext('You are about to unsubscribe from site {0}.', this.title)
-660    });
-661    this.renderSkin("Site#page");
-662    return;
-663 }
-664 
-665 Site.prototype.export_action = function() {
-666    var job = this.job && new Admin.Job(this.job);
-667 
-668    var data = req.postParams;
-669    if (data.submit === "start") {
-670       try {
-671          if (!job) {
-672             this.job = Admin.queue(this, "export");
-673             res.message = gettext("Site is scheduled for export.");
-674          } else {
-675             if (job.method !== "export") {
-676                throw Error(gettext("There is already another job queued for this site: {0}", 
-677                      job.method));
-678             }
-679          }
-680       } catch (ex) {
-681          res.message = ex.toString();
-682          app.log(res.message);
-683       }
-684       res.redirect(this.href(req.action));
-685    } else if (data.submit === "stop") {
-686       job && job.remove();
-687       this.job = null;
-688       res.redirect(this.href(req.action));
-689    }
-690 
-691    var param = {
-692       status: (job && job.method === "export") ? 
-693             gettext("A Blogger export file (.xml) will be created and available for download from here within 24 hours.") :
-694             null
-695    }
-696    res.handlers.file = File.getById(this.export_id) || {};
-697    res.data.body = this.renderSkinAsString("$Site#export", param);
-698    this.renderSkin("Site#page");
-699    return;
-700 }
-701 
-702 Site.prototype.import_action = function() {
-703    var job = this.job && new Admin.Job(this.job);
-704    var file = this.import_id && File.getById(this.import_id);
-705 
-706    var data = req.postParams;
-707    if (data.submit === "start") {
-708       try {
-709          if (job) {
-710             if (job.method === "import") {
-711                job.remove();
-712                this.job = null;
-713             } else if (job.method) {
-714                throw Error(gettext("There is already another job queued for this site: {0}", 
-715                      job.method));
-716             }
-717          }
-718          file && File.remove.call(file);
-719          data.file_origin = data.file.name;
-720          file = new File;
-721          file.site = this;
-722          file.update(data);
-723          this.files.add(file);
-724          file.creator = session.user;
-725          this.job = Admin.queue(this, "import");
-726          this.import_id = file._id;
-727          res.message = gettext("Site is scheduled for import.");
-728          res.redirect(this.href(req.action));
-729       } catch (ex) {
-730          res.message = ex.toString();
-731          app.log(res.message);
-732       }
-733    } else if (data.submit === "stop") {
-734       file && File.remove.call(file);
-735       job && job.remove();
-736       this.job = null;
-737       this.import_id = null;
-738       res.redirect(this.href(req.action));
-739    }
-740 
-741    res.handlers.file = File.getById(this.import_id) || {};
-742    res.data.body = this.renderSkinAsString("$Site#import");
-743    this.renderSkin("Site#page");
-744    return;
-745 }
-746 
-747 Site.prototype.robots_txt_action = function() {
-748    res.contentType = "text/plain";
-749    this.renderSkin("Site#robots");
-750    return;
-751 }
-752 
-753 /**
-754  * 
-755  * @param {String} name
-756  * @returns {HopObject}
-757  */
-758 Site.prototype.getMacroHandler = function(name) {
-759    switch (name) {
-760       case "archive":
-761       case "files":
-762       case "galleries":
-763       case "images":
-764       case "layout":
-765       case "members":
-766       case "polls":
-767       case "stories":
-768       case "tags":
-769       return this[name];
-770       default:
-771       return null;
-772    }
-773 }
-774 
-775 /**
-776  * 
-777  */
-778 Site.prototype.stories_macro = function() {
-779    if (this.stories.featured.size() < 1) {
-780       this.renderSkin("Site#welcome");
-781       if (session.user) {
-782          if (session.user === this.creator) {
-783             session.user.renderSkin("$User#welcome");
-784          }
-785          if (this === root && User.require(User.PRIVILEGED)) {
-786             this.admin.renderSkin("$Admin#welcome");
-787          }
-788       }
-789    } else {
-790       this.archive.renderSkin("Archive#main");
-791    }
-792    return;
-793 }
-794 
-795 /**
-796  * 
-797  * @param {Object} param
-798  */
-799 Site.prototype.calendar_macro = function(param) {
-800    if (this.archiveMode !== Site.PUBLIC) {
-801       return;
-802    }
-803    var calendar = new jala.Date.Calendar(this.archive);
-804    //calendar.setAccessNameFormat("yyyy/MM/dd");
-805    calendar.setHrefFormat("/yyyy/MM/dd/");
-806    calendar.setLocale(this.getLocale());
-807    calendar.setTimeZone(this.getTimeZone());
-808    calendar.render(this.archive.getDate());
-809    return;
-810 }
-811 
-812 /**
-813  * 
-814  * @param {Object} param
-815  */
-816 Site.prototype.age_macro = function(param) {
-817    res.write(Math.floor((new Date() - this.created) / Date.ONEDAY));
-818    return;
-819 }
-820 
-821 /**
-822  * 
-823  */
-824 Site.prototype.deleted_macro = function() {
-825    return new Date(this.deleted.getTime() + Date.ONEDAY * 
-826          Admin.SITEREMOVALGRACEPERIOD);
-827 }
-828 
-829 /**
-830  * 
-831  */
-832 Site.prototype.referrers_macro = function() {
-833    var self = this;
-834    var sql = new Sql;
-835    sql.retrieve(Sql.REFERRERS, "Site", this._id);
-836    sql.traverse(function() {
-837       if (this.requests && this.referrer) {
-838          this.text = encode(this.referrer.head(50));
-839          this.referrer = encode(this.referrer);
-840          self.renderSkin("$Site#referrer", this);
-841       }
-842    });
-843    return;
-844 }
-845 
-846 /**
-847  * 
-848  */
-849 Site.prototype.spamfilter_macro = function() {
-850    var str = this.getMetadata("spamfilter");
-851    if (!str) {
-852       return;
-853    }
-854    var items = str.replace(/\r/g, "").split("\n");
-855    for (var i in items) {
-856       res.write('"');
-857       res.write(items[i]);
-858       res.write('"');
-859       if (i < items.length-1) {
-860          res.write(",");
-861       }
-862    }
-863    return;
-864 }
-865 
-866 /**
-867  * 
-868  */
-869 Site.prototype.diskspace_macro = function() {
-870    var quota = this.getQuota();
-871    var usage = this.getDiskSpace(quota);
-872    res.write(usage > 0 ? formatNumber(usage, "#,###.#") : 0);
-873    res.write(" MB " + (quota ? gettext("free") : gettext("used")));
-874    return;
-875 }
-876 
-877 /**
-878  * @returns {java.util.Locale}
-879  */
-880 Site.prototype.getLocale = function() {
-881    var locale;
-882    if (locale = this.cache.locale) {
-883       return locale;
-884    } else if (this.locale) {
-885       var parts = this.locale.split("_");
-886       locale = new java.util.Locale(parts[0] || String.EMPTY, 
-887             parts[1] || String.EMPTY, parts.splice(2).join("_"));
-888    } else {
-889       locale = java.util.Locale.getDefault();
-890    }
-891    return this.cache.locale = locale;
-892 }
-893 
-894 /**
-895  * @returns {java.util.TimeZone}
-896  */
-897 Site.prototype.getTimeZone = function() {
-898    var timeZone;
-899    if (timeZone = this.cache.timeZone) {
-900       return timeZone;
-901    }
-902    if (this.timeZone) {
-903        timeZone = java.util.TimeZone.getTimeZone(this.timeZone);
-904    } else {
-905        timeZone = java.util.TimeZone.getDefault();
-906    }
-907    this.cache.timezone = timeZone;
-908    return timeZone;
-909 }
-910 
-911 /**
-912  * @returns {Number}
-913  */
-914 Site.prototype.getQuota = function() {
-915    return this.status !== Site.TRUSTED ? root.quota : null;
-916 }
-917 
-918 /**
-919  * @param {Number} quota 
-920  * @returns {float} 
-921  */
-922 Site.prototype.getDiskSpace = function(quota) {
-923    quota || (quota = this.getQuota());
-924    var dir = new java.io.File(this.getStaticFile());
-925    var size = Packages.org.apache.commons.io.FileUtils.sizeOfDirectory(dir);
-926    var factor = 1024 * 1024; // MB
-927    return (quota ? quota * factor - size : size) / factor;
-928 }
-929 
-930 /**
-931  * 
-932  * @param {String} href
-933  */
-934 Site.prototype.processHref = function(href) {
-935    if (["localhost", "127.0.0.1"].indexOf(req.data.http_host) > -1) {
-936       var site = app.properties.hrefRootPrototype ? "/" + this.name : String.EMPTY;
-937       return [app.appsProperties.mountPoint, site, href].join(String.EMPTY);
-938    }
-939    var domain, scheme = req.servletRequest ? req.servletRequest.scheme : "http";
-940    if (domain = getProperty("domain." + this.name)) {
-941       return [scheme, "://", domain, href].join(String.EMPTY);
-942    } else if (domain = getProperty("domain.*")) {
-943       return [scheme, "://", this.name, ".", domain, href].join(String.EMPTY);
-944    }
-945    return href;
-946 }
-947 
-948 /**
-949  * 
-950  * @param {String} type
-951  * @param {String} group
-952  * @returns {Tag[]}
-953  */
-954 Site.prototype.getTags = function(type, group) {
-955    var handler;
-956    type = type.toLowerCase();
-957    switch (type) {
-958       case "story":
-959       case "tags":
-960       handler = this.stories;
-961       type = "tags";
-962       break;
-963       case "image":
-964       case "galleries":
-965       handler = this.images;
-966       type = "galleries";
-967       break;
-968    }
-969    switch (group) {
-970       case Tags.ALL:
-971       return handler[type];     
-972       case Tags.OTHER:
-973       case Tags.ALPHABETICAL:
-974       return handler[group + type.titleize()];
-975       default:
-976       return handler["alphabetical" + type.titleize()].get(group);
-977    }
-978    return null;
-979 }
-980 
-981 /**
-982  * 
-983  * @param {String} tail
-984  * @returns {helma.File}
-985  */
-986 Site.prototype.getStaticFile = function(tail) {
-987    var fpath = this.name;
-988    tail && (fpath += "/" + tail);
-989    return new helma.File(app.appsProperties['static'], fpath);
-990 }
-991 
-992 /**
-993  * 
-994  * @param {String} tail
-995  * @returns {String}
-996  */
-997 Site.prototype.getStaticUrl = function(tail) {
-998    // FIXME: This still does not work reliably with the various configuration options...
-999    // Also see Images.Default.getStaticUrl() method
-1000    res.push();
-1001    res.write(app.appsProperties.staticMountpoint);
-1002    res.write("/");
-1003    res.write(this.name);
-1004    res.write("/");
-1005    tail && res.write(tail);
-1006    var url = res.pop();
-1007    // FIXME: Why encodeURI() here?
-1008    return encodeURI(url);
-1009 }
-1010 
-1011 /**
-1012  * 
-1013  * @param {Object} ref
-1014  */
-1015 Site.prototype.callback = function(ref) {
-1016     if (this.callbackMode === Site.ENABLED && this.callbackUrl) {
-1017       app.data.callbacks.push({
-1018          site: this._id,
-1019          handler: ref.constructor,
-1020          id: ref._id
-1021       });
-1022    }
-1023    return;
-1024 }
-1025 
-1026 /**
-1027  * 
-1028  * @param {String} name
-1029  * @returns {String[]}
-1030  */
-1031 Site.prototype.getAdminHeader = function(name) {
-1032    switch (name) {
-1033       case "tags":
-1034       case "galleries":
-1035       return ["#", "Name", "Items"];
-1036    }
-1037    return [];
-1038 }
-1039 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skin_Skin.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skin_Skin.js.html deleted file mode 100644 index a883ee53..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skin_Skin.js.html +++ /dev/null @@ -1,460 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2001-2007 by The Antville People
-  5 //
-  6 // Licensed under the Apache License, Version 2.0 (the ``License'');
-  7 // you may not use this file except in compliance with the License.
-  8 // You may obtain a copy of the License at
-  9 //
- 10 //    http://www.apache.org/licenses/LICENSE-2.0
- 11 //
- 12 // Unless required by applicable law or agreed to in writing, software
- 13 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 15 // See the License for the specific language governing permissions and
- 16 // limitations under the License.
- 17 //
- 18 // $Revision$
- 19 // $LastChangedBy$
- 20 // $LastChangedDate$
- 21 // $URL$
- 22 //
- 23 
- 24 /**
- 25  * @fileOverview Defines the Skin prototype
- 26  */
- 27 
- 28 markgettext("Skin");
- 29 markgettext("skin");
- 30 
- 31 /**
- 32  * 
- 33  * @param {String} group
- 34  * @param {String} name
- 35  * @returns {Skin}
- 36  */
- 37 Skin.getByName = function(group, name) {
- 38    var skinSet = (res.handlers.layout || path.layout).skins.get(group);
- 39    if (skinSet) {
- 40       var skin = skinSet.get(name);
- 41       if (skin) {
- 42          return skin;
- 43       } 
- 44    }
- 45    return null;
- 46 }
- 47 
- 48 /**
- 49  * @param {String} prototype
- 50  * @param {String} name
- 51  * @param {Layout} layout
- 52 */
- 53 Skin.add = function(prototype, name, layout) {
- 54    var skin = new Skin(prototype, name);
- 55    layout.skins.add(skin);
- 56    return skin;
- 57 }
- 58 
- 59 /**
- 60  * 
- 61  * @param {Skin} skin
- 62  */
- 63 Skin.remove = function() {
- 64    if (this.constructor === Skin) {
- 65       this.setSource(this.source);
- 66       this.source = null;
- 67       this.remove();
- 68    }
- 69    return;
- 70 }
- 71 
- 72 /**
- 73  * @returns  {String[]}
- 74  */
- 75 Skin.getPrototypeOptions = function() {
- 76    var prototypes = [];
- 77    var content, file;
- 78    var skinFiles = app.getSkinfilesInPath(res.skinpath);
- 79    for (var name in skinFiles) {
- 80       // Include root skins only for root site
- 81       if (name === root.constructor.name && res.handlers.site !== root) {
- 82          continue;
- 83       }
- 84       if (skinFiles[name][name]) {
- 85          prototypes.push({value: name, display: name});
- 86       }
- 87    }
- 88    return prototypes.sort(new String.Sorter("display"));
- 89 }
- 90 
- 91 /**
- 92  * @name Skin
- 93  * @constructor
- 94  * @param {String} prototype
- 95  * @param {String} name
- 96  * @property {Date} created
- 97  * @property {User} creator
- 98  * @property {Layout} layout
- 99  * @property {Date} modified
-100  * @property {User} modifier
-101  * @property {String} prototype
-102  * @property {String} source
-103  * @extends HopObject
-104  */
-105 Skin.prototype.constructor = function(prototype, name) {
-106    HopObject.confirmConstructor(this);
-107    this.prototype = prototype || String.EMPTY;
-108    this.name = name || String.EMPTY;
-109    this.creator = this.modifier = session.user;
-110    this.created = this.modified = new Date;
-111    return this;
-112 }
-113 
-114 /**
-115  * 
-116  * @param {String} action
-117  * @returns {Boolean}
-118  */
-119 Skin.prototype.getPermission = function(action) {
-120    switch (action) {
-121       case ".":
-122       case "main":
-123       return true;
-124    }
-125    return res.handlers.skins.getPermission("main");
-126 }
-127 
-128 /**
-129  * 
-130  * @param {String} action
-131  * @returns {String}
-132  */
-133 Skin.prototype.href = function(action) {
-134    res.push();
-135    res.write(res.handlers.layout.skins.href());
-136    res.write(this.prototype);
-137    res.write("/");
-138    res.write(this.name);
-139    res.write("/");
-140    action && (res.write(action));
-141    return res.pop();
-142 }
-143 
-144 Skin.prototype.main_action = function() {
-145    if (res.handlers.site === root) {
-146       res.contentType = "text/plain";
-147       res.write(this.getSource());
-148       return;
-149    }
-150    res.redirect(this.href("edit"));
-151    return;
-152 }
-153 
-154 Skin.prototype.edit_action = function() {
-155    if (req.postParams.save) {
-156       try {
-157          var url = this.href(req.action);
-158          this.update(req.postParams);
-159          res.message = gettext("The changes were saved successfully.");
-160          if (req.postParams.save == 1) {
-161             res.redirect(url);
-162          } else {
-163             res.redirect(res.handlers.layout.skins.href("modified"));
-164          }
-165       } catch (ex) {
-166          res.message = ex;
-167          app.log(ex);
-168       }
-169    }
-170    res.data.action = this.href(req.action);
-171    res.data.title = gettext('Edit Skin: {0}.{1}', this.prototype, this.name);
-172    res.data.body = this.renderSkinAsString("$Skin#edit");
-173    res.handlers.skins.renderSkin("$Skins#page");
-174    return;
-175 }
-176 
-177 /**
-178  * 
-179  * @param {Object} data
-180  */
-181 Skin.prototype.update = function(data) {
-182    if (this.isTransient()) {
-183       res.handlers.layout.skins.add(this);
-184       this.source = this.getSource(); // Copies the skin file source to database
-185    }
-186    if (this.prototype === "Site" && this.name === "page") {
-187       var macro = "response.body";
-188       if (!createSkin(data.source).containsMacro(macro)) {
-189          var macro = ["<code><%", macro, "%></code>"].join(String.EMPTY);
-190          throw Error(gettext("The {0} macro is missing. It is essential for accessing the site and must be present in this skin.", macro));
-191       }
-192    }
-193    this.setSource(data.source);   
-194    this.touch();
-195    return;
-196 }
-197 
-198 Skin.prototype.reset_action = function() {
-199    if (req.postParams.proceed) {
-200       try {
-201          Skin.remove.call(this);
-202          res.message = gettext("{0} was successfully reset.", gettext("Skin"));
-203          res.redirect(res.handlers.layout.skins.href("modified"));
-204       } catch(ex) {
-205          res.message = ex;
-206          app.log(ex);
-207       }
-208    }
-209 
-210    res.data.action = this.href(req.action);
-211    res.data.title = gettext("Confirm Reset");
-212    res.data.body = this.renderSkinAsString("$HopObject#confirm", {
-213       text: this.getConfirmText()
-214    });
-215    res.handlers.site.renderSkin("Site#page");
-216    return;
-217 }
-218 
-219 Skin.prototype.compare_action = function() {
-220    var originalSkin = this.source || String.EMPTY;
-221    var diff = this.getSource().diff(originalSkin);
-222    if (!diff) {
-223       res.message = gettext("No differences were found.");
-224    } else {
-225       res.push();
-226       var param = {}, leftLineNumber = rightLineNumber = 0;
-227       for each (let line in diff) {
-228          if (line.deleted) {
-229             param.right = encode(line.value);
-230             param.leftStatus = "added";
-231             param.rightStatus = '';
-232             for (let i=0; i<line.deleted.length; i++) {
-233                leftLineNumber += 1;
-234                param.leftLineNumber = leftLineNumber;
-235                param.rightLineNumber = '';
-236                param.left = encode(line.deleted[i]);
-237                param.right = '';
-238                this.renderSkin("$Skin#difference", param);
-239             }
-240          }
-241          if (line.inserted) {
-242             param.left = encode(line.value);
-243             param.leftStatus = '';
-244             param.rightStatus = 'removed';
-245             for (let i=0; i<line.inserted.length; i++) {
-246                rightLineNumber += 1;
-247                param.leftLineNumber = '';
-248                param.rightLineNumber = rightLineNumber;
-249                param.left = '';
-250                param.right = encode(line.inserted[i]);
-251                this.renderSkin("$Skin#difference", param);
-252             }
-253          }
-254          if (line.value !== null) {
-255             leftLineNumber += 1;
-256             rightLineNumber += 1;
-257             param.leftLineNumber = leftLineNumber;
-258             param.rightLineNumber = rightLineNumber;
-259             param.leftStatus = param.rightStatus = '';
-260             param.left = encode(line.value);
-261             param.right = param.left;
-262             this.renderSkin("$Skin#difference", param);
-263          }
-264       }
-265       res.data.diff = res.pop();
-266    }
-267 
-268    res.data.title = gettext("Compare Skin: {0}", this.getTitle());
-269    res.data.body = this.renderSkinAsString("$Skin#compare");
-270    res.handlers.skins.renderSkin("$Skins#page");
-271    return;
-272 }
-273 
-274 /**
-275  *
-276  * @return {String}
-277  */
-278 Skin.prototype.getTitle = function() {
-279    return this.prototype + '.' + this.name;
-280 }
-281 
-282 /**
-283  * 
-284  * @param {String} name
-285  * @return {Object}
-286  */
-287 Skin.prototype.getFormOptions = function(name) {
-288    switch (name) {
-289       case "prototype":
-290       return Skin.getPrototypeOptions();
-291    }
-292 }
-293 
-294 Skin.prototype.getFormValue = function(name) {
-295    switch (name) {
-296       case "source":
-297       return req.data.source || this.getSource();
-298    }
-299    return HopObject.prototype.getFormValue.apply(this, arguments);
-300 }
-301 
-302 /**
-303  * @returns {String}
-304  */
-305 Skin.prototype.getSource = function() {
-306    var skin;
-307    // FIXME: Maintain skin inheritance by checking if we target the Site skin of root
-308    if (res.handlers.site === root && this.prototype === "Site") {
-309       skin = this.getSubskin("Root");
-310       if (skin) {
-311          return skin.getSource();
-312       }
-313    }
-314    skin = this.getSubskin();
-315    if (skin) {
-316       return skin.getSource();
-317    }
-318    return null;
-319 }
-320 
-321 /**
-322  *
-323  * @param {String} source
-324  */
-325 Skin.prototype.setSource = function(source) {
-326    // FIXME: Maintain skin inheritance by checking if we target the Site skin of root
-327    var prototype = (res.handlers.site === root && this.prototype === "Site") ? "Root" : this.prototype;
-328    var skin = this.getMainSkin(prototype);
-329    if (!skin) {
-330       return;
-331    }
-332 
-333    res.push();
-334    if (source != null) {
-335       res.writeln("<% #" + this.name + " %>");
-336       res.writeln(source.trim().replace(/(<%\s*)#/g, "$1// #"));
-337    }
-338    var subskins = skin.getSubskinNames();
-339    for (var i in subskins) {
-340       if (subskins[i] !== this.name) {
-341          res.writeln("<% #" + subskins[i] + " %>");
-342          source = skin.getSubskin(subskins[i]).source;
-343          source && res.writeln(source.trim());
-344       }
-345    }
-346    source = res.pop();
-347 
-348    var file = this.getStaticFile();   
-349    if (!file.exists()) {
-350       file.getParentFile().mkdirs();
-351       file.createNewFile();
-352    }
-353    var fos = new java.io.FileOutputStream(file);
-354    var bos = new java.io.BufferedOutputStream(fos);
-355    var writer = new java.io.OutputStreamWriter(bos, "UTF-8");
-356    writer.write(source);
-357    writer.close();
-358    bos.close();
-359    fos.close();
-360 
-361    this.clearCache();
-362    return;
-363 }
-364 
-365 /**
-366  * 
-367  * @returns {java.io.File}
-368  */
-369 Skin.prototype.getStaticFile = function() {
-370    // FIXME: Maintain skin inheritance by checking if we target the Site skin of root
-371    var prototype = (res.handlers.site === root && this.prototype === "Site") ? "Root" : this.prototype;
-372    return new java.io.File(res.skinpath[0], prototype + "/" + this.prototype + ".skin");
-373 }
-374 
-375 /**
-376  * @param {String} prototype 
-377  * @returns {Skin}
-378  */
-379 Skin.prototype.getMainSkin = function(prototype) {
-380    var source, skinSet = app.getSkinfilesInPath(res.skinpath)[prototype || this.prototype];
-381    if (skinSet) {
-382       source = skinSet[this.prototype];
-383       if (source !== null) {
-384          return createSkin(source);
-385       }
-386    }
-387    return null;
-388 }
-389 
-390 /**
-391  *
-392  * @param prototype
-393  * @param name
-394  * @returns {Skin}
-395  */
-396 Skin.prototype.getSubskin = function(prototype, name) {
-397    var mainSkin = this.getMainSkin(prototype);
-398    if (mainSkin) {
-399       return mainSkin.getSubskin(name || this.name);
-400    }
-401    return null;
-402 }
-403 
-404 /**
-405  * 
-406  */
-407 Skin.prototype.render = function() {
-408    return renderSkin(createSkin(this.getSource()));
-409 }
-410 
-411 /**
-412  * 
-413  * @param {String} source
-414  * @returns {Boolean}
-415  */
-416 Skin.prototype.equals = function(source) {
-417    // FIXME: The removal of linebreaks is necessary but it's not very nice
-418    var re = /\r|\n/g;
-419    var normalize = function(str) {
-420       return str.replace(re, String.EMPTY);
-421    }
-422    return normalize(source) === normalize(this.getSource());
-423 }
-424 
-425 /**
-426  * @returns {String}
-427  */
-428 Skin.prototype.getConfirmText = function() {
-429    return gettext("You are about to reset the skin {0}.{1}.", 
-430          this.prototype, this.name);
-431 }
-432 
-433 /**
-434  * @returns {String}
-435  */
-436 Skin.prototype.toString = function() {
-437    return "Skin #" + this._id + ": " + this.prototype + "." + this.name;
-438 }
-439 
-440 /**
-441  * 
-442  */
-443 Skin.prototype.status_macro = function() {
-444    return this.isTransient() ? "inherited" : "modified"; 
-445 }
-446 
-447 /**
-448  * 
-449  */
-450 Skin.prototype.content_macro = function() {
-451    return res.write(this.getSource());
-452 }
-453 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skins_Skins.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skins_Skins.js.html deleted file mode 100644 index 85021d27..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Skins_Skins.js.html +++ /dev/null @@ -1,222 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Skins prototype.
- 28  */
- 29 
- 30 markgettext("Skins");
- 31 markgettext("skins");
- 32 
- 33 /**
- 34  * @name Skins
- 35  * @constructor
- 36  * @param {String} name
- 37  * @param {Skins} parent
- 38  * @property {Skin[]} _children
- 39  * @property {Skin[]} custom
- 40  * @property {Skin[]} modified
- 41  * @property {String} name
- 42  * @property {Skins} parent
- 43  * @extends HopObject
- 44  */
- 45 Skins.prototype.constructor = function(name, parent) {
- 46   this.name = name; 
- 47   this.parent = parent;
- 48   return this;
- 49 }
- 50 
- 51 /**
- 52  * 
- 53  * @param {String} action
- 54  * @returns {Boolean}
- 55  */
- 56 Skins.prototype.getPermission = function(action) {
- 57    return res.handlers.layout.getPermission("main");
- 58 }
- 59 
- 60 /**
- 61  * 
- 62  * @param {String} name
- 63  * @returns {Skins|Skin}
- 64  */
- 65 Skins.prototype.getChildElement = function(name) {
- 66    if (this.parent) {
- 67       var group = path[path.length - 1].name;
- 68       var skin = this.getSkin(group, name);
- 69       if (skin) {
- 70          return skin;
- 71       }
- 72       if (global[group] || group === "Global") {
- 73          return this.getSkin(group, name);         
- 74       }
- 75    }
- 76    return new Skins(name, this);
- 77 }
- 78 
- 79 Skins.prototype.onRequest = function() {
- 80    if (this.parent) {
- 81       res.redirect(res.handlers.layout.skins.href(req.action));
- 82    }
- 83    return HopObject.prototype.onRequest.call(this);
- 84 }
- 85 
- 86 Skins.prototype.main_action = function() {
- 87    res.data.title = gettext("Basic Skins");
- 88    res.data.body = this.renderSkinAsString("$Skins#main");
- 89    res.handlers.site.renderSkin("Site#page");
- 90    return;
- 91 }
- 92 
- 93 Skins.prototype.create_action = function() {
- 94    if (req.postParams.save) {
- 95       try {
- 96          var prototype = req.postParams.prototype;
- 97          var name = stripTags(req.postParams.name);
- 98          if (!prototype || !req.postParams.name) {
- 99             throw Error(gettext("Please choose a prototype and enter a skin name"));
-100          } else if (name !== req.postParams.name || /\s/.test(name) || NAMEPATTERN.test(name)) {
-101             throw Error(gettext("Please avoid special characters or HTML code in the name field."));
-102          } else if (Skin.getByName(prototype, name)) {
-103             throw Error("Sorry, there is already a skin with that name. Please enter a different one.");
-104          }
-105          var skin = this.getSkin(prototype, name);
-106          skin.update(req.postParams);
-107          res.message = gettext("The changes were saved successfully.");
-108          if (req.postParams.save == 1) {
-109             res.redirect(skin.href("edit"));
-110          } else {
-111             res.redirect(res.handlers.layout.skins.href("modified"));
-112          }
-113       } catch (ex) {
-114          res.message = ex;
-115          app.log(ex);
-116       }
-117    }
-118    res.data.title = gettext('Add Skin');
-119    res.data.action = this.href(req.action);
-120    HopObject.confirmConstructor(Skin);
-121    res.data.body = (new Skin).renderSkinAsString("$Skin#edit");
-122    this.renderSkin("$Skins#page");
-123    return;
-124 }
-125 
-126 Skins.prototype.modified_action = function() {
-127    res.data.title = gettext("Modified Skins");
-128    res.push();
-129    this.renderSkin("$Skins#header");
-130    this.modified.forEach(function() {
-131       this.renderSkin("$Skin#listItem");
-132    });
-133    res.data.body = res.pop();
-134    res.handlers.site.renderSkin("Site#page");
-135    return;
-136 }
-137 
-138 Skins.prototype.all_action = function() {
-139    if (this.parent) {
-140       res.redirect(res.handlers.layout.skins.href(req.action));
-141    }
-142    res.data.list = this.getOutline();
-143    res.data.title = gettext("All Skins");
-144    res.data.body = this.renderSkinAsString("$Skins#all");
-145    res.handlers.site.renderSkin("Site#page");
-146    return;
-147 }
-148 
-149 Skins.prototype.safe_action = function() {
-150    res.data.title = gettext("Modified Skins");
-151    res.push();
-152    this.modified.forEach(function() {
-153       this.renderSkin("$Skin#listItem");
-154    });
-155    res.data.title = "Modified Skins";
-156    res.data.body = res.pop();
-157    this.renderSkin("$Skins#page");
-158    return;
-159 }
-160 
-161 /**
-162  * 
-163  * @param {String} group
-164  * @param {String} name
-165  * @returns {Skin}
-166  */
-167 Skins.prototype.getSkin = function(group, name) {
-168    return Skin.getByName(group, name) || new Skin(group, name);
-169 }
-170 
-171 /**
-172  * 
-173  * @returns {String}
-174  */
-175 Skins.prototype.getOutline = function() {
-176    var skinfiles, prototype, skin, subskins, names, skins = [];
-177    var options = Skin.getPrototypeOptions();
-178 
-179    for each (var option in options) {
-180       names = [];
-181       prototype = option.value;
-182       skinfiles = app.getSkinfilesInPath(res.skinpath);
-183       skin = createSkin(skinfiles[prototype][prototype]);
-184       subskins = skin.getSubskinNames();
-185       for each (var subskin in subskins) {
-186          names.push(subskin);
-187       }
-188       names.sort();
-189       skins.push([prototype, names]);
-190    }
-191 
-192    res.push();
-193    for each (var item in skins) {
-194       prototype = item[0];
-195       skin = item[1];
-196       if (skin && skin.length > 0) {
-197          html.openTag("li");
-198          html.openTag("a", {href: "#" + prototype});
-199          res.write(prototype);
-200          html.closeTag("a");
-201          html.openTag("ul");
-202          for each (var name in skin) {
-203             subskin = this.getSkin(prototype, name);
-204             html.openTag("li");
-205             html.link({href: subskin.href("edit")}, 
-206                   subskin.prototype + "." + subskin.name);
-207             html.closeTag("li");
-208          }
-209          html.closeTag("ul");
-210          html.closeTag("li");
-211       }
-212    }
-213    return res.pop();
-214 }
-215 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Stories_Stories.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Stories_Stories.js.html deleted file mode 100644 index 6913a17b..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Stories_Stories.js.html +++ /dev/null @@ -1,185 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Stories prototype
- 28  */
- 29 
- 30 markgettext("Stories");
- 31 markgettext("stories");
- 32 
- 33 /**
- 34  * @name Stories
- 35  * @constructor
- 36  * @property {Story[]} _children
- 37  * @property {Tag[]} alphabeticalTags
- 38  * @property {Story[]} closed
- 39  * @property {Comment[]} comments
- 40  * @property {Story[]} featured
- 41  * @property {Tag[]} otherTags
- 42  * @property {Story[]} recent
- 43  * @property {Tag[]} tags
- 44  * @property {Story[]} top
- 45  * @property {Story[]} union
- 46  * @extends HopObject
- 47  */
- 48 
- 49 /**
- 50  * 
- 51  * @param {String} action
- 52  * @returns {Boolean}
- 53  */
- 54 Stories.prototype.getPermission = function(action) {
- 55    if (!this._parent.getPermission("main")) {
- 56       return false;
- 57    }
- 58    switch (action) {
- 59       case ".":
- 60       case "main":
- 61       case "create":
- 62       return Site.require(Site.OPEN) && session.user ||
- 63             Membership.require(Membership.CONTRIBUTOR) || 
- 64             User.require(User.PRIVILEGED); 
- 65 
- 66       case "all":
- 67       case "top":
- 68       case "closed":
- 69       return Membership.require(Membership.MANAGER) ||
- 70             User.require(User.PRIVILEGED);
- 71    }
- 72    return false;
- 73 }
- 74 
- 75 Stories.prototype.main_action = function() {
- 76    var stories = User.getMembership().stories;
- 77    res.data.list = renderList(stories, "$Story#listItem", 
- 78          10, req.queryParams.page);
- 79    res.data.pager = renderPager(stories, 
- 80          this.href(), 10, req.queryParams.page);
- 81    res.data.title = gettext("Member Stories");
- 82    res.data.body = this.renderSkinAsString("$Stories#main");
- 83    this._parent.renderSkin("Site#page");
- 84    return;
- 85 }
- 86 
- 87 Stories.prototype.create_action = function() {
- 88    if (req.data.save) {
- 89       try {
- 90          story = Story.add(req.params);
- 91          story.notify(req.action);
- 92          JSON.sendPaddedResponse(story._id);
- 93          delete session.data.backup;
- 94          res.message = gettext("The story was successfully created.");
- 95          res.redirect(story.href());
- 96       } catch (ex) {
- 97          JSON.sendPaddedResponse(null);
- 98          res.status = 400;
- 99          res.message = ex;
-100          app.log(ex);
-101       }
-102    }
-103    
-104    res.data.title = gettext("Add Story");
-105    res.data.action = this.href(req.action);
-106    HopObject.confirmConstructor(Story);
-107    res.data.body = (new Story).renderSkinAsString("Story#edit");
-108    this._parent.renderSkin("Site#page");
-109    return;
-110 }
-111 
-112 Stories.prototype.closed_action = function() {
-113    res.data.list = renderList(this.closed, 
-114          "$Story#listItem", 10, req.queryParams.page);
-115    res.data.pager = renderPager(this.closed, 
-116          this.href(req.action), 10, req.queryParams.page);
-117    res.data.title = gettext("Closed Stories");
-118    res.data.body = this.renderSkinAsString("$Stories#main");
-119    this._parent.renderSkin("Site#page");
-120    return;
-121 }
-122 
-123 Stories.prototype.all_action = function() {
-124    res.data.list = renderList(this, "$Story#listItem", 10, req.queryParams.page);
-125    res.data.pager = renderPager(this, 
-126          this.href(req.action), 10, req.queryParams.page);
-127    res.data.title = gettext("All Stories");
-128    res.data.body = this.renderSkinAsString("$Stories#main");
-129    this._parent.renderSkin("Site#page");
-130    return;
-131 }
-132 
-133 Stories.prototype.top_action = function() {
-134    res.data.title = gettext("Top Stories");
-135    res.data.body = this.renderSkinAsString("$Stories#top");
-136    this._parent.renderSkin("Site#page");
-137    return;
-138 }
-139 
-140 /**
-141  * 
-142  * @param {Object} param
-143  * @param {String} type
-144  */
-145 Stories.prototype.list_macro = function(param, type) {
-146    switch (type) {
-147       case "top":
-148       var counter = 1;
-149       this.top.forEach(function() {
-150          this.renderSkin("$Story#top", {
-151             position: counter
-152          });
-153          counter += 1;
-154       }); 
-155       break;
-156    }
-157    return;
-158 }
-159 
-160 /**
-161  * 
-162  * @param {String} group
-163  * @returns {Tag[]}
-164  * @see Site#getTags
-165  */
-166 Stories.prototype.getTags = function(group) {
-167    return this._parent.getTags("tags", group);
-168 }
-169 
-170 /**
-171  * 
-172  * @param {String} name
-173  * @returns {String[]}
-174  */
-175 Stories.prototype.getAdminHeader = function(name) {
-176    return ["#", "Tag", "Items"];
-177 }
-178 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Story_Story.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Story_Story.js.html deleted file mode 100644 index bb44021e..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Story_Story.js.html +++ /dev/null @@ -1,692 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Story prototype.
- 28  */
- 29 
- 30 markgettext("Story");
- 31 markgettext("story");
- 32 
- 33 this.handleMetadata("title");
- 34 this.handleMetadata("text");
- 35 
- 36 /**
- 37  * @function
- 38  * @param {Object} data
- 39  * @param {Site} site
- 40  * @param {User} user
- 41  * @returns {Story}
- 42  */
- 43 Story.add = function(data, site, user) {
- 44    HopObject.confirmConstructor(Story);
- 45    site || (site = res.handlers.site);
- 46    user || (user = session.user);
- 47    var story = new Story;
- 48    story.name = String.EMPTY;
- 49    story.requests = 0;
- 50    story.created = story.modified = new Date;
- 51    story.site = site;
- 52    story.creator = story.modifier = user;
- 53    story.update(data);
- 54    site.stories.add(story);
- 55    return story;
- 56 }
- 57 
- 58 /**
- 59  * @function
- 60  */
- 61 Story.remove = function() {
- 62    if (this.constructor === Story) {
- 63       HopObject.remove.call(this.comments);
- 64       this.setTags(null);
- 65       this.deleteMetadata();
- 66       this.remove();
- 67    }
- 68    return;
- 69 }
- 70 
- 71 /**
- 72  * @function
- 73  * @returns {String[]}
- 74  * @see defineConstants
- 75  */
- 76 Story.getStatus = defineConstants(Story, markgettext("closed"), 
- 77       markgettext("public"), markgettext("shared"), markgettext("open"));
- 78 /**
- 79  * @function
- 80  * @returns {String[]}
- 81  * @see defineConstants
- 82  */
- 83 Story.getModes = defineConstants(Story, markgettext("hidden"), 
- 84       markgettext("featured"));
- 85 /**
- 86  * @function
- 87  * @returns {String[]}
- 88  * @see defineConstants
- 89  */
- 90 Story.getCommentModes = defineConstants(Story, markgettext("closed"), 
- 91       /* markgettext("readonly"), markgettext("moderated"), */ 
- 92       markgettext("open"));
- 93 
- 94 /**
- 95  * @name Story
- 96  * @constructor
- 97  * @property {Comment[]} _children
- 98  * @property {String} commentMode
- 99  * @property {Comment[]} comments
-100  * @property {Date} created
-101  * @property {User} creator
-102  * @property {Metadata} metadata
-103  * @property {String} mode
-104  * @property {Date} modified
-105  * @property {User} modifier
-106  * @property {String} name
-107  * @property {Number} parent_id
-108  * @property {String} parent_type
-109  * @property {String} prototype
-110  * @property {Number} requests
-111  * @property {Site} site
-112  * @property {String} status
-113  * @property {TagHub[]} tags
-114  * @property {String} text
-115  * @property {String} title
-116  * @extends HopObject
-117  */
-118 Story.prototype.constructor = function() {
-119    HopObject.confirmConstructor(this);
-120    return this;
-121 }
-122 
-123 /**
-124  * 
-125  * @param {String} action
-126  * @returns {Boolean}
-127  */
-128 Story.prototype.getPermission = function(action) {
-129    if (!this.site.getPermission("main")) {
-130       return false;
-131    }
-132    switch (action) {
-133       case ".":
-134       case "main":
-135       return this.status !== Story.CLOSED || 
-136             this.creator === session.user || 
-137             Membership.require(Membership.MANAGER) || 
-138             User.require(User.PRIVILEGED);
-139       case "comment":
-140       return this.site.commentMode === Site.ENABLED &&
-141             (this.commentMode === Story.OPEN ||
-142             this.commentMode === Story.MODERATED);
-143       case "delete":
-144       return this.creator === session.user || 
-145             Membership.require(Membership.MANAGER) ||
-146             User.require(User.PRIVILEGED);            
-147       case "edit":
-148       case "rotate":
-149       return this.creator === session.user || 
-150             Membership.require(Membership.MANAGER) || 
-151             (this.status === Story.SHARED &&
-152             Membership.require(Membership.CONTRIBUTOR)) || 
-153             (this.status === Story.OPEN && 
-154             Membership.require(Membership.SUBSCRIBER)) ||
-155             User.require(User.PRIVILEGED);
-156    }
-157    return false;
-158 }
-159 
-160 Story.prototype.main_action = function() {
-161    res.data.title = this.getTitle(5);
-162    res.data.body = this.renderSkinAsString("Story#main");
-163    this.site.renderSkin("Site#page");
-164    this.site.log();
-165    this.count();
-166    this.log();
-167    return;
-168 }
-169 
-170 /**
-171  * 
-172  * @param {Number} limit
-173  * @returns {String}
-174  */
-175 Story.prototype.getTitle = function(limit) {
-176    var key = this + ":title:" + limit;
-177    if (!res.meta[key]) {
-178       if (this.title) {
-179          res.meta[key] = stripTags(this.title).clip(limit, "...", "\\s");
-180       } else if (this.text) {
-181          var parts = stripTags(this.text).embody(limit, "...", "\\s");
-182          res.meta[key] = parts.head;
-183          res.meta[this + ":text:" + limit] = parts.tail;
-184       }
-185    }
-186    return String(res.meta[key]) || "..."; 
-187 }
-188 
-189 Story.prototype.edit_action = function() {
-190    if (req.postParams.save) {
-191       try {
-192          this.update(req.postParams);
-193          delete session.data.backup;
-194          res.message = gettext("The story was successfully updated.");
-195          res.redirect(this.href());
-196       } catch (ex) {
-197          res.message = ex;
-198          app.log(ex);
-199       }
-200    }
-201    
-202    res.data.action = this.href(req.action);
-203    res.data.title = gettext('Edit Story');
-204    res.data.body = this.renderSkinAsString("Story#edit");
-205    this.site.renderSkin("Site#page");
-206    return;
-207 }
-208 
-209 /**
-210  * 
-211  * @param {Object} data
-212  */
-213 Story.prototype.update = function(data) {
-214    var site = this.site || res.handlers.site;
-215    
-216    if (!data.title && !data.text) {
-217       throw Error(gettext("Please enter at least something into the “title” or “text” field."));
-218    }
-219    if (data.created) {
-220       try {
-221          this.created = data.created.toDate("yyyy-MM-dd HH:mm", site.getTimeZone());
-222       } catch (ex) {
-223          throw Error(gettext("Cannot parse timestamp {0} as a date.", data.created));
-224          app.log(ex);
-225       }
-226    }
-227    
-228    // Get difference to current content before applying changes
-229    var delta = this.getDelta(data);
-230    this.title = data.title ? data.title.trim() : String.EMPTY;
-231    this.text = data.text ? data.text.trim() : String.EMPTY;
-232    this.status = data.status || Story.PUBLIC;
-233    this.mode = data.mode || Story.FEATURED;
-234    this.commentMode = data.commentMode || Story.OPEN;
-235    this.setCustomContent(data);
-236 
-237    // FIXME: To be removed resp. moved to Stories.create_action and 
-238    // Story.edit_action if work-around for Helma bug #607 fails
-239    // We need persistence for setting the tags
-240    this.isTransient() && this.persist();
-241    this.setTags(data.tags || data.tag_array);
-242 
-243    if (delta > 50) {
-244       this.modified = new Date;
-245       if (this.status !== Story.CLOSED) {
-246          site.modified = this.modified;
-247       }
-248       site.callback(this);
-249       // Notification is sent in Stories.create_action()
-250    }
-251    
-252    this.clearCache();
-253    this.modifier = session.user;
-254    return;
-255 }
-256 
-257 Story.prototype.rotate_action = function() {
-258    if (this.status === Story.CLOSED) {
-259       this.status = this.cache.status || Story.PUBLIC;
-260    } else if (this.mode === Story.FEATURED) {
-261       this.mode = Story.HIDDEN;
-262    } else {
-263       this.cache.status = this.status;
-264       this.mode = Story.FEATURED;
-265       this.status = Story.CLOSED;
-266    }
-267    return res.redirect(req.data.http_referer || this._parent.href());
-268 }
-269 
-270 Story.prototype.comment_action = function() {
-271    // Check if user is logged in since we allow linking here for any user
-272    if (!User.require(User.REGULAR)) {
-273       User.setLocation(this.href(req.action) + "#form");
-274       res.message = gettext("Please login first.");
-275       res.redirect(this.site.members.href("login"));
-276    }
-277    if (req.postParams.save) {
-278       try {
-279          var comment = Comment.add(req.postParams, this);
-280          comment.notify(req.action);
-281          delete session.data.backup;
-282          res.message = gettext("The comment was successfully created.");
-283          res.redirect(comment.href());
-284       } catch (ex) {
-285          res.message = ex;
-286          app.log(ex);
-287       }
-288    }
-289    res.handlers.parent = this;
-290    res.data.action = this.href(req.action);
-291    res.data.title = gettext("Add Comment");
-292    HopObject.confirmConstructor(Comment);
-293    res.data.body = (new Comment).renderSkinAsString("Comment#edit");
-294    this.site.renderSkin("Site#page");
-295    return;
-296 }
-297 
-298 /**
-299  * 
-300  * @param {String} name
-301  * @returns {Object}
-302  */
-303 Story.prototype.getFormValue = function(name) {
-304    if (req.isPost()) {
-305       return req.postParams[name];
-306    }
-307    switch (name) {
-308       case "commentMode":
-309       return this.commentMode || Story.OPEN;
-310       case "mode":
-311       return this.mode || Story.FEATURED;
-312       case "status":
-313       return this.status || Story.PUBLIC;
-314       case "tags":
-315       return this.getTags().join(Tag.DELIMITER);
-316    }
-317    return this[name] || this.getMetadata(name);
-318 }
-319 
-320 /**
-321  * 
-322  * @param {String} name
-323  * @returns {String[]}
-324  */
-325 Story.prototype.getFormOptions = function(name) {
-326    switch (name) {
-327       case "commentMode":
-328       return Story.getCommentModes();
-329       case "mode":
-330       return Story.getModes();
-331       case "status":
-332       return Story.getStatus();
-333       case "tags":
-334       // FIXME: This could become a huge select element...
-335       return [];
-336    }
-337    return;
-338 }
-339 
-340 /**
-341  *
-342  * @param {Object} data
-343  */
-344 Story.prototype.setCustomContent = function(data) {
-345    var metadata = {};
-346    for (var key in data) {
-347       if (this.isCustomContent(key)) {
-348          metadata[key] = data[key];
-349       }
-350    }
-351    return HopObject.prototype.setMetadata.call(this, metadata);
-352 }
-353 
-354 /**
-355  * 
-356  * @param {String} name
-357  */
-358 Story.prototype.isCustomContent = function(key) {
-359    return this[key] === undefined && key !== 'save';
-360 }
-361 
-362 /**
-363  * Increment the request counter
-364  */
-365 Story.prototype.count = function() {
-366    if (session.user === this.creator) {
-367       return;
-368    }
-369    var story;
-370    var key = "Story#" + this._id;
-371    if (story = app.data.requests[key]) {
-372       story.requests += 1;
-373    } else {
-374       app.data.requests[key] = {
-375          type: this.constructor,
-376          id: this._id,
-377          requests: this.requests + 1
-378       };
-379    }
-380    return;
-381 }
-382 
-383 /**
-384  * Calculate the difference of a story’s current and its updated content
-385  * @param {Object} data
-386  * @returns {Number}
-387  */
-388 Story.prototype.getDelta = function(data) {
-389    if (this.isTransient()) {
-390       return Infinity;
-391    }
-392 
-393    var deltify = function(s1, s2) {
-394       var len1 = s1 ? String(s1).length : 0;
-395       var len2 = s2 ? String(s2).length : 0;
-396       return Math.abs(len1 - len2);
-397    };
-398 
-399    var delta = 0;
-400    delta += deltify(data.title, this.title);
-401    delta += deltify(data.text, this.text);
-402    for (var key in data) {
-403       if (this.isCustomContent(key)) {
-404          delta += deltify(data[key], this.getMetadata(key))
-405       }
-406    }
-407    // In-between updates (1 hour) get zero delta
-408    var timex = (new Date - this.modified) > Date.ONEHOUR ? 1 : 0;
-409    return delta * timex;
-410 }
-411 
-412 /**
-413  * 
-414  * @param {String} name
-415  * @returns {HopObject}
-416  */
-417 Story.prototype.getMacroHandler = function(name) {
-418    if (name === "metadata") {
-419       return this.getMetadata();
-420    }
-421    return null;
-422 }
-423 
-424 /**
-425  * 
-426  * @param {Object} param
-427  * @param {String} action
-428  * @param {String} text
-429  */
-430 Story.prototype.link_macro = function(param, action, text) {
-431    switch (action) {
-432       case "rotate":
-433       if (this.status === Story.CLOSED) {
-434          text = gettext("Publish");
-435       } else if (this.mode === Story.FEATURED) {
-436          text = gettext("Hide");
-437       } else {
-438          text = gettext("Close");
-439       }
-440    }
-441    return HopObject.prototype.link_macro.call(this, param, action, text);
-442 }
-443 
-444 /**
-445  * 
-446  * @param {Object} param
-447  */
-448 Story.prototype.summary_macro = function(param) {
-449    param.limit || (param.limit = 15);
-450    var keys, summary;
-451    if (arguments.length > 1) {
-452       res.push();
-453       var content;
-454       for (var i=1; i<arguments.length; i+=1) {
-455          if (content = this.getMetadata(arguments[i])) {
-456             res.write(content);
-457             res.write(String.SPACE);
-458          }
-459       }      
-460       summary = res.pop();
-461    }
-462    if (!summary) {
-463       summary = (this.title || String.EMPTY) + String.SPACE + 
-464             (this.text || String.EMPTY);
-465    }
-466    var clipped = stripTags(summary).clip(param.limit, param.clipping, "\\s");
-467    var head = clipped.split(/(\s)/, param.limit * 0.6).join(String.EMPTY);
-468    var tail = clipped.substring(head.length).trim();
-469    head = head.trim();
-470    if (!head && !tail) {
-471       head = "...";
-472    }
-473    html.link({href: this.href()}, head);
-474    res.writeln("\n");
-475    res.write(tail);
-476    return;
-477 }
-478 
-479 /**
-480  * 
-481  * @param {Object} param
-482  * @param {String} mode
-483  */
-484 Story.prototype.comments_macro = function(param, mode) {
-485    var story = this.story || this;
-486    if (story.site.commentMode === Site.DISABLED || 
-487          story.commentMode === Site.CLOSED) {
-488       return;
-489    } else if (mode) {
-490       var n = this.comments.size() || 0;
-491       var text = ngettext("{0} comment", "{0} comments", n);
-492       if (mode === "count" || mode === "size") {
-493          res.write(text);
-494       } else if (mode === "link") {
-495          n < 1 ? res.write(text) : 
-496                html.link({href: this.href() + "#comments"}, text);
-497       }
-498    } else {
-499       this.prefetchChildren();
-500       this.forEach(function() {
-501          html.openTag("a", {name: this._id});
-502          html.closeTag("a");
-503          this.renderSkin(this.parent.constructor === Story ? 
-504                "Comment#main" : "Comment#reply");
-505       });
-506    }
-507    return;
-508 }
-509 
-510 /**
-511  * 
-512  * @param {Object} param
-513  * @param {String} mode
-514  */
-515 Story.prototype.tags_macro = function(param, mode) {
-516    if (mode === "link") {
-517       var tags = [];
-518       this.tags.list().forEach(function(item) {
-519          res.push();
-520          if (item.tag) {
-521             renderLink(param, item.tag.href(), item.tag.name);
-522             tags.push(res.pop());
-523          }
-524       });
-525       return res.write(tags.join(Tag.DELIMITER));
-526    }
-527    return res.write(this.getFormValue("tags"));
-528 }
-529 
-530 /**
-531  * 
-532  * @param {Object} param
-533  * @param {Number} limit
-534  */
-535 Story.prototype.referrers_macro = function(param, limit) {
-536    if (!User.require(User.PRIVILEGED) && 
-537          !Membership.require(Membership.OWNER)) {
-538       return;
-539    }
-540 
-541    limit = Math.min(limit || param.limit || 100, 100);
-542    if (limit < 1) {
-543       return;
-544    }
-545 
-546    var self = this;
-547    var sql = new Sql;
-548    sql.retrieve(Sql.REFERRERS, "Story", this._id);
-549 
-550    res.push();
-551    var n = 0;
-552    sql.traverse(function() {
-553       if (n < limit && this.requests && this.referrer) {
-554          this.text = encode(this.referrer.head(50));
-555          this.referrer = encode(this.referrer);
-556          self.renderSkin("$Story#referrer", this);
-557       }
-558       n += 1;
-559    });
-560    param.referrers = res.pop();
-561    if (param.referrers) {
-562       this.renderSkin("$Story#referrers", param);
-563    }
-564    return;   
-565 }
-566 
-567 /**
-568  * 
-569  * @param {Object} value
-570  * @param {Object} param
-571  * @param {String} mode
-572  * @returns {String}
-573  */
-574 Story.prototype.format_filter = function(value, param, mode) {
-575    if (value) {
-576       switch (mode) {
-577          case "plain":
-578          return this.url_filter(stripTags(value), param, mode);
-579          
-580          case "quotes":
-581          return stripTags(value).replace(/(?:\x22|\x27)/g, function(quote) {
-582             return "&#" + quote.charCodeAt(0) + ";";
-583          });
-584          
-585          case "image":
-586          var image = HopObject.getFromPath(value, "images");
-587          if (image) {
-588             res.push();
-589             image.render_macro(param);
-590             return res.pop();
-591          }
-592          break;
-593          
-594          default:
-595          value = this.macro_filter(format(value), param);
-596          return this.url_filter(value, param);
-597       }
-598    }
-599    return String.EMTPY;
-600 }
-601 
-602 /**
-603  * 
-604  * @param {String|Skin} value
-605  * @param {Object} param
-606  * @returns {String}
-607  */
-608 Story.prototype.macro_filter = function(value, param) {
-609    var skin = value.constructor === String ? createSkin(value) : value;
-610    skin.allowMacro("image");
-611    skin.allowMacro("this.image");
-612    skin.allowMacro("site.image");
-613    skin.allowMacro("story.image");
-614    skin.allowMacro("thumbnail");
-615    skin.allowMacro("this.thumbnail");
-616    skin.allowMacro("site.thumbnail");
-617    skin.allowMacro("story.thumbnail");
-618    skin.allowMacro("link");
-619    skin.allowMacro("this.link");
-620    skin.allowMacro("site.link");
-621    skin.allowMacro("story.link");
-622    skin.allowMacro("file");
-623    skin.allowMacro("poll");
-624    skin.allowMacro("logo");
-625    skin.allowMacro("storylist");
-626    skin.allowMacro("fakemail");
-627    skin.allowMacro("this.topic");
-628    skin.allowMacro("story.topic");
-629    skin.allowMacro("imageoftheday");
-630    skin.allowMacro("spacer");
-631 
-632    var site;
-633    if (this.site !== res.handlers.site) {
-634       site = res.handlers.site;
-635       res.handlers.site = this.site;
-636    }
-637    value = this.renderSkinAsString(skin);
-638    site && (res.handlers.site = site);
-639    return value;
-640 }
-641 
-642 /**
-643  * 
-644  * @param {String} value
-645  * @param {Object} param
-646  * @param {String} mode
-647  * @returns {String}
-648  */
-649 Story.prototype.url_filter = function(value, param, mode) {
-650    param.limit || (param.limit = 50);
-651    // FIXME: The first RegExp has troubles with <a href=http://... (no quotes)
-652    //var re = /(^|\/>|\s+)([\w+-_]+:\/\/[^\s]+?)([\.,;:\)\]\"]?)(?=[\s<]|$)/gim;
-653    var re = /(^|\/>|\s+)([!fhtpsr]+:\/\/[^\s]+?)([\.,;:\)\]\"]?)(?=[\s<]|$)/gim
-654    return value.replace(re, function(str, head, url, tail) {
-655       if (url.startsWith("!")) {
-656          return head + url.substring(1) + tail;
-657       }
-658       res.push();
-659       res.write(head);
-660       if (mode === "plain") {
-661          res.write(url.clip(param.limit));
-662       } else {
-663          var text, location = /:\/\/([^\/]*)/.exec(url)[1];
-664          text = location;
-665          if (mode === "extended") {
-666             text = url.replace(/^.+\/([^\/]*)$/, "$1");
-667          }
-668          html.link({href: url, title: url}, text.clip(param.limit));
-669          if (mode === "extended" && text !== location) {
-670             res.write(" <small>(" + location + ")</small>");
-671          }
-672       }
-673       res.write(tail);
-674       return res.pop();
-675    });
-676 }
-677 
-678 /**
-679  * @returns {String}
-680  */
-681 Story.prototype.getConfirmText = function() {
-682    return gettext("You are about to delete a story by user {0}.", 
-683          this.creator.name);
-684 }
-685 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_TagHub_TagHub.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_TagHub_TagHub.js.html deleted file mode 100644 index 1c70a65a..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_TagHub_TagHub.js.html +++ /dev/null @@ -1,95 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the TagHub prototype
- 28  */
- 29 
- 30 /**
- 31  * @param {String} name
- 32  * @param {Story|Image} tagged
- 33  * @param {User} user
- 34  * @returns {TagHub}
- 35  */
- 36 TagHub.add = function(name, tagged, user) {
- 37    HopObject.confirmConstructor(this);
- 38    var hub = new TagHub;
- 39    var site = tagged.site || res.handlers.site;
- 40    var tag = site.getTags(tagged._prototype, Tags.ALL).get(name);
- 41    if (!tag) {
- 42       tag = Tag.add(name, tagged._prototype, site);
- 43    }
- 44    hub.tag = tag;
- 45    hub.tagged = tagged;
- 46    hub.user = user;
- 47    tagged.tags.add(hub);
- 48    return hub;   
- 49 }
- 50 
- 51 /**
- 52  * @name TagHub
- 53  * @constructor
- 54  * @property {Tag} tag
- 55  * @property {Number} tag_id
- 56  * @property {Story|Image} tagged
- 57  * @property {Number} tagged_id
- 58  * @property {String} tagged_type
- 59  * @property {User} user
- 60  * @extends HopObject
- 61  */
- 62 TagHub.prototype.constructor = function() {
- 63    HopObject.confirmConstructor(TagHub);
- 64    return this;
- 65 }
- 66 
- 67 /**
- 68  * 
- 69  * @param {String} name
- 70  * @returns {HopObject}
- 71  */
- 72 TagHub.prototype.getMacroHandler = function(name) {
- 73    switch (name.toLowerCase()) {
- 74       case "tagged":
- 75       case "story":
- 76       case "image":
- 77       return this.tagged;
- 78       break;
- 79    }
- 80 }
- 81 
- 82 /**
- 83  * @return {String}
- 84  */
- 85 TagHub.prototype.toString = function() {
- 86    return "Tag " + this.tag.name + " of " + this.tagged.toString();
- 87 }
- 88 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tag_Tag.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tag_Tag.js.html deleted file mode 100644 index 7b437d9e..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tag_Tag.js.html +++ /dev/null @@ -1,218 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Tag prototype.
- 28  */
- 29 
- 30 markgettext("Tag");
- 31 markgettext("tag");
- 32 
- 33 /**
- 34  * @constant
- 35  */
- 36 Tag.MOUNTPOINTS = {
- 37    Story: "tags",
- 38    Image: "galleries"
- 39 }
- 40 
- 41 /**
- 42  * @constant
- 43  */
- 44 Tag.DELIMITER = ", ";
- 45 
- 46 /**
- 47  * @param {String} name
- 48  * @param {Site} site
- 49  * @param {String} type
- 50  */
- 51 Tag.add = function(name, type, site) {
- 52    var tag = new Tag;
- 53    tag.name = name;
- 54    tag.type = type;
- 55    tag.site = site;
- 56    site.$tags.add(tag);
- 57    return tag;
- 58 }
- 59 
- 60 /**
- 61  * @name Tag
- 62  * @constructor
- 63  * @property {TagHub[]} _children
- 64  * @property {Images[]} images
- 65  * @property {String} name
- 66  * @property {Site} site
- 67  * @property {Story[]} stories
- 68  * @property {String} type
- 69  * @extends HopObject
- 70  */
- 71 Tag.prototype.constructor = function() {
- 72    HopObject.confirmConstructor(Tag);
- 73    return this;
- 74 }
- 75 
- 76 /**
- 77  * 
- 78  * @param {String} action
- 79  * @returns {Boolean}
- 80  */
- 81 Tag.prototype.getPermission = function(action) {
- 82    if (!res.handlers.site.getPermission("main")) {
- 83       return false;
- 84    }
- 85    switch (action) {
- 86       case ".":
- 87       case "main":
- 88       case "rss.xml":
- 89       return true;
- 90       case "edit":
- 91       case "delete":
- 92       case "rename":
- 93       return User.require(User.PRIVILEGED) ||
- 94             Membership.require(Membership.MANAGER);
- 95    }   
- 96    return false;
- 97 }
- 98 
- 99 Tag.prototype.main_action = function() {
-100    res.handlers.list = new jala.ListRenderer(this.getTagged());
-101    res.handlers.list.setPageSize(this.site.pageSize);
-102    res.data.title = gettext("Tag: {0}", this.name);
-103    res.data.body = this.renderSkinAsString("$Tag#main");
-104    res.handlers.site.renderSkin("Site#page");
-105    res.handlers.site.log();
-106    return;
-107 }
-108 
-109 Tag.prototype.rss_xml_action = function() {
-110    res.contentType = "text/xml";
-111    res.dependsOn(this.site.modified);
-112    res.digest();
-113    var tagHubs = this.getTagged().list(0, this.site.pageSize);
-114    var stories = [];
-115    for (var i in tagHubs) {
-116       stories.push(tagHubs[i].tagged);
-117    }
-118    res.write(this.site.getXml(stories));
-119    return;
-120 }
-121 
-122 Tag.prototype.rename_action = function() {
-123    var tag = this;
-124    if (req.data.name) {
-125       // Trim and remove troublesome characters  (like ../.. etc.)
-126       // We call getAccessName with a virgin HopObject to allow most names
-127       var name = this.getAccessName.call(new HopObject, File.getName(req.data.name));
-128       tag = this.site.getTags(this.type, Tags.ALL).get(name);
-129       if (!tag) {
-130          tag = Tag.add(name, this.site, this.type);
-131       }
-132       if (tag !== this) {
-133          this.forEach(function() { 
-134             this.tag_id = tag._id;
-135          });
-136          this.remove();
-137          res.commit();
-138       }
-139    }
-140    res.redirect(tag.href());
-141    return;
-142    
-143    // FIXME: Actually, the method should work like this but it caused a mess:
-144    if (req.data.name) {
-145       var name = this.getAccessName.call(new HopObject, File.getName(req.data.name));
-146       var tag = this.site.getTags(this.type, Tags.ALL).get(name);
-147       if (tag) {
-148          if (tag !== this) {
-149             // move tagged items to tag like above
-150          }
-151       } else {
-152          // rename tag like: this.name = name
-153       }
-154    }
-155 }
-156 
-157 Tag.prototype.delete_action = function() {
-158    var parent = this._parent;
-159    while (this.size() > 0) {
-160       this.get(0).remove();
-161    };
-162    this.remove();
-163    res.redirect(this.site[Tag.MOUNTPOINTS[this.type]].href());
-164 }
-165 
-166 /**
-167  * 
-168  * @param {String} action
-169  * @returns {String}
-170  */
-171 Tag.prototype.href = function(action) {
-172    res.push();
-173    res.write(this.site[Tag.MOUNTPOINTS[this.type]].href());
-174    res.write(encodeURIComponent(this.name));
-175    res.write("/");
-176    if (action) {
-177       res.write(java.net.URLEncoder.encode(action));
-178    }
-179    return res.pop();
-180 }
-181 
-182 /**
-183  * 
-184  * @param {Object} param
-185  * @param {String} type
-186  */
-187 Tag.prototype.permission_macro = function(param, type) {
-188    return this.getPermission(type);
-189 }
-190 
-191 /**
-192  * @returns {Story[]|Image[]}
-193  */
-194 Tag.prototype.getTagged = function() {
-195    return this[pluralize(this.type.toLowerCase())];
-196 }
-197 
-198 /**
-199  * @returns {String}
-200  */
-201 Tag.prototype.getTitle = function() {
-202    return this.name;
-203 }
-204 
-205 /**
-206  * @returns {String}
-207  */
-208 Tag.prototype.toString = function() {
-209    return this.type + " tag " + this.name + " of Site " + this.site.alias;
-210 }
-211 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tags_Tags.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tags_Tags.js.html deleted file mode 100644 index 11d1db40..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Tags_Tags.js.html +++ /dev/null @@ -1,250 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Tags prototype.
- 28  */
- 29 
- 30 markgettext("Tags");
- 31 markgettext("tags");
- 32 
- 33 /** @constant */
- 34 Tags.ALL = "all";
- 35 /** @constant */
- 36 Tags.OTHER = "other";
- 37 /** @constant */
- 38 Tags.ALPHABETICAL = "alphabetical";
- 39 
- 40 /**
- 41  * @name Tags
- 42  * @constructor
- 43  * @extends HopObject
- 44  */
- 45 
- 46 /**
- 47  * 
- 48  * @param {String} action
- 49  * @returns {Boolean}
- 50  */
- 51 Tags.prototype.getPermission = function(action) {
- 52    return res.handlers.site.getPermission("main");
- 53 }
- 54 
- 55 Tags.prototype.main_action = function() {
- 56    var action = this.getAction();
- 57    if (req.data.group) {
- 58       this.setGroup(req.data.group)
- 59       res.redirect(this.href(action));
- 60    }
- 61    if (req.data.page) {
- 62       this.setPage(req.data.page);
- 63       res.redirect(this.href(action));
- 64    }
- 65    res.data.title = this.getTitle();
- 66    res.data.body = this.renderSkinAsString("$Tags#" + req.action);
- 67    res.handlers.site.renderSkin("Site#page");
- 68    return;
- 69 }
- 70 
- 71 Tags.prototype.admin_action = function() {
- 72    return this.main_action();
- 73 }
- 74 
- 75 /**
- 76  * 
- 77  * @param {Number} id
- 78  * @returns {HopObject}
- 79  */
- 80 Tags.prototype.getChildElement = function(id) {
- 81    var child = this[id] || this.get(Tags.ALL).get(id);
- 82    return child;
- 83 }
- 84 
- 85 /**
- 86  * 
- 87  */
- 88 Tags.prototype.alphabet_macro = function() {
- 89    if (this.get(Tags.ALL).size() < 50) {
- 90       return;
- 91    }
- 92 
- 93    var self = this;
- 94    var collection = this.get(Tags.ALPHABETICAL);
- 95    var prefix = "?group=";
- 96    var group = this.getGroup();
- 97 
- 98    var add = function(text, id) {
- 99       if (group === id) {
-100          res.write(text);
-101       } else {
-102          html.link({href: self.href(self.getAction()) + prefix + id}, text);      
-103       }
-104       res.write(" ");
-105       return;
-106    };
-107 
-108    add("*", Tags.ALL);
-109    collection.forEach(function() {
-110       add(this._id, this._id);
-111    });
-112    if (this.get(Tags.OTHER).size() > 0) {
-113       add("?", Tags.OTHER);
-114    }
-115    return;
-116 }
-117 
-118 /**
-119  * 
-120  */
-121 Tags.prototype.pager_macro = function() {
-122    var page = this.getPage();
-123    var max = this.get(this.getGroup()).size();
-124    var size = this.getPageSize();
-125    var total = Math.ceil(max / size);
-126    if (total < 2) {
-127       return;
-128    }
-129    var prefix = "?page=";
-130    for (var i=1; i<=total; i+=1) {
-131       if (i == page) {
-132          res.write(i);
-133       } else {
-134          html.link({href: this.href(this.getAction()) + prefix + i}, i);      
-135       }
-136       res.write(" ");
-137    }
-138    return;
-139 }
-140 
-141 /**
-142  * 
-143  * @param {Object} param
-144  */
-145 Tags.prototype.header_macro = function(param) {
-146    var header = this.getHeader();
-147    for each (var title in header) {
-148       this.renderSkin("Tags#header", {title: title});
-149    }
-150    return;
-151 }
-152 
-153 /**
-154  * 
-155  */
-156 Tags.prototype.list_macro = function(param, skin) {
-157    var page = this.getPage();
-158    var size = param.limit ? Math.min(param.limit, 100) : this.getPageSize();
-159    var start = (page - 1) * size;
-160    var collection = this.get(this.getGroup()).list(start, size);
-161    // FIXME: ListRenderer should do this
-162    //var list = new jala.ListRenderer(collection);
-163    //list.render(skin || mgrlistitem);
-164    var index = start + 1;
-165    for each (var item in collection) {
-166       // FIXME: Is there a more elegant solution?
-167       if (item.constructor !== Tag) {
-168          item = item.get(0);
-169       }
-170       item.renderSkin(skin || "$Tag#listItem", {index: index});
-171       index += 1;
-172    }
-173    return;
-174 }
-175 
-176 /**
-177  * 
-178  * @param {String} group
-179  * @returns {TagHub[]}
-180  */
-181 Tags.prototype.get = function(group) {
-182    return this._parent.getTags(this._id, group || this.getGroup());
-183 }
-184 
-185 /**
-186  * @returns {String}
-187  */
-188 Tags.prototype.getGroup = function() {
-189    return decodeURIComponent(session.data[this.href("group")] || Tags.ALL);
-190 }
-191 
-192 /**
-193  * 
-194  * @param {String} group
-195  */
-196 Tags.prototype.setGroup = function(group) {
-197    session.data[this.href("group")] = encodeURIComponent(group);
-198    this.setPage(1);
-199    return;
-200 }
-201 
-202 /**
-203  * @returns {Number}
-204  */
-205 Tags.prototype.getPage = function() {
-206    return session.data[this.href("page")] || 1;
-207 }
-208 
-209 /**
-210  * 
-211  * @param {Number} page
-212  */
-213 Tags.prototype.setPage = function(page) {
-214    session.data[this.href("page")] = page;
-215    return;
-216 }
-217 
-218 /**
-219  * @returns {Number}
-220  */
-221 Tags.prototype.getPageSize = function() {
-222    return 25;
-223 }
-224 
-225 /**
-226  * @returns {String}
-227  */
-228 Tags.prototype.getAction = function() {
-229    return (req.action === "main" ? String.EMPTY : req.action);
-230 }
-231 
-232 /**
-233  * @returns {String[]}
-234  * @see Stories#getAdminHeader
-235  * @see Images#getAdminHeader
-236  */
-237 Tags.prototype.getHeader = function() {
-238    if (this._parent.getAdminHeader) {
-239       return this._parent.getAdminHeader(this._id) || [];
-240    }
-241    return [];
-242 }
-243 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_User_User.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_User_User.js.html deleted file mode 100644 index 167ec26f..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_User_User.js.html +++ /dev/null @@ -1,500 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $Author$
- 23 // $Date$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the User prototype.
- 28  */
- 29 
- 30 markgettext("User");
- 31 markgettext("user");
- 32 
- 33 this.handleMetadata("hash");
- 34 this.handleMetadata("salt");
- 35 this.handleMetadata("url");
- 36 
- 37 disableMacro(User, "hash");
- 38 disableMacro(User, "salt");
- 39 
- 40 /** @constant */
- 41 User.COOKIE = getProperty("userCookie", "antvilleUser");
- 42 
- 43 /** @constant */
- 44 User.HASHCOOKIE = getProperty("hashCookie", "antvilleHash");
- 45 
- 46 /**
- 47  * @param {Object} data
- 48  * @returns {User}
- 49  */
- 50 User.add = function(data) {
- 51    HopObject.confirmConstructor(this);
- 52    var user = new User;
- 53    var now = new Date;
- 54    user.map({
- 55       created: now,
- 56       email: data.email,
- 57       hash: data.hash,
- 58       name: data.name,
- 59       salt: session.data.token,
- 60       status: User.REGULAR,
- 61       url: data.url
- 62    });   
- 63    root.users.add(user);
- 64    return user;
- 65 }
- 66 
- 67 /**
- 68  * FIXME: Still needs a solution whether and how to remove a user’s sites
- 69  */
- 70 User.remove = function() {
- 71    return; // FIXME: Disabled until thoroughly tested
- 72    if (this.constructor === User) {
- 73       HopObject.remove.call(this.comments);
- 74       HopObject.remove.call(this.files);
- 75       HopObject.remove.call(this.images);
- 76       //HopObject.remove.call(this.sites);
- 77       HopObject.remove.call(this.stories);
- 78       this.deleteMetadata();
- 79       this.remove();
- 80    }
- 81    return;
- 82 }
- 83 
- 84 /**
- 85  * 
- 86  * @param {String} name
- 87  * @returns {User}
- 88  */
- 89 User.getByName = function(name) {
- 90    return root.users.get(name);
- 91 }
- 92 
- 93 /**
- 94  * @function
- 95  * @returns {String[]}
- 96  * @see defineConstants
- 97  */
- 98 User.getStatus = defineConstants(User, markgettext("Blocked"), 
- 99       markgettext("Regular"), markgettext("Trusted"), 
-100       markgettext("Privileged"));
-101 
-102 /**
-103  * @returns {String}
-104  */
-105 User.getSalt = function() {
-106    var salt = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 8);
-107    var random = java.security.SecureRandom.getInstance("SHA1PRNG");
-108    random.nextBytes(salt);
-109    return Packages.sun.misc.BASE64Encoder().encode(salt);
-110 }
-111 
-112 /**
-113  * 
-114  * @param {Object} data
-115  * @throws {Error}
-116  * @returns {User}
-117  */
-118 User.register = function(data) {
-119    if (!data.name) {
-120       throw Error(gettext("Please enter a username."));
-121    }
-122 
-123    data.name = data.name.trim();
-124    if (data.name.length > 30) {
-125       throw Error(gettext("Sorry, the username you entered is too long. Please choose a shorter one."));
-126    } else if (data.name !== stripTags(data.name) || NAMEPATTERN.test(data.name)) {
-127       throw Error(gettext("Please avoid special characters or HTML code in the name field."));
-128    } else if (data.name !== root.users.getAccessName(data.name)) {
-129       throw Error(gettext("Sorry, the user name you entered already exists. Please enter a different one."));
-130    }
-131 
-132    data.email && (data.email = data.email.trim());
-133    if (!validateEmail(data.email)) {
-134       throw Error(gettext("Please enter a valid e-mail address"));
-135    }
-136 
-137    if (User.isBlacklisted(data)) {
-138       throw Error("Sequere pecuniam ad meliora.");
-139    }
-140 
-141    // Create hash from password for JavaScript-disabled browsers
-142    if (!data.hash) {
-143       // Check if passwords match
-144       if (!data.password || !data.passwordConfirm) {
-145          throw Error(gettext("Could not verify your password. Please repeat your input."))
-146       } else if (data.password !== data.passwordConfirm) {
-147          throw Error(gettext("Unfortunately, your passwords did not match. Please repeat your input."));
-148       }
-149       data.hash = (data.password + session.data.token).md5();
-150    }
-151 
-152    var user = User.add(data);
-153    // grant trust and sysadmin-rights if there's no sysadmin 'til now
-154    if (root.admins.size() < 1) {
-155       user.status = User.PRIVILEGED;
-156    }
-157    session.login(user);
-158    return user;
-159 }
-160 
-161 /**
-162  * 
-163  * @param {Object} data
-164  * @returns {Boolean}
-165  */
-166 User.isBlacklisted = function(data) {
-167    var url;
-168    var name = encodeURIComponent(data.name);
-169    var email = encodeURIComponent(data.email);
-170    var ip = encodeURIComponent(data.http_remotehost);
-171 
-172    var key = getProperty("botscout.apikey");
-173    if (key) {
-174       url = ["http://botscout.com/test/?multi", "&key=", key, "&mail=", email, "&ip=", ip];
-175       try {
-176          mime = getURL(url.join(String.EMPTY));
-177          if (mime && mime.text && mime.text.startsWith("Y")) {
-178             return true;
-179          }
-180       } catch (ex) {
-181          app.log("Exception while trying to check blacklist URL " + url);
-182          app.log(ex);
-183       }
-184    }
-185    //return false;
-186 
-187    // We only get here if botscout.com does not already blacklist the ip or email address
-188    url = ["http://www.stopforumspam.com/api?f=json", "&email=", email];
-189    if (ip.match(/^(?:\d{1,3}\.){3}\d{1,3}$/)) {
-190       url.push("&ip=", ip);
-191    }
-192    try {
-193       mime = getURL(url.join(String.EMPTY));
-194    } catch (ex) {
-195       app.log("Exception while trying to check blacklist URL " + url);
-196       app.log(ex);
-197    }
-198    if (mime && mime.text) {
-199       var result = JSON.parse(mime.text);
-200       if (result.success) {
-201          return !!(result.email.appears || (result.ip && result.ip.appears));
-202       }
-203    }
-204    return false;
-205 }
-206 
-207 /**
-208  * 
-209  */
-210 User.autoLogin = function() {
-211    if (session.user) {
-212       return;
-213    }
-214    var name = req.cookies[User.COOKIE];
-215    var hash = req.cookies[User.HASHCOOKIE];
-216    if (!name || !hash) {
-217       return;
-218    }
-219    var user = User.getByName(name);
-220    if (!user) {
-221       return;
-222    }
-223    var ip = req.data.http_remotehost.clip(getProperty("cookieLevel", "4"),
-224          String.EMPTY, "\\.");
-225    if ((user.hash + ip).md5() !== hash) {
-226       return;
-227    }
-228    session.login(user);
-229    user.touch();
-230    res.message = gettext('Welcome to {0}, {1}. Have fun!',
-231          res.handlers.site.title, user.name);
-232    return;
-233 }
-234 
-235 /**
-236  * 
-237  * @param {Object} data
-238  * @returns {User}
-239  */
-240 User.login = function(data) {
-241    var user = User.getByName(data.name);
-242    if (!user) {
-243       throw Error(gettext("Unfortunately, your login failed. Maybe a typo?"));
-244    }
-245    var digest = data.digest;
-246    // Calculate digest for JavaScript-disabled browsers
-247    if (!digest) {
-248       app.logger.warn("Received clear text password from " + req.data.http_referer);
-249       digest = ((data.password + user.salt).md5() + session.data.token).md5();
-250    }
-251    // Check if login is correct
-252    if (digest !== user.getDigest(session.data.token)) {
-253       throw Error(gettext("Unfortunately, your login failed. Maybe a typo?"))
-254    }
-255    if (data.remember) {
-256       // Set long running cookies for automatic login
-257       res.setCookie(User.COOKIE, user.name, 365);
-258       var ip = req.data.http_remotehost.clip(getProperty("cookieLevel", "4"), String.EMPTY, "\\.");
-259       res.setCookie(User.HASHCOOKIE, (user.hash + ip).md5(), 365);
-260    }
-261    user.touch();
-262    session.login(user);
-263    return user;
-264 }
-265 
-266 /**
-267  * 
-268  */
-269 User.logout = function() {
-270   session.logout();
-271   res.unsetCookie(User.COOKIE);
-272   res.unsetCookie(User.HASHCOOKIE);
-273   Layout.sandbox(false);
-274   User.getLocation();
-275   return;
-276 }
-277 
-278 /**
-279  * 
-280  * @param {String} requiredStatus
-281  * @returns {Boolean}
-282  */
-283 User.require = function(requiredStatus) {
-284    var status = [User.BLOCKED, User.REGULAR, User.TRUSTED, User.PRIVILEGED];
-285    if (requiredStatus && session.user) {
-286       return status.indexOf(session.user.status) >= status.indexOf(requiredStatus);
-287    }
-288    return false;
-289 }
-290 
-291 /**
-292  * @returns {String}
-293  */
-294 User.getCurrentStatus = function() {
-295    if (session.user) {
-296       return session.user.status;
-297    }
-298    return null;
-299 }
-300 
-301 /**
-302  * @returns {Membership}
-303  */
-304 User.getMembership = function() {
-305    var membership;
-306    if (session.user) {
-307       membership = Membership.getByName(session.user.name);
-308    }
-309    HopObject.confirmConstructor(Membership);
-310    return membership || new Membership;
-311 }
-312 
-313 /**
-314  * 
-315  * @param {String} url
-316  */
-317 User.setLocation = function(url) {
-318    session.data.location = url || req.data.http_referer;
-319    //app.debug("Pushed location " + session.data.location);
-320    return;
-321 }
-322 
-323 /**
-324  * @returns {String}
-325  */
-326 User.getLocation = function() {
-327    var url = session.data.location;
-328    delete session.data.location;
-329    //app.debug("Popped location " + url);
-330    return url;
-331 }
-332 
-333 /**
-334  * Rename a user account.
-335  * @param {String} currentName The current name of the user account.
-336  * @param {String} newName The desired name of the user account.
-337  */
-338 User.rename = function(currentName, newName) {
-339    var user = User.getByName(currentName);
-340    if (user) {
-341       if (user.name === newName) {
-342          return newName;
-343       }
-344       user.name = root.users.getAccessName(newName);
-345       return user.name;
-346    }
-347    return currentName;
-348 }
-349 
-350 /**
-351  * A User object represents a login to Antville.
-352  * @name User
-353  * @constructor
-354  * @extends HopObject
-355  * @property {Membership[]} _children
-356  * @property {Date} created
-357  * @property {Comment[]} comments
-358  * @property {String} email
-359  * @property {File[]} files
-360  * @property {String} hash
-361  * @property {Image[]} images
-362  * @property {Membership[]} memberships
-363  * @property {Metadata} metadata
-364  * @property {Date} modified
-365  * @property {String} name 
-366  * @property {String} salt
-367  * @property {Site[]} sites
-368  * @property {Membership[]} subscriptions
-369  * @property {String} status
-370  * @property {Story[]} stories
-371  * @property {String} url 
-372  * @extends HopObject
-373  */
-374 User.prototype.constructor = function(data) {
-375    HopObject.confirmConstructor(User);
-376    return this;
-377 }
-378 
-379 /**
-380  * 
-381  */
-382 User.prototype.onLogout = function() { /* ... */ }
-383 
-384 /**
-385  * 
-386  * @param {String} action
-387  * @returns {Boolean}
-388  */
-389 User.prototype.getPermission = function(action) {
-390    return User.require(User.PRIVILEGED);
-391 }
-392 
-393 /**
-394  * 
-395  * @param {Object} data
-396  */
-397 User.prototype.update = function(data) {
-398    if (!data.digest && data.password) {
-399       data.digest = ((data.password + this.salt).md5() + 
-400             session.data.token).md5();
-401    }
-402    if (data.digest) {
-403       if (data.digest !== this.getDigest(session.data.token)) {
-404          throw Error(gettext("Oops, your old password is incorrect. Please re-enter it."));
-405       }
-406       if (!data.hash) {
-407          if (!data.newPassword || !data.newPasswordConfirm) {
-408             throw Error(gettext("Please specify a new password."));
-409          } else if (data.newPassword !== data.newPasswordConfirm) {
-410             throw Error(gettext("Unfortunately, your passwords did not match. Please repeat your input."));
-411          }
-412          data.hash = (data.newPassword + session.data.token).md5();
-413       }
-414       this.map({
-415          hash: data.hash,
-416          salt: session.data.token         
-417       });
-418    }
-419    if (!(data.email = validateEmail(data.email))) {
-420       throw Error(gettext("Please enter a valid e-mail address"));
-421    }
-422    if (data.url && !(data.url = validateUrl(data.url))) {
-423       throw Error(gettext("Please enter a valid URL"));
-424    }
-425    this.email = data.email;
-426    this.url = data.url;
-427    this.touch();
-428    return this;
-429 }
-430 
-431 /**
-432  * 
-433  */
-434 User.prototype.touch = function() {
-435    this.modified = new Date;
-436    return;
-437 }
-438 
-439 /**
-440  * 
-441  * @param {String} token
-442  * @returns {String}
-443  */
-444 User.prototype.getDigest = function(token) {
-445    token || (token = String.EMPTY);
-446    return (this.hash + token).md5();
-447 }
-448 
-449 /**
-450  * 
-451  * @param {String} name
-452  * @returns {Object}
-453  */
-454 User.prototype.getFormOptions = function(name) {
-455    switch (name) {
-456       case "status":
-457       return User.getStatus();
-458    }
-459 }
-460 
-461 /**
-462  * Enable <% user.email %> macro for privileged users only
-463  */
-464 User.prototype.email_macro = function() {
-465    if (User.require(User.PRIVILEGED)) {
-466       res.write(this.email);
-467    }
-468    return;
-469 }
-470 
-471 /**
-472  * 
-473  * @param {Object} param
-474  * @param {String} type
-475  */
-476 User.prototype.list_macro = function(param, type) {
-477    switch (type) {
-478       case "sites":
-479       var memberships = session.user.list();
-480       memberships.sort(function(a, b) {
-481          return b.site.modified - a.site.modified;
-482       });
-483       memberships.forEach(function(membership) {
-484          var site;
-485          if (site = membership.get("site")) {
-486             site.renderSkin("$Site#listItem");
-487          }
-488          return;
-489       });
-490    }
-491    return;
-492 }
-493 
\ No newline at end of file diff --git a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Vote_Vote.js.html b/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Vote_Vote.js.html deleted file mode 100644 index d08093a5..00000000 --- a/docs/symbols/src/_Users_tobi_Projects_helma_apps_antville_code_Vote_Vote.js.html +++ /dev/null @@ -1,70 +0,0 @@ -
  1 // The Antville Project
-  2 // http://code.google.com/p/antville
-  3 //
-  4 // Copyright 2007-2011 by Tobi Schäfer.
-  5 //
-  6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
-  7 // Matthias & Michael Platzer, Christoph Lincke.
-  8 //
-  9 // Licensed under the Apache License, Version 2.0 (the ``License'');
- 10 // you may not use this file except in compliance with the License.
- 11 // You may obtain a copy of the License at
- 12 //
- 13 //    http://www.apache.org/licenses/LICENSE-2.0
- 14 //
- 15 // Unless required by applicable law or agreed to in writing, software
- 16 // distributed under the License is distributed on an ``AS IS'' BASIS,
- 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 18 // See the License for the specific language governing permissions and
- 19 // limitations under the License.
- 20 //
- 21 // $Revision$
- 22 // $LastChangedBy$
- 23 // $LastChangedDate$
- 24 // $URL$
- 25 
- 26 /**
- 27  * @fileOverview Defines the Vote prototype.
- 28  */
- 29 
- 30 markgettext("Vote");
- 31 markgettext("vote");
- 32 
- 33 /**
- 34  * @param {Choice} choice
- 35  * @returns {Vote}
- 36  */
- 37 Vote.add = function(choice, poll) {
- 38    HopObject.confirmConstructor(Vote);
- 39    var vote = new Vote;
- 40    vote.choice = choice;
- 41    vote.creator = session.user;
- 42    vote.creator_name = session.user.name;
- 43    vote.created = vote.modified = new Date;
- 44    poll.votes.add(vote);
- 45 	return vote;
- 46 }
- 47 
- 48 /**
- 49  * @name Vote
- 50  * @constructor
- 51  * @property {Choice} choice
- 52  * @property {Date} created
- 53  * @property {User} creator
- 54  * @property {String} creator_name
- 55  * @property {Date} modified
- 56  * @property {Poll} poll
- 57  * @extends HopObject
- 58  */
- 59 Vote.prototype.constructor = function(choice) {
- 60    HopObject.confirmConstructor(this);
- 61    return this;
- 62 }
- 63 
\ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..2fdef15f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.console = plain + +antville.repo.url = https://github.com/antville/antville.git +helma.download.url = https://github.com/antville/helma/releases/download/v20200614/helma-20200614.tgz diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..9ab0a835 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..5bacfa2a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..f9553162 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/i18n/antville.pot b/i18n/antville.pot index 30e2544c..1bd6b34f 100644 --- a/i18n/antville.pot +++ b/i18n/antville.pot @@ -2,7 +2,7 @@ # The Antville Project # http://code.google.com/p/antville # -# Copyright 2001-2015 by the Workers of Antville. +# Copyright 2001-2020 by the Workers of Antville. # # Licensed under the Apache License, Version 2.0 (the ``License'' # you may not use this file except in compliance with the License. @@ -20,2899 +20,3044 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Antville-0.0\n" +"Project-Id-Version: Antville-0.0.abcdef\n" "Report-Msgid-Bugs-To: mail@antville.org\n" -"POT-Creation-Date: 2015-08-10 16:25+0200\n" -"PO-Revision-Date: 2015-08-10 16:25+0200\n" +"POT-Creation-Date: 2020-06-14 16:31+0200\n" +"PO-Revision-Date: 2020-06-14 16:31+0200\n" "Language-Team: The Antville People \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:948 +#: Global/Global.js:987 #, java-format msgid "({0} character)" msgid_plural "({0} characters)" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:802 -msgid "A Blogger export file (.xml) will be created and available for download from here within 24 hours." -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:124 +#: Members/Members.js:143 msgid "A confirmation mail was sent to your e-mail address." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:7 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:62 +#: Membership/$Membership.skin:62 msgid "A generic disclaimer will be automatically appended to your message." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:101 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:30 +#: Root/Site.skin:32 +#: Api/Api.js:101 msgid "API" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Abandoned" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:268 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:154 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:15 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:15 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:20 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:98 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:213 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:153 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:33 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:203 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:8 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:46 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:76 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:16 -#: /Users/tobi/Projects/antville/current/code/User/User.js:22 +#: Members/$Members.skin:153 +msgid "Accept" +msgstr "" + +#: Images/$Images.skin:20 +#: Membership/Membership.skin:8 +#: User/User.js:22 +#: User/$User.skin:148 +#: Root/$Root.skin:46 +#: Admin/$Admin.skin:291 +#: Admin/$Admin.skin:175 +#: Skins/$Skins.skin:76 +#: Files/$Files.skin:16 +#: Comments/$Comments.skin:15 +#: Stories/$Stories.skin:16 +#: Members/$Members.skin:165 +#: Members/$Members.skin:48 +#: Members/$Members.skin:225 +#: Members/$Members.skin:92 +#: Polls/$Polls.skin:15 msgid "Account" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:60 +#: User/$User.skin:61 msgid "Account Image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:9 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:556 +#: User/$User.skin:190 +msgid "Account is being deleted" +msgstr "" + +#: Admin/Admin.js:598 +#: Admin/$Admin.skin:9 msgid "Accounts" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:8 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:496 +#: Admin/Admin.js:539 +#: Admin/$Admin.skin:8 msgid "Activity" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:100 +#: Poll/$Poll.skin:100 msgid "Add Choice" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:324 +#: Story/Story.js:329 msgid "Add Comment" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:69 +#: Files/Files.js:69 msgid "Add File" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:90 +#: Images/Images.js:90 msgid "Add Image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:314 +#: Members/Members.js:352 msgid "Add Member" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:78 +#: Polls/Polls.js:78 msgid "Add Poll" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:167 +#: Root/Root.js:181 msgid "Add Site" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:110 +#: Skins/Skins.js:110 msgid "Add Skin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:25 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:94 +#: Site/Site.skin:25 +#: Stories/Stories.js:94 msgid "Add Story" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:74 +#: Poll/$Poll.skin:74 msgid "Add Your Vote" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:327 +#: Comment/Comment.js:331 msgid "Admin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:231 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:121 +#: Site/$Site.skin:279 +#: User/$User.skin:110 msgid "Administration" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:107 +#: Site/$Site.skin:131 msgid "Advanced" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:7 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:6 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:6 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:52 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:6 +#: Images/$Images.skin:7 +#: Skins/$Skins.skin:52 +#: Files/$Files.skin:6 +#: Comments/$Comments.skin:7 +#: Stories/$Stories.skin:6 +#: Members/$Members.skin:6 +#: Polls/$Polls.skin:6 msgid "All" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:58 +#: Polls/Polls.js:58 msgid "All Polls" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:135 +#: Skins/Skins.js:135 msgid "All Skins" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:267 +#: Site/$Site.skin:315 +#: User/$User.skin:178 msgid "All of this will be deleted irreversibly." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:62 +#: Root/$Root.skin:62 msgid "An error occurred while processing your request." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:3 +#: Root/Site.skin:3 #, java-format msgid "Antville is an open source project aimed at the development of a simple site hosting system with many advanced features." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:37 +#: Api/$Api.skin:37 msgid "Antville itself provides a default callback URL invoking the basic ping method of the weblogs.com API." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:3 +#: Api/$Api.skin:3 msgid "Antville supports the following application programming interfaces:" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:72 +#: Site/$Site.skin:88 msgid "Archive" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1049 +#: Site/$Site.skin:1180 msgid "Are you sure you want to add this URL to the referrer filter? Edit it below to filter a pattern only." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:268 +#: Site/$Site.skin:316 +#: User/$User.skin:179 msgid "Are you sure you want to proceed?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:36 +#: Tags/$Tags.skin:28 msgid "Are you sure you want to remove this tag?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:50 +#: Skins/$Skins.skin:50 msgid "Basic" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:79 +#: Skins/Skins.js:79 msgid "Basic Skins" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:37 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:46 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:144 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:133 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:154 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1183 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1193 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:162 +#: Membership/$Membership.skin:106 +#: Membership/$Membership.skin:134 +#: Membership/$Membership.skin:155 +#: Membership/$Membership.skin:145 +#: Site/$Site.skin:1303 +#: Site/$Site.skin:1313 +#: User/$User.skin:206 +#: HopObject/$HopObject.skin:37 +#: HopObject/$HopObject.skin:46 msgid "Best regards." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:355 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:373 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Site/Site.js:53 +#: User/User.js:213 +#: Admin/$Admin.skin:417 +#: Admin/$Admin.skin:396 msgid "Blocked" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:152 +#: Site/$Site.skin:185 msgid "Bookmarklet" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Both" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:39 -msgid "Browse" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:117 +#: Root/$Root.skin:119 msgid "Build" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:100 +#: Root/$Root.skin:102 msgid "Cache" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:13 -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:123 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:140 +#: Site/$Site.skin:171 +#: Api/Api.js:123 +#: Api/$Api.skin:13 msgid "Callback URL" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:23 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:106 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:70 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:64 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:22 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:88 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:106 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:40 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:134 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:165 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:64 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:200 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:183 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:18 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:77 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:120 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:279 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1172 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1151 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:173 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:69 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:32 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:83 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:103 -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:13 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:9 +#: Membership/$Membership.skin:18 +#: Membership/$Membership.skin:78 +#: Site/$Site.skin:1292 +#: Site/$Site.skin:327 +#: Site/$Site.skin:1269 +#: Site/$Site.skin:212 +#: User/$User.skin:104 +#: User/$User.skin:146 +#: Poll/$Poll.skin:120 +#: File/$File.skin:64 +#: Root/$Root.skin:33 +#: HopObject/$HopObject.skin:22 +#: Image/$Image.skin:90 +#: Story/Story.skin:83 +#: Admin/$Admin.skin:139 +#: Skin/$Skin.skin:72 +#: Skin/$Skin.skin:32 +#: Layout/$Layout.skin:115 +#: Layout/$Layout.skin:89 +#: Comment/Comment.skin:70 +#: Members/$Members.skin:212 +#: Members/$Members.skin:195 +#: Members/$Members.skin:177 +#: Members/$Members.skin:79 +#: Members/$Members.skin:125 +#: Members/$Members.skin:155 +#: ../compat/Site/$Site.skin:10 +#: ../compat/Layout/$Layout.skin:13 msgid "Cancel" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:263 +#: Story/Story.js:268 #, java-format msgid "Cannot parse timestamp {0} as a date." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:22 +#: Choice/Choice.js:22 msgid "Choice" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:95 +#: Poll/$Poll.skin:95 msgid "Choices" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Claustra/Claustra.js:78 +#: Claustra/Claustra.js:78 msgid "Claustra" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:16 +#: HopObject/$HopObject.skin:16 msgid "Click “Cancel” now if you are not really sure you want to proceed." msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:70 +#: ../compat/Story/Story.js:70 msgid "Close" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:8 +#: Site/Site.js:60 +#: Stories/$Stories.skin:8 msgid "Closed" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:107 +#: Stories/Stories.js:107 msgid "Closed Stories" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:22 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:62 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:159 +#: HopObject/HopObject.js:173 +#: Comment/Comment.js:22 +#: Comment/Comment.skin:62 msgid "Comment" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:31 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:61 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:21 +#: Site/Site.skin:21 +#: Site/$Site.skin:75 +#: Comments/Comments.js:31 msgid "Comments" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:43 +#: Comments/Comments.js:43 #, java-format msgid "Comments by {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:67 +#: Story/Story.skin:67 #, java-format msgid "Comments of the story are {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:31 +#: Skin/$Skin.skin:31 msgid "Compare" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:266 +#: Skin/Skin.js:266 #, java-format msgid "Compare {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:180 +#: HopObject/HopObject.js:201 msgid "Confirm Deletion" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:254 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:209 +#: Skin/Skin.js:209 +#: Layout/Layout.js:255 msgid "Confirm Reset" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:766 +#: Site/Site.js:732 msgid "Confirm Unsubscribe" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:32 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:39 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:46 -#, java-format -msgid "Connect with {0}" -msgstr "" - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:101 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:172 -#, java-format -msgid "Connecting with {0} failed. {1} Please try again." -msgstr "" - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:94 -msgid "Connections" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:22 +#: Site/Site.skin:22 +#: Root/Site.skin:28 msgid "Contact" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:41 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:208 +#: Membership/Membership.js:216 #, java-format msgid "Contact {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:14 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:15 +#: Comments/$Comments.skin:14 +#: Stories/$Stories.skin:15 msgid "Content" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:219 +#: Membership/Membership.js:228 #, java-format msgid "Content of Member {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 +#: Site/Site.js:88 msgid "Contributor" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:8 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:237 +#: Members/$Members.skin:8 +#: Members/Members.js:275 msgid "Contributors" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:12 +#: ../compat/Layout/$Layout.skin:12 msgid "Convert" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.convert.js:42 +#: ../compat/Layout/Layout.convert.js:42 msgid "Convert Layout" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:212 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:233 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:239 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:244 -#, java-format -msgid "Could not connect with Facebook. ({0})" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/File/File.js:268 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:264 +#: File/File.js:265 +#: Image/Image.js:286 msgid "Could not fetch the file from the given URL." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:556 +#: Image/Image.js:606 msgid "Could not remove the image file from disk." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:512 +#: Image/Image.js:562 msgid "Could not resize the image." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:538 +#: Image/Image.js:588 msgid "Could not save the image file on disk." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:129 +#: User/User.js:258 msgid "Could not verify your password. Please repeat your input." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:31 +#: Root/$Root.skin:31 msgid "Create" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:6 +#: Root/Site.skin:6 msgid "Create a site. It only takes a few clicks." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:525 +#: Global/Global.js:552 msgid "Create missing file" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:572 +#: Global/Global.js:599 msgid "Create missing image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:201 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:156 +#: User/$User.skin:159 +#: Admin/$Admin.skin:222 +#: Admin/$Admin.skin:177 msgid "Created" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:3 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:17 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:48 +#: Site/$Site.skin:18 +#: HopObject/$HopObject.skin:3 #, java-format msgid "Created by {0} on {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:12 +#: Site/Site.skin:12 #, java-format msgid "Created by {0} on {1}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:363 +#: User/$User.skin:183 +#, java-format +msgid "Created on {0}" +msgstr "" + +#: Site/$Site.skin:372 #, java-format msgid "Created {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:67 -msgid "Currently, it is not possible to remove an account. Please accept our humble apologies." +#: Root/Site.skin:27 +#: Members/$Members.skin:84 +msgid "Data Privacy Statement" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:28 +#: Admin/$Admin.skin:287 +msgid "Date" +msgstr "" + +#: Api/$Api.skin:28 msgid "Date string in Unix timestamp format" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:63 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:87 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:119 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:172 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:82 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:102 +#: Site/$Site.skin:211 +#: User/$User.skin:103 +#: Poll/$Poll.skin:119 +#: File/$File.skin:63 +#: Image/$Image.skin:89 +#: Story/Story.skin:82 msgid "Delete" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 +#: Site/Site.js:53 +#: User/User.js:213 +#: Admin/$Admin.skin:402 +#: Admin/$Admin.skin:414 msgid "Deleted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:10 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:47 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:62 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:43 +#: User/$User.skin:192 +#, java-format +msgid "Deleted on {0}" +msgstr "" + +#: Site/$Site.skin:53 +#: File/$File.skin:47 +#: Image/$Image.skin:64 +#: Claustra/$Claustra.skin:10 msgid "Description" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:72 +#: Root/$Root.skin:74 msgid "Details" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:31 +#: Root/Site.skin:33 msgid "Development" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:19 +#: Images/$Images.skin:19 msgid "Dimensions" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:981 +#: Site/$Site.skin:1110 msgid "Disable filter" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Disabled" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:30 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:37 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:44 -#, java-format -msgid "Disconnect from {0}" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:41 +#: Admin/$Admin.skin:41 msgid "Disk Quota" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:160 +#: Site/$Site.skin:195 msgid "Disk Space" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:173 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:219 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:127 +#: Admin/$Admin.skin:194 +#: Admin/$Admin.skin:240 +#: Admin/$Admin.skin:148 msgid "Display" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Recaptcha/Recaptcha.js:32 +#: Global/Captcha.js:44 msgid "Do Androids dream of electric sheep?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1145 -#, java-format -msgid "Download the file {0} or klick “Start” to create a new one." -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 msgid "Drag to Bookmarks Bar" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:20 -msgid "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore." +#: ../compat/Members/Members.js:20 +msgid "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:159 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:67 +#: User/$User.skin:68 +#: Members/$Members.skin:171 msgid "E-mail" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:16 +#: Root/$Root.skin:16 #, java-format msgid "E.g. if you enter {0} here your site will be reachable via {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:15 +#: Api/$Api.skin:15 msgid "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL – on a server and in a programming language of their choice." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:15 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:29 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:67 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:24 +#: Poll/$Poll.skin:29 +#: Image/Image.skin:15 +#: Story/Story.skin:24 +#: Skin/$Skin.skin:70 msgid "Edit" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:174 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:48 +#: Comment/Comment.js:176 +#: Comment/Comment.skin:48 msgid "Edit Comment" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:217 +#: File/File.js:214 msgid "Edit File" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:210 +#: Image/Image.js:212 msgid "Edit Image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:170 +#: Poll/Poll.js:170 msgid "Edit Poll" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:234 +#: Story/Story.js:239 msgid "Edit Story" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:982 +#: Site/$Site.skin:1111 msgid "Edit the filter in the site settings." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:169 +#: Skin/Skin.js:169 #, java-format msgid "Edit {0}.{1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:11 +#: Claustra/$Claustra.skin:11 msgid "Enabled" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:134 +#: Site/$Site.skin:164 #, java-format msgid "Enter one filter {0}pattern{1} per line to be applied on every URL in the referrer and backlink lists." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:149 +#: Members/$Members.skin:161 msgid "Enter your username and the e-mail address you have used when you registered. You will then receive a confirmation e-mail containing further instructions." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/$Comment.skin:20 +#: Comment/$Comment.skin:20 #, java-format msgid "Erase all comments of user {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:93 +#: Root/$Root.skin:95 msgid "Error Ratio" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:88 +#: Root/$Root.skin:90 msgid "Errors" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:8 +#: Site/$Site.skin:1269 +#: Site/$Site.skin:26 +#: User/$User.skin:52 +#: User/$User.skin:146 +#: Layout/$Layout.skin:10 msgid "Export" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1143 +#: User/$User.skin:140 +msgid "Export Account Data" +msgstr "" + +#: Site/$Site.skin:1263 msgid "Export Site Data" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:30 -#: /Users/tobi/Projects/antville/current/code/File/File.js:22 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:160 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:45 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1162 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:82 +#: Site/$Site.skin:1282 +#: File/File.js:22 +#: File/$File.skin:30 +#: HopObject/HopObject.js:174 +#: Image/$Image.skin:47 +#: Story/$Story.skin:96 msgid "File" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:258 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:254 +#: File/File.js:255 +#: Image/Image.js:256 msgid "File size is exceeding the upload limit." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:22 -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:79 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:28 +#: Site/Site.skin:28 +#: Files/Files.js:22 +#: Files/Files.js:79 msgid "Files" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:89 +#: Files/Files.js:89 #, java-format msgid "Files by {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:185 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:231 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:138 +#: Admin/$Admin.skin:206 +#: Admin/$Admin.skin:252 +#: Admin/$Admin.skin:159 msgid "Filter" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:198 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:277 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:7 +#: Site/$Site.skin:325 +#: Members/$Members.skin:210 +#: ../compat/Site/$Site.skin:8 msgid "Find" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:289 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:722 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1020 +#: Site/Site.js:688 +#: Site/Site.js:968 +#: Members/Members.js:327 #, java-format msgid "Found more than {0} results. Please try a more specific query." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:20 +#: Site/Site.skin:20 msgid "Galleries" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:22 +#: Admin/$Admin.skin:22 msgid "General" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:183 +#: Members/Members.js:221 #, java-format msgid "Good bye, {0}! Looking forward to seeing you again!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:95 +#: Admin/$Admin.skin:128 msgid "Grace Period" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:214 +#: Story/$Story.skin:229 msgid "HTML" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:17 +#: User/$User.skin:17 msgid "Have a lot of fun!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:122 +#: Membership/$Membership.skin:123 msgid "Have fun!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:280 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:29 +#: Root/Site.skin:31 +#: Root/Root.js:295 msgid "Health" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:32 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:41 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:137 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:126 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:148 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1177 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1187 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:152 +#: Membership/$Membership.skin:127 +#: Membership/$Membership.skin:149 +#: Membership/$Membership.skin:138 +#: Site/$Site.skin:1297 +#: Site/$Site.skin:1307 +#: User/$User.skin:196 +#: HopObject/$HopObject.skin:32 +#: HopObject/$HopObject.skin:41 #, java-format msgid "Hello {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:119 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:47 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:176 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:91 -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:68 +#: Root/$Root.skin:123 +msgid "Helma Version" +msgstr "" + +#: User/$User.skin:92 +#: Members/$Members.skin:188 +#: Members/$Members.skin:62 +#: Members/$Members.skin:113 +#: ../compat/Story/Story.js:68 msgid "Hide" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:100 +#: Members/$Members.skin:141 +#, java-format +msgid "I understand and accept the {0}data privacy statement{1}" +msgstr "" + +#: Members/$Members.skin:133 +#, java-format +msgid "I understand and accept the {0}terms and conditions{1}" +msgstr "" + +#: Membership/$Membership.skin:101 msgid "If the user did not include contact information in the message itself, you can send your reply via the user’s contact form [2]." msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:39 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:54 +#: File/$File.skin:39 +#: Image/$Image.skin:56 msgid "If you do not specify a name Antville will create one based on the filename." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:77 -msgid "If you enter a URL here your user name will appear as link next to your posted items." +#: User/$User.skin:78 +msgid "If you enter a URL here your username will appear as link next to your posted items." msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:21 +#: ../compat/Members/Members.js:21 #, java-format msgid "If you should really have forgotten your password, you can use the password reset option." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:77 +#: Global/$Global.skin:59 msgid "If you think you have received this e-mail in error please contact the maintainer of the site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:111 +#: Site/$Site.skin:136 msgid "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:161 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:22 +#: HopObject/HopObject.js:175 +#: Image/Image.js:24 msgid "Image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:110 +#: Site/$Site.skin:135 msgid "Image Dimension Limits" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:187 +#: Image/Image.js:189 #, java-format msgid "Image: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:22 -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:64 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:27 +#: Images/Images.js:22 +#: Images/Images.js:64 +#: Site/Site.skin:27 +#: Layout/$Layout.skin:8 msgid "Images" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:105 +#: Images/Images.js:105 #, java-format msgid "Images by {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:104 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:7 +#: Layout/$Layout.skin:113 +#: Layout/$Layout.skin:9 msgid "Import" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:311 +#: Layout/Layout.js:312 msgid "Import Layout" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1155 +#: Site/$Site.skin:1275 msgid "Import Site Data" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:54 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:78 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:242 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:71 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:132 +#: Site/$Site.skin:290 +#: User/$User.skin:121 +#: Poll/$Poll.skin:105 +#: File/$File.skin:54 +#: Image/$Image.skin:80 +#: Story/Story.skin:71 msgid "Information" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:68 +#: Admin/$Admin.skin:101 msgid "Interval" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:66 +#: Skins/$Skins.skin:66 msgid "JavaScript" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:11 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:507 +#: Admin/Admin.js:550 +#: Admin/$Admin.skin:11 msgid "Jobs" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:83 +#: Site/$Site.skin:101 msgid "Language" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:248 +#: Admin/$Admin.skin:269 msgid "Last Login" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:45 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:35 +#: User/$User.skin:35 +#: Root/$Root.skin:45 msgid "Last Update" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:56 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:20 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:50 +#: Site/$Site.skin:21 +#: HopObject/$HopObject.skin:6 +#: Comment/Comment.skin:56 #, java-format msgid "Last modified by {0} on {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:364 +#: User/$User.skin:185 +#, java-format +msgid "Last modified on {0}" +msgstr "" + +#: Site/$Site.skin:373 #, java-format msgid "Last modified {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:22 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:189 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:34 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:32 -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.js:33 -#: /Users/tobi/Projects/antville/current/compat/Site/Site.js:92 +#: Site/Site.skin:32 +#: Root/Site.skin:36 +#: Layout/Layout.js:22 +#: Layout/Layout.js:189 +#: Layout/Layout.js:245 +#: ../compat/Site/Site.js:92 +#: ../compat/Layout/Layout.js:33 msgid "Layout" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:111 +#: Images/Images.js:111 msgid "Layout Images" msgstr "" -#: /Users/tobi/Projects/antville/current/code/LogEntry/LogEntry.js:22 +#: LogEntry/LogEntry.js:22 msgid "Log Entry" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:3 +#: Membership/Membership.skin:3 #, java-format msgid "Logged in as {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:175 +#: Members/Members.js:213 msgid "Login" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:62 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:18 +#: Membership/Membership.skin:18 +#: Members/$Members.skin:77 msgid "Login // verb" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:13 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:16 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:19 -#, java-format -msgid "Login with {0}" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:7 +#: Membership/Membership.skin:7 msgid "Logout // verb" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 +#: Site/Site.js:88 msgid "Manager" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:9 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:228 +#: Members/$Members.skin:9 +#: Members/Members.js:266 msgid "Managers" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:215 +#: Story/$Story.skin:230 msgid "Markdown" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:168 +#: Membership/Membership.js:168 #, java-format msgid "Member {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:22 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:72 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:33 +#: Site/Site.skin:33 +#: Members/Members.js:22 +#: Members/Members.js:80 msgid "Members" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:162 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:22 +#: Membership/Membership.js:22 +#: HopObject/HopObject.js:176 msgid "Membership" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:102 +#: Root/$Root.skin:104 msgid "Memory" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:12 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:67 +#: Membership/$Membership.skin:67 msgid "Message" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:266 +#: Admin/$Admin.skin:288 msgid "Method" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:79 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:27 +#: Site/$Site.skin:33 +#: Admin/$Admin.skin:224 +#: Admin/$Admin.skin:112 msgid "Mode" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:202 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:16 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:16 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:21 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:16 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:77 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:51 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:17 +#: Images/$Images.skin:21 +#: Admin/$Admin.skin:223 +#: Skins/$Skins.skin:51 +#: Skins/$Skins.skin:77 +#: Files/$Files.skin:17 +#: Comments/$Comments.skin:16 +#: Stories/$Stories.skin:17 +#: Polls/$Polls.skin:16 msgid "Modified" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:119 +#: Skins/Skins.js:119 msgid "Modified Skins" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:142 +#: Skins/Skins.js:142 msgid "Modified Skins (Safe Mode)" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:78 +#: Skin/$Skin.skin:81 msgid "Modified skin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:200 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:246 -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:9 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:38 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:13 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:53 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:192 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:75 -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:15 +#: Tags/$Tags.skin:17 +#: File/$File.skin:38 +#: Root/$Root.skin:6 +#: Image/$Image.skin:55 +#: Admin/$Admin.skin:290 +#: Admin/$Admin.skin:221 +#: Admin/$Admin.skin:245 +#: Admin/$Admin.skin:267 +#: Skins/$Skins.skin:75 +#: Files/$Files.skin:14 +#: Members/$Members.skin:204 +#: Members/$Members.skin:15 +#: Claustra/$Claustra.skin:9 msgid "Name" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:30 +#: Api/$Api.skin:30 msgid "Name of the account that triggered the event" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:62 +#: Skins/$Skins.skin:62 msgid "Navigation" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:72 +#: ../compat/Global/aspects.js:72 msgid "Next page" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:221 +#: Skin/Skin.js:221 msgid "No differences were found." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:90 +#: Site/Site.js:87 msgid "Nobody" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 +#: Admin/Admin.js:94 +#: Admin/Admin.js:115 msgid "None" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:37 +#: Members/$Members.skin:52 msgid "Not registered yet?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 msgid "Note" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:251 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:142 +#: Site/$Site.skin:299 +#: User/$User.skin:131 msgid "Notes" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:33 +#: Admin/$Admin.skin:33 msgid "Notification E-Mail" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:87 +#: Admin/$Admin.skin:120 msgid "Notification Period" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:25 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:99 +#: Site/$Site.skin:121 +#: Admin/$Admin.skin:25 msgid "Notifications" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:12 +#: Root/Site.skin:12 msgid "Number of public sites" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:24 +#: Api/$Api.skin:24 msgid "Numeric identifier of the resource" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:14 +#: User/$User.skin:14 #, java-format msgid "Of course, you can now also start to add stories, upload some images or files, create your first poll or get a glimpse of Antville’s wonderful customization possibilities; just take a look at the layout section where you can modify the appearance of your site according to your needs." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Open" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:61 +#: Story/Story.skin:61 msgid "Options" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:80 +#: Skin/$Skin.skin:83 msgid "Original skin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 +#: Site/Site.js:88 msgid "Owner" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:10 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:219 +#: Members/$Members.skin:10 +#: Members/Members.js:257 msgid "Owners" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:71 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:98 +#: Membership/$Membership.skin:99 +#: Global/$Global.skin:53 msgid "PLEASE DO NOT REPLY TO THE SENDER ADDRESS OF THIS MESSAGE." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:97 +#: Archive/Archive.js:97 #, java-format msgid "Page {0} of {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:51 +#: Site/$Site.skin:63 msgid "Pagination" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:114 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:42 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:86 +#: User/$User.skin:87 +#: Members/$Members.skin:57 +#: Members/$Members.skin:108 msgid "Password" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:51 +#: Members/$Members.skin:66 msgid "Password forgotten?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:76 +#: User/$User.skin:77 msgid "Personal URL" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:116 +#: Site/$Site.skin:142 msgid "Pixels" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:125 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:93 -#: /Users/tobi/Projects/antville/current/code/User/User.js:112 +#: Members/Members.js:368 +msgid "Please accept the data privacy statement." +msgstr "" + +#: Members/Members.js:364 +msgid "Please accept the terms and conditions." +msgstr "" + +#: Site/Site.js:122 +#: User/User.js:241 +#: Skins/Skins.js:93 msgid "Please avoid special characters or HTML code in the name field." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:13 +#: HopObject/$HopObject.skin:13 msgid "Please be aware of the fact that there is no “undo”, so if you click “Proceed” below the changes will be applied irreversibly." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:91 +#: Skins/Skins.js:91 msgid "Please choose a prototype and enter a skin name" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:180 +#: Membership/Membership.js:180 msgid "Please choose a role for this member." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:113 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:122 +#: HopObject/HopObject.js:120 +#: HopObject/HopObject.js:137 msgid "Please contact an administrator for further information." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1199 +#: Site/$Site.skin:1319 msgid "Please enable JavaScript in your browser for improved functionality." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:114 +#: Site/Site.js:111 msgid "Please enter a name for your new site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:27 +#: Tags/$Tags.skin:23 msgid "Please enter a new name for this tag" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:137 +#: Members/Members.js:156 msgid "Please enter a new password." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:283 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1007 +#: Site/Site.js:955 +#: Members/Members.js:321 msgid "Please enter a query in the search form." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:111 -msgid "Please enter a user name and e-mail address." +#: Members/Members.js:130 +msgid "Please enter a username and e-mail address." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:105 +#: User/User.js:234 msgid "Please enter a username." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:429 +#: User/User.js:678 msgid "Please enter a valid URL" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:119 -#: /Users/tobi/Projects/antville/current/code/User/User.js:426 +#: User/User.js:248 +#: User/User.js:674 msgid "Please enter a valid e-mail address" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:251 +#: Story/Story.js:256 msgid "Please enter at least something into the “title” or “text” field." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:203 +#: Comment/Comment.js:202 msgid "Please enter something into the comment field." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:27 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:193 +#: Membership/Membership.js:193 msgid "Please enter the message text." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:56 +#: Layout/$Layout.skin:37 msgid "Please enter the name of the new setting:" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:4 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:59 +#: Membership/$Membership.skin:59 msgid "Please enter your message to the user below." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:196 +#: Poll/Poll.js:196 msgid "Please fill out the whole form to create a valid poll." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:133 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:307 +#: HopObject/HopObject.js:150 +#: Story/Story.js:312 msgid "Please login first." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 +#: Root/$Root.skin:6 msgid "Please note that you cannot change the name after the site was created." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:276 +#: Layout/Layout.js:277 msgid "Please upload a zipped layout archive" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:163 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:22 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:86 +#: Poll/Poll.js:22 +#: HopObject/HopObject.js:177 +#: Story/$Story.skin:101 msgid "Poll" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:226 +#: Poll/Poll.js:226 #, java-format msgid "Poll Results: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:133 +#: Poll/Poll.js:133 #, java-format msgid "Poll: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:22 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:29 +#: Site/Site.skin:29 +#: Polls/Polls.js:22 msgid "Polls" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:89 +#: Polls/Polls.js:89 #, java-format msgid "Polls by {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 #, java-format msgid "Post to {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:15 +#: Story/Story.skin:15 #, java-format msgid "Posted by {0} at {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:53 -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:4 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:24 +#: Poll/$Poll.skin:24 +#: Image/Image.skin:4 +#: Comment/Comment.skin:53 #, java-format msgid "Posted by {0} on {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:14 -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:139 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:19 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:90 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:15 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:25 +#: Poll/$Poll.skin:15 +#: File/$File.skin:14 +#: Global/i18n.js:139 +#: Image/$Image.skin:19 +#: Story/$Story.skin:25 +#: Skin/$Skin.skin:10 +#: Layout/$Layout.skin:99 msgid "Press CTRL & C to copy to clipboard." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:213 +#: Story/$Story.skin:228 msgid "Preview" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:69 +#: ../compat/Global/aspects.js:69 msgid "Previous page" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:379 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: User/User.js:214 +#: Admin/Admin.js:108 +#: Admin/Admin.js:115 +#: Admin/$Admin.skin:423 msgid "Privileged" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:60 +#: Admin/$Admin.skin:93 msgid "Probation Period" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:21 +#: HopObject/$HopObject.skin:21 msgid "Proceed" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Public" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:182 +#: Root/Site.skin:25 +#: Root/Root.js:196 msgid "Public Sites" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:66 +#: ../compat/Story/Story.js:66 msgid "Publish" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:89 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:14 +#: Poll/$Poll.skin:89 +#: Polls/$Polls.skin:14 msgid "Question" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:107 +#: Root/$Root.skin:109 msgid "Queue" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:19 +#: ../compat/Members/Members.js:19 msgid "Recover your password" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:267 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:157 +#: User/$User.skin:160 +#: Admin/$Admin.skin:289 +#: Admin/$Admin.skin:178 msgid "Reference" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:995 +#: Site/$Site.skin:1124 msgid "Referrer" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:129 +#: Site/$Site.skin:158 msgid "Referrer Filter" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:708 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:34 +#: Site/Site.js:674 +#: Site/Site.skin:34 +#: Root/Site.skin:37 msgid "Referrers" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:132 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:101 +#: Members/$Members.skin:123 +#: Members/Members.js:119 msgid "Register" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:247 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:214 +#: Admin/$Admin.skin:268 +#: Members/$Members.skin:226 msgid "Registered" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: Admin/$Admin.skin:245 msgid "Registration" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Admin/$Admin.skin:49 +msgid "Registration & Login" +msgstr "" + +#: Site/Site.js:54 +#: User/User.js:214 +#: Admin/Admin.js:94 +#: Admin/Admin.js:108 +#: Admin/Admin.js:115 msgid "Regular" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:56 +#: Members/$Members.skin:71 msgid "Remember Login" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:156 +#: Members/Members.js:175 msgid "Request Password Reset" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:83 +#: Root/$Root.skin:85 msgid "Requests" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:52 +#: Admin/$Admin.skin:52 +#: Admin/$Admin.skin:85 msgid "Required Account Status" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:190 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:143 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:39 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:976 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:68 +#: Site/$Site.skin:1105 +#: Admin/$Admin.skin:211 +#: Admin/$Admin.skin:257 +#: Admin/$Admin.skin:164 +#: Skin/$Skin.skin:71 +#: Layout/$Layout.skin:88 msgid "Reset" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:146 +#: Members/Members.js:165 msgid "Reset Password" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:22 +#: Api/$Api.skin:22 msgid "Resource type (e.g. Story or Comment)" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 +#: Site/Site.js:60 +#: Admin/Admin.js:101 msgid "Restricted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:60 +#: Poll/$Poll.skin:60 msgid "Results" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:215 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:16 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:7 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:34 +#: Membership/$Membership.skin:7 +#: User/$User.skin:34 +#: Members/$Members.skin:16 +#: Members/$Members.skin:227 msgid "Role" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:8 +#: Polls/$Polls.skin:8 msgid "Running" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:98 +#: Polls/Polls.js:98 msgid "Running Polls" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:104 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:69 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:61 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:85 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:37 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:182 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:16 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:112 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:170 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:29 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:80 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:100 +#: Membership/$Membership.skin:16 +#: Site/$Site.skin:208 +#: User/$User.skin:101 +#: Poll/$Poll.skin:112 +#: File/$File.skin:61 +#: Image/$Image.skin:87 +#: Story/Story.skin:80 +#: Admin/$Admin.skin:137 +#: Skin/$Skin.skin:29 +#: Layout/$Layout.skin:86 +#: Comment/Comment.skin:69 +#: Members/$Members.skin:194 msgid "Save" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:117 +#: Poll/$Poll.skin:117 msgid "Save and Run" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:974 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1077 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:734 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:41 -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:245 +#: Site/Site.js:700 +#: Site/Site.skin:41 +#: Site/$Site.skin:1103 +#: Site/$Site.skin:1203 +#: ../compat/Global/aspects.js:246 msgid "Search" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:21 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:75 +#: Site/$Site.skin:340 +#, java-format +msgid "Search with {0}" +msgstr "" + +#: Global/$Global.skin:40 +msgid "Select" +msgstr "" + +#: Membership/$Membership.skin:76 msgid "Send" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:164 +#: Members/$Members.skin:176 msgid "Send Request" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:71 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:54 +#: Image/$Image.skin:73 +#: Story/Story.skin:54 msgid "Separated by commas" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:74 +#: Root/$Root.skin:76 msgid "Sessions" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:24 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:329 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:31 +#: Site/Site.js:338 +#: Site/Site.skin:31 +#: Site/$Site.skin:1271 +#: Root/Site.skin:35 +#: Layout/$Layout.skin:73 msgid "Settings" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:7 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:434 +#: Admin/Admin.js:477 +#: Admin/$Admin.skin:7 msgid "Setup" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:120 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:121 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:48 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:49 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:177 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:178 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:92 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:93 +#: User/$User.skin:93 +#: User/$User.skin:94 +#: Members/$Members.skin:189 +#: Members/$Members.skin:190 +#: Members/$Members.skin:63 +#: Members/$Members.skin:64 +#: Members/$Members.skin:114 +#: Members/$Members.skin:115 msgid "Show" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:14 +#: Layout/$Layout.skin:18 msgid "Show Controls" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:195 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:241 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:262 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:148 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:205 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:283 +#: Site/$Site.skin:331 +#: Admin/$Admin.skin:283 +#: Admin/$Admin.skin:216 +#: Admin/$Admin.skin:262 +#: Admin/$Admin.skin:169 +#: Members/$Members.skin:217 #, java-format msgid "Showing {0} result" msgid_plural "Showing {0} results" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 #, java-format msgid "Since you are an administrator of this Antville installation you are entitled to manage sites and accounts, monitor all activity, configure the setup and much more." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:155 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:22 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:33 +#: Site/Site.js:22 +#: User/$User.skin:33 +#: User/$User.skin:158 +#: Admin/$Admin.skin:176 msgid "Site" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:49 +#: Admin/$Admin.skin:82 msgid "Site Creation" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:58 +#: Skins/$Skins.skin:58 msgid "Site Page" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:76 +#: Admin/$Admin.skin:109 msgid "Site Phase-Out" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:782 -msgid "Site is scheduled for export." -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:836 +#: Site/Site.js:799 msgid "Site is scheduled for import." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:536 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:25 +#: Admin/Admin.js:578 +#: Admin/$Admin.skin:10 msgid "Sites" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:14 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:17 +#: Images/$Images.skin:17 +#: Files/$Files.skin:15 msgid "Size" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:22 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: Skin/Skin.js:22 +#: Skin/Skin.js:200 msgid "Skin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:5 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:22 +#: Skins/Skins.js:22 +#: Layout/$Layout.skin:7 msgid "Skins" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:173 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:868 +#: Site/Site.js:831 msgid "Something went wrong." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:61 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:56 +#: Root/$Root.skin:56 +#: Root/$Root.skin:61 msgid "Sorry!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:134 +#: Members/Members.js:187 +msgid "Sorry, logging in is currently not possible." +msgstr "" + +#: File/File.js:131 #, java-format msgid "Sorry, the file exceeds the maximum upload limit of {0} kB." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:114 -msgid "Sorry, the user name you entered already exists. Please enter a different one." +#: User/User.js:243 +msgid "Sorry, the username you entered already exists. Please enter a different one." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:110 +#: User/User.js:239 msgid "Sorry, the username you entered is too long. Please choose a shorter one." msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:147 +#: File/File.js:144 msgid "Sorry, there is no disk space left. Please try to delete some files or images first." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:291 +#: Layout/Layout.js:292 msgid "Sorry, this layout is not compatible with Antville." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:361 -msgid "Sorry, your input did not match any registered user." +#: Members/Members.js:426 +msgid "Sorry, your input did not match any registered account." msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:287 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:288 +#: File/File.js:335 #, java-format msgid "Source: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:24 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:18 +#: Site/Site.skin:18 +#: Site/$Site.skin:1290 +#: Root/Site.skin:24 msgid "Start" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:60 +#: Skins/$Skins.skin:60 msgid "Start Page" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:249 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:68 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:234 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:124 +#: Site/$Site.skin:282 +#: User/$User.skin:113 +#: Root/$Root.skin:70 +#: Admin/$Admin.skin:224 +#: Admin/$Admin.skin:270 msgid "Status" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:115 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 +#: Site/$Site.skin:1290 +#: Poll/$Poll.skin:115 msgid "Stop" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:22 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:68 +#: Site/Site.skin:26 +#: Stories/Stories.js:22 +#: Stories/Stories.js:68 msgid "Stories" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:117 +#: Stories/Stories.js:117 #, java-format msgid "Stories by {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:164 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:22 +#: HopObject/HopObject.js:178 +#: Story/Story.js:22 msgid "Story" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:99 +#: Archive/Archive.js:99 #, java-format msgid "Story Archive {0} ({1})" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:64 +#: Admin/$Admin.skin:71 +msgid "Story about Data Privacy Statement" +msgstr "" + +#: Admin/$Admin.skin:60 +msgid "Story about Terms and Conditions" +msgstr "" + +#: Skins/$Skins.skin:64 msgid "Stylesheet" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:9 +#: Membership/Membership.skin:9 msgid "Subscribe // verb" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:17 +#: Members/$Members.skin:17 msgid "Subscribed" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:53 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:92 +#: Membership/Membership.js:53 +#: Site/Site.js:89 msgid "Subscriber" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:246 +#: Members/$Members.skin:7 +#: Members/Members.js:284 msgid "Subscribers" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:267 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:10 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:27 +#: Membership/Membership.skin:10 +#: User/$User.skin:27 +#: Members/Members.js:305 msgid "Subscriptions" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:305 +#: Members/Members.js:343 #, java-format msgid "Successfully added {0} to the list of members." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:154 +#: Root/Root.js:168 msgid "Successfully created your site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:743 +#: Site/Site.js:709 #, java-format msgid "Successfully subscribed to site {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:757 +#: Site/Site.js:723 #, java-format msgid "Successfully unsubscribed from site {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:182 +#: Layout/Layout.js:182 msgid "Successfully updated the layout." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:426 +#: Admin/Admin.js:469 msgid "Successfully updated the setup." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.skin:2 +#: Root/Root.skin:2 msgid "System is up and running." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:22 +#: Tag/Tag.js:22 msgid "Tag" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:95 +#: Tag/Tag.js:95 #, java-format msgid "Tag: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:70 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:19 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:53 -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:22 +#: Tags/Tags.js:22 +#: Site/Site.skin:19 +#: Image/$Image.skin:72 +#: Story/Story.skin:53 msgid "Tags" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:45 +#: Root/Site.skin:26 +#: Members/$Members.skin:83 +msgid "Terms and Conditions" +msgstr "" + +#: Story/Story.skin:45 msgid "Text" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:125 +#: Poll/Poll.js:125 msgid "Thanks, your vote was registered. You can change your mind until the poll is closed." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:38 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:47 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:145 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:134 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:155 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:123 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:106 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1184 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1194 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:163 +#: Membership/$Membership.skin:107 +#: Membership/$Membership.skin:135 +#: Membership/$Membership.skin:124 +#: Membership/$Membership.skin:156 +#: Membership/$Membership.skin:146 +#: Site/$Site.skin:1304 +#: Site/$Site.skin:1314 +#: User/$User.skin:207 +#: HopObject/$HopObject.skin:38 +#: HopObject/$HopObject.skin:47 msgid "The Management" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:9 +#: Api/$Api.skin:9 msgid "The URL endpoint for each of these APIs is located at" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:18 +#: User/User.js:578 +msgid "The account data will be available for download from here within the next days." +msgstr "" + +#: User/User.js:566 +msgid "The account is queued for export." +msgstr "" + +#: User/User.js:626 +#, java-format +msgid "The account {0} was deleted." +msgstr "" + +#: Api/$Api.skin:18 msgid "The callback URL will be invoked as an HTTP POST request with the following parameters:" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:208 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:201 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:195 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:159 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:320 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:157 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:99 -#: /Users/tobi/Projects/antville/current/code/User/User.js:390 +#: Membership/Membership.js:159 +#: Site/Site.js:329 +#: User/User.js:532 +#: File/File.js:205 +#: Image/Image.js:203 +#: Skins/Skins.js:99 +#: Skin/Skin.js:157 msgid "The changes were saved successfully." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:118 +#: Site/Site.js:115 msgid "The chosen name is too long. Please enter a shorter one." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:4 +#: Claustra/$Claustra.skin:4 msgid "The claustra – or cloistral chamber – is the first thing an ant queen creates when founding a new colony. In Antville, we call that an extension of functionality in a limited way – just like a plug-in, module or add-on. To enable or disable an Antville Claustra, simply add it to or remove it from the claustra property in app.properties." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:315 +#: Story/Story.js:320 msgid "The comment was successfully created." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:164 +#: Comment/Comment.js:166 msgid "The comment was successfully updated." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:11 +#: User/$User.skin:11 #, java-format msgid "The easiest way to customize your site is to change its settings. You can change the language and time zone or the main title of your site, open or close it and much more." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:60 +#: Files/Files.js:60 msgid "The file was successfully added." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:79 +#: Images/Images.js:79 msgid "The image was successfully added." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:304 +#: Layout/Layout.js:305 msgid "The layout was successfully imported." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:11 +#: Root/$Root.skin:11 msgid "The name will be part of the URL of your site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:81 +#: Membership/Membership.js:81 msgid "The only owner of a site cannot be removed." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:57 +#: Root/$Root.skin:57 msgid "The path you requested was not found." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:69 +#: Polls/Polls.js:69 msgid "The poll was created successfully." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:162 +#: Poll/Poll.js:162 msgid "The poll was updated successfully." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1157 +#: Site/Site.js:764 +msgid "The site data will be available for download from here, soon." +msgstr "" + +#: Site/Site.js:752 +msgid "The site is queued for export." +msgstr "" + +#: Site/$Site.skin:1277 #, java-format msgid "The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:121 +#: HopObject/HopObject.js:136 msgid "The site you requested has been blocked." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1179 +#: Site/$Site.skin:1299 #, java-format msgid "The site {0} at {1} will be blocked in {2} because it is being restricted for too long." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1189 +#: Site/$Site.skin:1309 #, java-format msgid "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:345 +#: Site/Site.js:354 #, java-format -msgid "The site {0} is queued for removal." +msgid "The site {0} is being deleted." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:63 +#: Story/Story.skin:63 #, java-format msgid "The story is {0} and {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:85 +#: Stories/Stories.js:85 msgid "The story was successfully created." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:225 +#: Story/Story.js:230 msgid "The story was successfully updated." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:23 +#: Root/$Root.skin:23 msgid "The title will appear in the header of every page of your site. You can change it anytime you want." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:139 +#: Membership/$Membership.skin:140 #, java-format msgid "The user {0} has added your account to the list of members of the site {1} at {2}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:128 +#: Membership/$Membership.skin:129 #, java-format msgid "The user {0} has modified your membership of the site {1} at {2}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:188 +#: Skin/Skin.js:188 #, java-format msgid "The {0} macro is missing. It is essential for accessing the site and must be present in this skin." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:127 +#: Site/Site.js:124 msgid "There already is a site with this name." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:785 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:823 +#: User/User.js:563 +#, java-format +msgid "There is already another job queued for this account: {0}" +msgstr "" + +#: Site/Site.js:749 +#: Site/Site.js:786 #, java-format msgid "There is already another job queued for this site: {0}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:271 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:267 +#: File/File.js:268 +#: Image/Image.js:289 msgid "There was nothing to upload. Please be sure to choose a file." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:152 +#: Members/Members.js:171 msgid "This URL is not valid for resetting your password." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:44 +#: Api/$Api.skin:44 #, java-format msgid "This callback URL invokes the ping method of the {0}. The essential JavaScript code is shown below." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:289 +#: Comment/Comment.js:293 msgid "This comment was removed by the author." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:290 +#: Comment/Comment.js:294 msgid "This comment was removed." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:274 +#: Image/Image.js:296 msgid "This does not seem to be a valid JPG, PNG or GIF image." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:39 +#: Root/$Root.skin:39 msgid "This is the directory of public sites hosted here, in alphabetical order." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:5 +#: User/$User.skin:5 #, java-format msgid "This means that only you and other {0} of this site have access to it. You can safely start to customize it or to fill it with all the content you have in mind." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:73 +#: Global/$Global.skin:55 msgid "This message was automatically sent to you because you are listed as recipient of notification e-mails of the corresponding site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:91 +#: Membership/$Membership.skin:92 #, java-format msgid "This message was sent to you by an anonymous user of the site {0} [1]." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:94 +#: Membership/$Membership.skin:95 #, java-format msgid "This message was sent to you by the user {0} of the site {1} [1]." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:76 +#: Poll/$Poll.skin:76 #, java-format msgid "This poll was closed {0} by {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:3 +#: User/$User.skin:3 #, java-format msgid "This site is currently {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1140 -#, java-format -msgid "This site is going to be deleted completely and irreversibly after {0}." -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:67 +#: Skins/$Skins.skin:67 msgid "This skin contains additional JavaScript code that will be included in every page." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:65 +#: Skins/$Skins.skin:65 msgid "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:59 +#: Skins/$Skins.skin:59 msgid "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:63 +#: Skins/$Skins.skin:63 msgid "This skin is used to display the navigation links on the page." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:61 +#: Skins/$Skins.skin:61 msgid "This skin is used to render the start page of your site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:363 +#: Members/Members.js:428 msgid "This user is already a member of this site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:78 +#: Root/$Root.skin:80 msgid "Threads" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:7 +#: User/$User.skin:7 msgid "Thus, it is publicly accessible for every visitor." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:75 +#: Global/$Global.skin:57 msgid "Thus, you will be notified whenever the site has undergone changes as specified in the site preferences." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:91 +#: Site/$Site.skin:111 msgid "Time Zone" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:44 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:23 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:37 +#: User/User.js:612 +#: User/$User.skin:51 +#: User/$User.skin:152 +msgid "Timeline" +msgstr "" + +#: Site/$Site.skin:43 +#: Root/$Root.skin:23 +#: Root/$Root.skin:44 +#: Story/Story.skin:37 msgid "Title" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:32 +#: Api/$Api.skin:32 msgid "Title or name of the site" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:157 +#: User/$User.skin:201 msgid "To confirm the request please click the link below." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:5 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:60 +#: Membership/$Membership.skin:60 msgid "To prevent abuse, the sender address and the subject of the e-mail are set to predefined values." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:9 +#: Stories/$Stories.skin:9 msgid "Top" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:125 +#: Stories/Stories.js:125 msgid "Top Stories" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:69 +#: Poll/$Poll.skin:69 msgid "Total" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:9 +#: Root/Site.skin:9 msgid "Total sites hosted here" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:121 +#: Site/$Site.skin:148 msgid "Troll Filter" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:376 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:358 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Site/Site.js:54 +#: User/User.js:214 +#: Admin/Admin.js:94 +#: Admin/Admin.js:108 +#: Admin/Admin.js:115 +#: Admin/$Admin.skin:399 +#: Admin/$Admin.skin:420 msgid "Trusted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:16 +#: Images/$Images.skin:16 msgid "Type" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:26 +#: Api/$Api.skin:26 msgid "URL string of the resource" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:34 +#: Api/$Api.skin:34 msgid "URL string of the site" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:223 -#: /Users/tobi/Projects/antville/current/code/User/User.js:233 +#: User/User.js:357 +#: User/User.js:367 msgid "Unfortunately, your login failed. Maybe a typo?" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:191 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:237 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:144 +#: Admin/$Admin.skin:212 +#: Admin/$Admin.skin:258 +#: Admin/$Admin.skin:165 msgid "Update" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:255 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:26 +#: Members/Members.js:380 +msgid "Updated Terms & Conditions" +msgstr "" + +#: User/$User.skin:26 +#: Members/Members.js:293 msgid "Updates" msgstr "" -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:5 +#: ../compat/Layout/$Layout.skin:5 msgid "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:76 +#: Root/$Root.skin:78 msgid "Uptime" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:115 -msgid "User name and e-mail address do not match." +#: HopObject/HopObject.js:179 +msgid "User" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:115 +#: Members/Members.js:134 +msgid "Username and e-mail address do not match." +msgstr "" + +#: Root/$Root.skin:117 msgid "Version" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:28 +#: HopObject/$HopObject.skin:28 msgid "Via" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:58 -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:22 +#: Poll/$Poll.skin:58 +#: Vote/Vote.js:22 msgid "Vote" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:10 +#: HopObject/$HopObject.skin:10 msgid "Warning!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:150 +#: Membership/$Membership.skin:151 #, java-format msgid "We are sorry to inform you that the user {0} has cancelled your membership of the site {1} at {2}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:10 +#: Members/$Members.skin:147 +msgid "We have updated our terms and conditions. Please reaffirm you understand and accept the following:" +msgstr "" + +#: Site/Site.skin:10 msgid "Welcome" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:116 +#: Membership/$Membership.skin:117 #, java-format msgid "Welcome to {0}, {1}!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:166 -#: /Users/tobi/Projects/antville/current/code/User/User.js:210 +#: User/User.js:344 +#: Members/Members.js:204 +#: Members/Members.js:374 #, java-format msgid "Welcome to {0}, {1}. Have fun!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:14 +#: Site/Site.skin:14 #, java-format msgid "Welcome to {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:91 +#: Members/Members.js:105 #, java-format msgid "Welcome to “{0}”, {1}. Have fun!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:98 +#: Root/$Root.skin:100 msgid "Xml-Rpc Count" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/$Comment.skin:23 +#: Comment/$Comment.skin:23 #, java-format msgid "Yes, really erase {0} comment" msgid_plural "Yes, really erase {0} comments" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:154 +#: User/$User.skin:198 #, java-format msgid "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:238 +#: Comment/Comment.js:242 #, java-format -msgid "You are about to delete a comment by user {0}." +msgid "You are about to delete a comment by {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:236 +#: Comment/Comment.js:240 #, java-format msgid "You are about to delete a comment thread consisting of {0} postings." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:236 +#: Poll/Poll.js:236 #, java-format msgid "You are about to delete a poll by user {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:773 +#: Story/Story.js:796 #, java-format -msgid "You are about to delete a story by user {0}." +msgid "You are about to delete a story by {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:409 +#: User/User.js:634 #, java-format msgid "You are about to delete the account {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:354 +#: File/File.js:364 #, java-format msgid "You are about to delete the file {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:565 +#: Image/Image.js:615 #, java-format msgid "You are about to delete the image {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:275 +#: Membership/Membership.js:284 #, java-format -msgid "You are about to delete the membership of user {0}." +msgid "You are about to delete the membership of {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:403 +#: Site/Site.js:412 #, java-format msgid "You are about to delete the site {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:261 +#: User/$User.skin:171 +#, java-format +msgid "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}." +msgstr "" + +#: Site/$Site.skin:309 #, java-format msgid "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:442 +#: Layout/Layout.js:443 #, java-format msgid "You are about to reset the layout of site {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:427 +#: Skin/Skin.js:427 #, java-format msgid "You are about to reset the skin {0}.{1}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:768 +#: Site/Site.js:734 #, java-format msgid "You are about to unsubscribe from the site {0}." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:118 +#: Story/$Story.skin:121 msgid "You are going to discard unsaved content." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:140 +#: HopObject/HopObject.js:155 msgid "You are not allowed to access this part of the site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:15 +#: Membership/Membership.skin:15 msgid "You are not logged in" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:142 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:131 +#: Membership/$Membership.skin:132 +#: Membership/$Membership.skin:143 #, java-format msgid "You are now {0} of the site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:118 +#: Membership/$Membership.skin:119 msgid "You can edit your account profile and change its password any time via the following link:" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:139 +#: Admin/$Admin.skin:160 msgid "You can filter the results by account. Use the asterisk * as wildcard." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:232 +#: Admin/$Admin.skin:253 msgid "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:186 +#: Admin/$Admin.skin:207 msgid "You can filter the results by site name. Use the asterisk * as wildcard." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:193 +#: Members/$Members.skin:205 msgid "You can use the asterisk * as wildcard." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:433 -msgid "You cannot revoke permissions from the only privileged user." +#: User/User.js:686 +msgid "You cannot delete a privileged account." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:102 -msgid "You denied the request." +#: User/User.js:683 +msgid "You cannot revoke permissions from the only privileged account." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:145 +#: Poll/Poll.js:145 msgid "You did not vote, yet. You can vote until the poll is closed." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:390 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:399 +#: Root/Root.js:407 +#: Root/Root.js:416 #, java-format msgid "You need to wait {0} before you are allowed to create a new site." msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:158 +#: User/$User.skin:202 msgid "You will then be asked to change your password." msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:112 +#: HopObject/HopObject.js:119 msgid "Your account has been blocked." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:33 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:198 +#: Membership/Membership.js:202 msgid "Your message was sent successfully." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:141 +#: Members/Members.js:160 msgid "Your password was changed." msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:32 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:197 +#: Membership/Membership.js:200 #, java-format -msgid "[{0}] Message from anonymous user" +msgid "[{0}] Message from anonymous" msgstr "" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:31 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:196 +#: Membership/Membership.js:199 #, java-format -msgid "[{0}] Message from user {1}" +msgid "[{0}] Message from {1}" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:87 +#: Membership/Membership.js:87 #, java-format msgid "[{0}] Notification of membership cancellation" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:304 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:184 +#: Membership/Membership.js:184 +#: Members/Members.js:342 #, java-format msgid "[{0}] Notification of membership change" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:249 +#: HopObject/HopObject.js:267 #, java-format msgid "[{0}] Notification of site changes" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:119 +#: Members/Members.js:138 #, java-format msgid "[{0}] Password reset confirmation" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:213 +#: Admin/Admin.js:235 #, java-format msgid "[{0}] Warning: Site will be blocked" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:187 +#: Admin/Admin.js:209 #, java-format msgid "[{0}] Warning: Site will be deleted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:90 +#: Members/Members.js:103 #, java-format msgid "[{0}] Welcome to {1}!" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/User.js:24 +#: User/User.js:24 msgid "a account // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:24 +#: Choice/Choice.js:24 msgid "a choice // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:24 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 +#: Comment/Comment.js:24 msgid "a comment // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/File/File.js:24 +#: File/File.js:24 msgid "a file // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:24 +#: Image/Image.js:26 msgid "a image // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:24 +#: Layout/Layout.js:24 msgid "a layout" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:24 +#: Membership/Membership.js:24 msgid "a membership // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:24 +#: Poll/Poll.js:24 msgid "a poll // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:24 +#: Site/Site.js:24 msgid "a site // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:24 +#: Skin/Skin.js:24 msgid "a skin // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:24 +#: Story/$Story.skin:50 +#: Story/Story.js:24 msgid "a story // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:24 +#: Tag/Tag.js:24 msgid "a tag // accusative" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:24 +#: Vote/Vote.js:24 msgid "a vote" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/User/User.js:23 +#: User/User.js:23 +#: Admin/$Admin.skin:152 msgid "account" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:198 +#: Admin/$Admin.skin:244 msgid "all" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "any" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: Admin/$Admin.skin:200 +#: Admin/$Admin.skin:246 +#: Admin/$Admin.skin:153 msgid "ascending" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:198 +#: Admin/$Admin.skin:244 msgid "blocked" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:23 +#: Choice/Choice.js:23 msgid "choice" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:83 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:78 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:92 +#: Site/Site.js:80 +#: Poll/Poll.js:32 +#: Story/Story.js:78 +#: Story/Story.js:92 +#: Admin/$Admin.skin:198 msgid "closed" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:23 +#: Admin/$Admin.skin:152 +#: Comment/Comment.js:23 msgid "comment" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:59 +#: Global/i18n.js:59 msgid "comment // verb" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "content" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "created" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:63 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:71 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:90 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:98 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:69 +#: Site/Site.js:67 +#: Admin/$Admin.skin:96 +#: Admin/$Admin.skin:104 +#: Admin/$Admin.skin:123 +#: Admin/$Admin.skin:131 msgid "days" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:29 +#: Admin/$Admin.skin:198 +#: Admin/$Admin.skin:244 +#: Comment/Comment.js:31 msgid "deleted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: Admin/$Admin.skin:200 +#: Admin/$Admin.skin:246 +#: Admin/$Admin.skin:153 msgid "descending" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:76 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:98 +#: Site/Site.js:73 +#: Site/Site.js:95 msgid "disabled" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:106 +#: Members/$Members.skin:100 msgid "e-mail" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:18 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:66 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:77 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:146 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:77 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:99 +#: Admin/$Admin.skin:63 +#: Admin/$Admin.skin:74 +#, java-format +msgid "e.g. {0}" +msgstr "" + +#: Site/Site.js:74 +#: Site/Site.js:96 +#: Site/$Site.skin:81 +#: Site/$Site.skin:94 +#: Site/$Site.skin:178 +#: Layout/$Layout.skin:23 msgid "enabled" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:22 +#: Admin/Admin.js:22 msgid "export" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:86 +#: Story/Story.js:86 msgid "featured" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/File/File.js:23 +#: File/File.js:23 +#: Admin/$Admin.skin:152 msgid "file" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:23 +#: Files/Files.js:23 msgid "files" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: Site/Site.js:936 msgid "free" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:85 +#: Story/Story.js:85 msgid "hidden" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:23 +#: Image/Image.js:25 +#: Admin/$Admin.skin:152 msgid "image" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:23 +#: Images/Images.js:23 msgid "images" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:23 +#: Admin/Admin.js:23 msgid "import" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:16 +#: Story/Story.skin:16 msgid "in" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: Global/Global.js:1120 +#, java-format +msgid "in {0} day" +msgid_plural "in {0} days" +msgstr[0] "" +msgstr[1] "" + +#: Global/Global.js:1116 +#, java-format +msgid "in {0} hour" +msgid_plural "in {0} hours" +msgstr[0] "" +msgstr[1] "" + +#: Global/Global.js:1114 +#, java-format +msgid "in {0} minute" +msgid_plural "in {0} minutes" +msgstr[0] "" +msgstr[1] "" + +#: Global/Global.js:1124 +#, java-format +msgid "in {0} month" +msgid_plural "in {0} months" +msgstr[0] "" +msgstr[1] "" + +#: Global/Global.js:1122 +#, java-format +msgid "in {0} week" +msgid_plural "in {0} weeks" +msgstr[0] "" +msgstr[1] "" + +#: Global/Global.js:1126 +#, java-format +msgid "in {0} year" +msgid_plural "in {0} years" +msgstr[0] "" +msgstr[1] "" + +#: Admin/$Admin.skin:245 msgid "last login" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:23 +#: Layout/Layout.js:23 msgid "layout" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "link" msgstr "" -#: /Users/tobi/Projects/antville/current/code/LogEntry/LogEntry.js:23 +#: LogEntry/LogEntry.js:23 msgid "log entry" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:23 +#: Members/Members.js:23 msgid "members" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:23 +#: Membership/Membership.js:23 msgid "membership" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "modified" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "name" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:94 +#: Poll/Poll.js:32 +#: Story/Story.js:79 +#: Story/Story.js:94 +#: Admin/$Admin.skin:198 msgid "open" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:5 +#: User/$User.skin:5 msgid "owners" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 +#: Comment/Comment.js:32 msgid "pending" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:23 +#: Poll/Poll.js:23 +#: Admin/$Admin.skin:152 msgid "poll" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:23 +#: Polls/Polls.js:23 msgid "polls" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 msgid "posted // has posted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:244 msgid "privileged" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:84 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 +#: Site/Site.js:81 +#: Story/Story.js:79 +#: Admin/$Admin.skin:198 +#: Comment/Comment.js:32 msgid "public" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 +#: Comment/Comment.js:32 msgid "readonly" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:24 +#: Admin/Admin.js:24 msgid "remove" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 +#: Admin/$Admin.skin:198 msgid "restricted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1106 +#: Global/Global.js:1165 msgid "right now" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 +#: Story/Story.js:79 msgid "shared" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:23 +#: Site/Site.js:23 +#: Admin/$Admin.skin:152 msgid "site" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:23 +#: Skin/Skin.js:23 msgid "skin" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:23 +#: Skins/Skins.js:23 msgid "skins" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:70 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:23 +#: Global/Global.js:1112 +msgid "soon" +msgstr "" + +#: Site/$Site.skin:68 +#: Stories/Stories.js:23 msgid "stories" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:23 +#: Story/Story.js:23 msgid "story" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:23 +#: Tag/Tag.js:23 msgid "tag" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:23 +#: Tags/Tags.js:23 msgid "tags" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Global/Global.js:1118 +msgid "tomorrow" +msgstr "" + +#: Admin/$Admin.skin:198 +#: Admin/$Admin.skin:244 msgid "trusted" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 msgid "updated // has updated" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: Site/Site.js:936 msgid "used" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:23 +#: Vote/Vote.js:23 msgid "vote" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1112 +#: Global/Global.js:1171 msgid "yesterday" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:138 -#, java-format -msgid "{0} 401 Error" -msgstr "" - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:245 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:136 +#: Site/$Site.skin:293 +#: User/$User.skin:125 #, java-format msgid "{0} Comment" msgid_plural "{0} Comments" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:247 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:138 +#: Site/$Site.skin:295 +#: User/$User.skin:127 #, java-format msgid "{0} File" msgid_plural "{0} Files" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:246 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:137 +#: Site/$Site.skin:294 +#: User/$User.skin:126 #, java-format msgid "{0} Image" msgid_plural "{0} Images" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:105 +#: Root/$Root.skin:107 #, java-format msgid "{0} MB free" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:104 +#: Root/$Root.skin:106 #, java-format msgid "{0} MB total" msgstr "" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:134 +#: User/$User.skin:123 #, java-format msgid "{0} Site" msgid_plural "{0} Sites" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:244 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:135 +#: Site/$Site.skin:292 +#: User/$User.skin:124 #, java-format msgid "{0} Story" msgid_plural "{0} Stories" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:222 +#: Admin/$Admin.skin:243 #, java-format msgid "{0} accounts sorted by {1} in {2} order." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:80 +#: Root/$Root.skin:82 #, java-format msgid "{0} active" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:130 +#: Admin/$Admin.skin:151 #, java-format msgid "{0} activity sorted by date in {1} order." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:111 +#: Root/$Root.skin:113 #, java-format msgid "{0} callback" msgid_plural "{0} callbacks" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:531 +#: Story/Story.js:545 #, java-format msgid "{0} character" msgid_plural "{0} characters" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:263 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:559 +#: Site/$Site.skin:311 +#: User/$User.skin:174 +#: Story/Story.js:574 #, java-format msgid "{0} comment" msgid_plural "{0} comments" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:77 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:391 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:400 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1181 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1191 +#: Site/$Site.skin:1301 +#: Site/$Site.skin:1311 +#: Root/Root.js:408 +#: Root/Root.js:417 +#: Root/$Root.skin:79 #, java-format msgid "{0} day" msgid_plural "{0} days" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1114 +#: Global/Global.js:1173 #, java-format msgid "{0} day ago" msgid_plural "{0} days ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:265 +#: Site/$Site.skin:313 +#: User/$User.skin:176 #, java-format msgid "{0} file" msgid_plural "{0} files" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:81 +#: Root/$Root.skin:83 #, java-format msgid "{0} free" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:34 +#: HopObject/$HopObject.skin:34 #, java-format msgid "{0} has added {1} to the site {2}:" msgstr "" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:43 +#: HopObject/$HopObject.skin:43 #, java-format msgid "{0} has modified {1} at the site {2}:" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1110 +#: Global/Global.js:1169 #, java-format msgid "{0} hour ago" msgid_plural "{0} hours ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:264 +#: Site/$Site.skin:312 +#: User/$User.skin:175 #, java-format msgid "{0} image" msgid_plural "{0} images" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:86 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:91 +#: Root/$Root.skin:88 +#: Root/$Root.skin:93 #, java-format msgid "{0} in the last 5 min." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:114 +#: Root/$Root.skin:116 #, java-format msgid "{0} log entries" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:110 +#: Root/$Root.skin:112 #, java-format msgid "{0} mail" msgid_plural "{0} mails" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1108 +#: Global/Global.js:1167 #, java-format msgid "{0} minute ago" msgid_plural "{0} minutes ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1118 +#: Global/Global.js:1177 #, java-format msgid "{0} month ago" msgid_plural "{0} months ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:101 +#: Root/$Root.skin:103 #, java-format msgid "{0} of {1} objects" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 +#: Site/$Site.skin:68 #, java-format msgid "{0} per page" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:266 +#: Site/$Site.skin:314 +#: User/$User.skin:177 #, java-format msgid "{0} poll" msgid_plural "{0} polls" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:99 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:109 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:5 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:75 +#: Root/$Root.skin:101 +#: Root/$Root.skin:111 +#: Story/Story.skin:75 +#: Story/$Story.skin:5 #, java-format msgid "{0} request" msgid_plural "{0} requests" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:176 +#: User/$User.skin:172 +#, java-format +msgid "{0} site" +msgid_plural "{0} sites" +msgstr[0] "" +msgstr[1] "" + +#: Admin/$Admin.skin:197 #, java-format msgid "{0} sites sorted by {1} in {2} order." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:262 +#: Site/$Site.skin:310 +#: User/$User.skin:173 #, java-format msgid "{0} story" msgid_plural "{0} stories" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:85 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:90 +#: Root/$Root.skin:87 +#: Root/$Root.skin:92 #, java-format msgid "{0} total" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Choice/$Choice.skin:23 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:70 +#: Poll/$Poll.skin:70 +#: Choice/$Choice.skin:23 #, java-format msgid "{0} vote" msgid_plural "{0} votes" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:171 +#: HopObject/HopObject.js:189 #, java-format msgid "{0} was successfully deleted." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: Skin/Skin.js:200 +#: Layout/Layout.js:245 #, java-format msgid "{0} was successfully reset." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1116 +#: Global/Global.js:1175 #, java-format msgid "{0} week ago" msgid_plural "{0} weeks ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1120 +#: Global/Global.js:1179 #, java-format msgid "{0} year ago" msgid_plural "{0} years ago" msgstr[0] "" msgstr[1] "" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:129 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:137 +#: Root/Root.js:141 +#: Root/Root.js:149 #, java-format msgid "{0} {1} Error" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 #, java-format msgid "{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”" msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:96 +#: Root/$Root.skin:98 #, java-format msgid "{0}% in the last 5 min." msgstr "" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:95 +#: Root/$Root.skin:97 #, java-format msgid "{0}% total" msgstr "" +#: Site/$Site.skin:1265 +#: User/$User.skin:142 +#, java-format +msgid "{0}Download the archive{1} or click “Export” to create a new one." +msgstr "" + diff --git a/i18n/de-x-male.po b/i18n/de-x-male.po index 5d9bd6a5..0e19dbf8 100644 --- a/i18n/de-x-male.po +++ b/i18n/de-x-male.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: Antville-1.5\n" "Report-Msgid-Bugs-To: mail@antville.org\n" -"POT-Creation-Date: 2015-08-10 16:30+0200\n" -"PO-Revision-Date: 2015-08-10 16:31+0200\n" +"POT-Creation-Date: 2018-05-21 14:42+0200\n" +"PO-Revision-Date: 2018-05-21 14:43+0200\n" "Last-Translator: Tobi Schäfer \n" "Language-Team: The Antville People \n" "Language: de\n" @@ -27,72 +27,71 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.4\n" +"X-Generator: Poedit 2.0.6\n" "X-Poedit-SourceCharset: UTF-8\n" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:948 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:984 #, java-format msgid "({0} character)" msgid_plural "({0} characters)" msgstr[0] "({0} Zeichen)" msgstr[1] "({0} Zeichen)" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:802 -msgid "" -"A Blogger export file (.xml) will be created and available for download from " -"here within 24 hours." -msgstr "" -"Eine Blogger-Export-Datei (.xml) wird erstellt und steht hier spätestens " -"nach 24 Stunden zum Download bereit." - -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:124 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:134 msgid "A confirmation mail was sent to your e-mail address." msgstr "Eine Bestätigungs-Nachricht wurde an Ihre E-Mail-Adresse geschickt." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:7 #: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:62 msgid "A generic disclaimer will be automatically appended to your message." msgstr "Ein allgemeiner Hinweis wird der Nachricht automatisch hinzugefügt." +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:32 #: /Users/tobi/Projects/antville/current/code/Api/Api.js:101 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:30 msgid "API" msgstr "API" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:101 msgid "Abandoned" msgstr "Verwaist" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:268 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:154 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:171 +msgid "Accept" +msgstr "Akzeptieren" + #: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:15 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:15 #: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:20 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:98 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:213 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:153 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:33 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:203 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:8 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:46 #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:76 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:16 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:303 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:187 +#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:15 #: /Users/tobi/Projects/antville/current/code/User/User.js:22 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:160 +#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:16 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:46 +#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:16 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:183 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:33 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:243 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:101 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:8 msgid "Account" msgstr "Konto" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:60 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:61 msgid "Account Image" msgstr "Kontobild" +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:202 +msgid "Account is being deleted" +msgstr "Konto wird gelöscht" + +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:598 #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:9 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:556 msgid "Accounts" msgstr "Konten" +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:539 #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:8 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:496 msgid "Activity" msgstr "Aktivität" @@ -100,7 +99,7 @@ msgstr "Aktivität" msgid "Add Choice" msgstr "Antwortmöglichkeit hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:324 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:326 msgid "Add Comment" msgstr "Kommentar hinzufügen" @@ -112,7 +111,7 @@ msgstr "Datei hinzufügen" msgid "Add Image" msgstr "Bild hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:314 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:345 msgid "Add Member" msgstr "Mitglied hinzufügen" @@ -120,7 +119,7 @@ msgstr "Mitglied hinzufügen" msgid "Add Poll" msgstr "Umfrage hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:167 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:175 msgid "Add Site" msgstr "Site hinzufügen" @@ -128,8 +127,8 @@ msgstr "Site hinzufügen" msgid "Add Skin" msgstr "Skin hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:25 #: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:94 +#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:25 msgid "Add Story" msgstr "Beitrag hinzufügen" @@ -141,22 +140,22 @@ msgstr "Stimmen Sie ab" msgid "Admin" msgstr "Verwaltung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:231 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:121 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:122 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:234 msgid "Administration" msgstr "Vewaltung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:107 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:110 msgid "Advanced" msgstr "Erweitert" #: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:7 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:6 #: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:6 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:6 #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:52 +#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:6 #: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:6 +#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:6 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:6 msgid "All" msgstr "Alle" @@ -168,7 +167,8 @@ msgstr "Alle Umfragen" msgid "All Skins" msgstr "Alle Skins" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:267 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:190 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:270 msgid "All of this will be deleted irreversibly." msgstr "All das wird unwiderruflich gelöscht werden." @@ -198,11 +198,11 @@ msgid "Antville supports the following application programming interfaces:" msgstr "" "Antville unterstützt folgende Schnittstellen zur Anwendungsprogrammierung:" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:72 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:75 msgid "Archive" msgstr "Archiv" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1049 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1098 msgid "" "Are you sure you want to add this URL to the referrer filter? Edit it below " "to filter a pattern only." @@ -210,7 +210,8 @@ msgstr "" "Sind Sie sicher, dass Sie diesen Rückverweis filtern wollen? Sie können ihn " "bearbeiten, um ein Schema zu filtern." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:268 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:191 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:271 msgid "Are you sure you want to proceed?" msgstr "Sind Sie sicher, dass Sie fortfahren wollen?" @@ -226,82 +227,79 @@ msgstr "Grundlegende" msgid "Basic Skins" msgstr "Grundlegende Skins" +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:218 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1229 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1239 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:106 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:134 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:155 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:145 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:37 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:46 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:144 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:133 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:154 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1183 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1193 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:162 msgid "Best regards." msgstr "Beste Grüße." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:355 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:373 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:429 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:408 +#: /Users/tobi/Projects/antville/current/code/User/User.js:200 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:53 msgid "Blocked" msgstr "Gesperrt" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:152 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 msgid "Bookmarklet" msgstr "Bookmarklet" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:101 msgid "Both" msgstr "Beides" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:39 -msgid "Browse" -msgstr "Blättern" - -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:117 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:119 msgid "Build" msgstr "Gestalt" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:100 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:102 msgid "Cache" msgstr "Zwischenspeicher" +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:143 #: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:13 #: /Users/tobi/Projects/antville/current/code/Api/Api.js:123 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:140 msgid "Callback URL" msgstr "Rückruf-Adresse" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:23 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:106 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:70 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:64 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:22 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:88 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:106 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:40 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:134 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:165 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:64 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:200 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:183 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:18 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:77 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:120 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:279 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1172 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1151 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:173 #: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:69 #: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:32 +#: /Users/tobi/Projects/antville/current/code/File/$File.skin:64 +#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:70 +#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:106 +#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:40 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:139 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:104 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:158 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:90 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:33 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1218 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:282 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1195 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:176 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:230 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:213 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:195 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:65 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:134 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:173 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:83 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:103 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:18 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:78 +#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:22 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:120 #: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:13 #: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:9 msgid "Cancel" msgstr "Abbrechen" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:263 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:265 #, java-format msgid "Cannot parse timestamp {0} as a date." msgstr "Der Zeitstempel {0} kann nicht in ein Datum überführt werden." @@ -328,8 +326,8 @@ msgstr "" msgid "Close" msgstr "Schließen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 #: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:8 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:60 msgid "Closed" msgstr "Geschlossen" @@ -339,13 +337,13 @@ msgstr "Geschlossene Beiträge" #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:22 #: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:62 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:159 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:174 msgid "Comment" msgstr "Kommentar" #: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:31 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:61 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:21 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:64 msgid "Comments" msgstr "Kommentare" @@ -368,16 +366,16 @@ msgstr "Vergleichen" msgid "Compare {0}" msgstr "Vergleichen {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:180 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:198 msgid "Confirm Deletion" msgstr "Löschen bestätigen" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:254 #: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:209 +#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:254 msgid "Confirm Reset" msgstr "Zurücksetzen bestätigen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:766 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:744 msgid "Confirm Unsubscribe" msgstr "Stornierung bestätigen" @@ -399,13 +397,12 @@ msgstr "" msgid "Connections" msgstr "Verbindungen" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:26 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:28 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:22 msgid "Contact" msgstr "Kontakt" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:41 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:208 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:209 #, java-format msgid "Contact {0}" msgstr "{0} kontaktieren" @@ -415,18 +412,18 @@ msgstr "{0} kontaktieren" msgid "Content" msgstr "Inhalt" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:219 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:221 #, java-format msgid "Content of Member {0}" msgstr "Beiträge von Mitglied {0}" +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:88 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 msgid "Contributor" msgstr "Autor" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:268 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:8 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:237 msgid "Contributors" msgstr "Autoren" @@ -447,23 +444,23 @@ msgid "Could not connect with Facebook. ({0})" msgstr "Die Verbindung mit Facebook ist fehlgeschlagen. ({0})" #: /Users/tobi/Projects/antville/current/code/File/File.js:268 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:264 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:278 msgid "Could not fetch the file from the given URL." msgstr "Die Datei konnte nicht von der angegebenen Adresse gelesen werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:556 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:598 msgid "Could not remove the image file from disk." msgstr "Die Bild-Datei konnte nicht von der Festplatte entfernt werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:512 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:554 msgid "Could not resize the image." msgstr "Die Bildgröße konnte nicht angepasst werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:538 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:580 msgid "Could not save the image file on disk." msgstr "Die Bild-Datei konnte nicht auf die Festplatte geschrieben werden." -#: /Users/tobi/Projects/antville/current/code/User/User.js:129 +#: /Users/tobi/Projects/antville/current/code/User/User.js:244 msgid "Could not verify your password. Please repeat your input." msgstr "" "Ihr Kennwort konnte nicht bestätigt werden. Bitte wiederholen Sie Ihre " @@ -477,22 +474,22 @@ msgstr "Erstellen" msgid "Create a site. It only takes a few clicks." msgstr "Erstellen Sie Ihre eigene Website mit ein paar Mausklicks." -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:525 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:549 msgid "Create missing file" msgstr "Fehlende Datei hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:572 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:596 msgid "Create missing image" msgstr "Fehlendes Bild hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:201 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:156 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:234 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:189 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:171 msgid "Created" msgstr "Erstellt" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:3 #: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:17 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:48 +#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:3 #, java-format msgid "Created by {0} on {1}" msgstr "Erstellt von {0} am {1}" @@ -502,47 +499,62 @@ msgstr "Erstellt von {0} am {1}" msgid "Created by {0} on {1}." msgstr "Erstellt von {0} am {1}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:363 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:195 +#, java-format +msgid "Created on {0}" +msgstr "Erstellt am {0}" + +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:327 #, java-format msgid "Created {0}" msgstr "Erstellt {0}" -#: /Users/tobi/Projects/antville/current/code/User/User.js:67 -msgid "" -"Currently, it is not possible to remove an account. Please accept our humble " -"apologies." -msgstr "" -"Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis." +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:27 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:69 +msgid "Data Privacy Statement" +msgstr "Datenschutzerklärung" + +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:299 +msgid "Date" +msgstr "Datum" #: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:28 msgid "Date string in Unix timestamp format" msgstr "Datum im Unix-Format" #: /Users/tobi/Projects/antville/current/code/File/$File.skin:63 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:87 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:119 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:172 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:103 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:89 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:175 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:82 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:102 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:119 msgid "Delete" msgstr "Löschen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:414 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:426 +#: /Users/tobi/Projects/antville/current/code/User/User.js:200 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:53 msgid "Deleted" msgstr "Gelöscht" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:10 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:204 +#, java-format +msgid "Deleted on {0}" +msgstr "Gelöscht am {0}" + #: /Users/tobi/Projects/antville/current/code/File/$File.skin:47 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:62 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:43 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:64 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:46 +#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:10 msgid "Description" msgstr "Beschreibung" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:72 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:74 msgid "Details" msgstr "Einzelheiten" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:31 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:33 msgid "Development" msgstr "Entwicklung" @@ -550,11 +562,11 @@ msgstr "Entwicklung" msgid "Dimensions" msgstr "Abmessungen" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:981 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1030 msgid "Disable filter" msgstr "Filter aufheben" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:101 msgid "Disabled" msgstr "Deaktiviert" @@ -569,41 +581,34 @@ msgstr "Verbindung mit {0} trennen" msgid "Disk Quota" msgstr "Speicherplatzanteil" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:160 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:163 msgid "Disk Space" msgstr "Speicherplatz" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:173 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:219 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:127 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:206 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:252 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:160 msgid "Display" msgstr "Anzeige" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Recaptcha/Recaptcha.js:32 +#: /Users/tobi/Projects/antville/current/code/Global/Recaptcha.js:36 msgid "Do Androids dream of electric sheep?" msgstr "Zählen Androiden elektrische Schäfchen?" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1145 -#, java-format -msgid "Download the file {0} or klick “Start” to create a new one." -msgstr "" -"Laden Sie die Datei {0} herunter oder klicken Sie »Start«, um eine neue zu " -"erstellen." - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:158 msgid "Drag to Bookmarks Bar" msgstr "In die Lesezeichenleiste ziehen" #: /Users/tobi/Projects/antville/current/compat/Members/Members.js:20 msgid "" -"Due to security reasons user passwords are not stored in the Antville " -"database any longer. Thus, your password cannot be sent to you, anymore." +"Due to security reasons passwords are not stored in the Antville database " +"any longer. Thus, your password cannot be sent to you, anymore." msgstr "" "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-" "Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:159 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:67 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:68 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:189 msgid "E-mail" msgstr "E-Mail" @@ -627,10 +632,10 @@ msgstr "" "Ereignisse individuell behandeln – auf einem Server und in einer " "Programmiersprache ihrer Wahl." -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:15 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:29 #: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:67 +#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:15 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:24 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:29 msgid "Edit" msgstr "Bearbeiten" @@ -643,7 +648,7 @@ msgstr "Kommentar bearbeiten" msgid "Edit File" msgstr "Datei bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:210 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:212 msgid "Edit Image" msgstr "Bild bearbeiten" @@ -651,11 +656,11 @@ msgstr "Bild bearbeiten" msgid "Edit Poll" msgstr "Umfrage bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:234 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:236 msgid "Edit Story" msgstr "Beitrag bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:982 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1031 msgid "Edit the filter in the site settings." msgstr "Der Filter kann in den Einstellungen bearbeitet werden." @@ -668,7 +673,7 @@ msgstr "{0}.{1} bearbeiten" msgid "Enabled" msgstr "Aktiviert" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:134 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:137 #, java-format msgid "" "Enter one filter {0}pattern{1} per line to be applied on every URL in the " @@ -677,7 +682,7 @@ msgstr "" "Geben Sie ein {0}Filter-Schema{1} pro Zeile ein, das für jede Adresse in den " "Rückverweis-Listen angewendet werden soll." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:149 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:179 msgid "" "Enter your username and the e-mail address you have used when you " "registered. You will then receive a confirmation e-mail containing further " @@ -692,39 +697,47 @@ msgstr "" msgid "Erase all comments of user {0}" msgstr "Alle Kommentare von {0} löschen" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:93 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:95 msgid "Error Ratio" msgstr "Fehler-Rate" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:88 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:90 msgid "Errors" msgstr "Fehler" #: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:8 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:52 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:158 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1195 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:24 msgid "Export" msgstr "Exportieren" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1143 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:152 +msgid "Export Account Data" +msgstr "Kontodaten exportieren" + +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1189 msgid "Export Site Data" msgstr "Site-Daten exportieren" #: /Users/tobi/Projects/antville/current/code/File/$File.skin:30 #: /Users/tobi/Projects/antville/current/code/File/File.js:22 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:160 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:45 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1162 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:47 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1208 #: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:82 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:175 msgid "File" msgstr "Datei" #: /Users/tobi/Projects/antville/current/code/File/File.js:258 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:254 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:256 msgid "File size is exceeding the upload limit." msgstr "Die Dateigröße überschreitet die Upload-Grenze." +#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:28 #: /Users/tobi/Projects/antville/current/code/Files/Files.js:22 #: /Users/tobi/Projects/antville/current/code/Files/Files.js:79 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:28 msgid "Files" msgstr "Dateien" @@ -733,21 +746,21 @@ msgstr "Dateien" msgid "Files by {0}" msgstr "Dateien von {0}" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:185 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:231 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:138 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:218 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:264 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:171 msgid "Filter" msgstr "Filtern" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:198 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:277 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:280 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:228 #: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:7 msgid "Find" msgstr "Finden" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:289 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:722 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1020 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:700 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:989 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:320 #, java-format msgid "Found more than {0} results. Please try a more specific query." msgstr "" @@ -762,12 +775,12 @@ msgstr "Galerien" msgid "General" msgstr "Allgemein" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:183 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:212 #, java-format msgid "Good bye, {0}! Looking forward to seeing you again!" msgstr "Auf Wiedersehen, {0}! Schauen Sie bald wieder vorbei!" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:95 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:128 msgid "Grace Period" msgstr "Gnadenfrist" @@ -779,36 +792,50 @@ msgstr "HTML" msgid "Have a lot of fun!" msgstr "Viel Vergnügen!" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:122 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:123 msgid "Have fun!" msgstr "Viele Späße!" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:280 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:29 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:31 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:289 msgid "Health" msgstr "Statusmonitor" +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:208 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1223 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1233 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:127 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:149 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:138 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:32 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:41 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:137 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:126 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:148 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1177 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1187 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:152 #, java-format msgid "Hello {0}." msgstr "Hallo {0}." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:119 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:123 +msgid "Helma Version" +msgstr "Helma-Version" + +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:92 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:206 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:47 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:176 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:91 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:122 #: /Users/tobi/Projects/antville/current/compat/Story/Story.js:68 msgid "Hide" msgstr "Verstecken" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:100 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:159 +#, java-format +msgid "I understand and accept the {0}data privacy statement{1}" +msgstr "Ich verstehe und akzeptiere die {0}Datenschutzerklärung{1}" + +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:151 +#, java-format +msgid "I understand and accept the {0}terms and conditions{1}" +msgstr "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}" + +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:101 msgid "" "If the user did not include contact information in the message itself, you " "can send your reply via the user’s contact form [2]." @@ -817,16 +844,16 @@ msgstr "" "können Sie Ihre Antwort über das Kontaktformular senden [2]." #: /Users/tobi/Projects/antville/current/code/File/$File.skin:39 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:54 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:56 msgid "" "If you do not specify a name Antville will create one based on the filename." msgstr "" "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des " "Dateinamens erstellen." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:77 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:78 msgid "" -"If you enter a URL here your user name will appear as link next to your " +"If you enter a URL here your username will appear as link next to your " "posted items." msgstr "" "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit " @@ -849,7 +876,7 @@ msgstr "" "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte " "Verbindung mit dem Eigentümer der Website auf." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:111 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:114 msgid "" "If you want to resize the image please specify your desired maximum width " "and/or maximum height in pixels. If you specify both the image will be " @@ -863,16 +890,16 @@ msgstr "" "beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, " "erstellt Antville außerdem automatisch ein Miniaturbild davon." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:161 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:22 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:24 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:176 msgid "Image" msgstr "Bild" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:110 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:113 msgid "Image Dimension Limits" msgstr "Maximale Bildabmessungen" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:187 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:189 #, java-format msgid "Image: {0}" msgstr "Bild: {0}" @@ -898,20 +925,20 @@ msgstr "Importieren" msgid "Import Layout" msgstr "Layout importieren" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1155 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1201 msgid "Import Site Data" msgstr "Site-Daten importieren" #: /Users/tobi/Projects/antville/current/code/File/$File.skin:54 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:78 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:242 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:133 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:80 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:245 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:71 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:132 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:105 msgid "Information" msgstr "Information" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:68 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:101 msgid "Interval" msgstr "Pause" @@ -919,33 +946,37 @@ msgstr "Pause" msgid "JavaScript" msgstr "JavaScript" +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:550 #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:11 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:507 msgid "Jobs" msgstr "Aufträge" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:83 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:86 msgid "Language" msgstr "Sprache" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:248 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:281 msgid "Last Login" msgstr "Letzte Anmeldung" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:45 #: /Users/tobi/Projects/antville/current/code/User/$User.skin:35 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:45 msgid "Last Update" msgstr "Letzte Änderung" #: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:56 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:6 #: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:20 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:50 +#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:6 #, java-format msgid "Last modified by {0} on {1}" msgstr "Zuletzt geändert von {0} am {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:364 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:197 +#, java-format +msgid "Last modified on {0}" +msgstr "Zuletzt geändert am {0}" + +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:328 #, java-format msgid "Last modified {0}" msgstr "Zuletzt geändert {0}" @@ -953,7 +984,7 @@ msgstr "Zuletzt geändert {0}" #: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:22 #: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:189 #: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:34 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:36 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:32 #: /Users/tobi/Projects/antville/current/compat/Layout/Layout.js:33 #: /Users/tobi/Projects/antville/current/compat/Site/Site.js:92 @@ -973,11 +1004,11 @@ msgstr "Protokolleintrag" msgid "Logged in as {0}" msgstr "Angemeldet als {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:175 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:204 msgid "Login" msgstr "Anmeldung" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:62 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:63 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:18 msgid "Login // verb" msgstr "Anmelden" @@ -993,13 +1024,13 @@ msgstr "Anmeldung mit {0}" msgid "Logout // verb" msgstr "Abmelden" +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:88 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 msgid "Manager" msgstr "Redakteur" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:259 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:9 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:228 msgid "Managers" msgstr "Redakteure" @@ -1012,44 +1043,43 @@ msgstr "Markdown" msgid "Member {0}" msgstr "Mitglied {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:22 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:72 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:33 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:22 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:80 msgid "Members" msgstr "Mitglieder" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:162 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:22 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:177 msgid "Membership" msgstr "Mitgliedschaft" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:102 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:104 msgid "Memory" msgstr "Speicher" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:12 #: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:67 msgid "Message" msgstr "Nachricht" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:266 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:300 msgid "Method" msgstr "Methode" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:79 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:27 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:112 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:30 msgid "Mode" msgstr "Modus" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:202 #: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:16 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:16 #: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:21 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:16 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:77 #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:51 +#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:77 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:235 +#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:16 #: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:17 +#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:17 msgid "Modified" msgstr "Geändert" @@ -1065,18 +1095,19 @@ msgstr "Geänderte Skins (sicherer Modus)" msgid "Modified skin" msgstr "Geänderter Skin" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:200 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:246 -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:9 #: /Users/tobi/Projects/antville/current/code/File/$File.skin:38 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:13 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:53 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:192 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:75 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:302 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:233 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:257 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:279 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:55 #: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:15 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 +#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:14 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:222 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:15 +#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:9 msgid "Name" msgstr "Name" @@ -1096,11 +1127,12 @@ msgstr "Nächste Seite" msgid "No differences were found." msgstr "Es wurden keine Unterschiede gefunden." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:90 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:87 msgid "Nobody" msgstr "Niemand" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:94 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:115 msgid "None" msgstr "Keine" @@ -1112,8 +1144,8 @@ msgstr "Noch nicht registriert?" msgid "Note" msgstr "Bemerkung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:251 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:142 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:143 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:254 msgid "Notes" msgstr "Anmerkungen" @@ -1121,12 +1153,12 @@ msgstr "Anmerkungen" msgid "Notification E-Mail" msgstr "E-Mail-Adresse für Benachrichtigungen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:87 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:120 msgid "Notification Period" msgstr "Benachrichtigungsfrist" #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:25 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:99 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:102 msgid "Notifications" msgstr "Benachrichtigungen" @@ -1155,7 +1187,7 @@ msgstr "" "sich den Layout-Bereich anschauen, wo Sie das " "Erscheinungsbild Ihrer Website nach Ihren Wünschen ändern können." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 msgid "Open" msgstr "Offen" @@ -1167,18 +1199,18 @@ msgstr "Optionen" msgid "Original skin" msgstr "Ursprünglicher Skin" +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:88 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 msgid "Owner" msgstr "Besitzer" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:250 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:10 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:219 msgid "Owners" msgstr "Besitzer" #: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:71 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:98 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:99 msgid "PLEASE DO NOT REPLY TO THE SENDER ADDRESS OF THIS MESSAGE." msgstr "" "BITTE VERWENDEN SIE FÜR IHRE ANTWORT NICHT DIE ABSENDE-ADRESSE DIESER " @@ -1189,13 +1221,13 @@ msgstr "" msgid "Page {0} of {1}" msgstr "Seite {0} von {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:51 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:54 msgid "Pagination" msgstr "Seitenumbruch" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:114 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:87 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:42 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:86 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:117 msgid "Password" msgstr "Kennwort" @@ -1203,17 +1235,17 @@ msgstr "Kennwort" msgid "Password forgotten?" msgstr "Kennwort vergessen?" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:76 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:77 msgid "Personal URL" msgstr "Internet-Adresse" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:116 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:119 msgid "Pixels" msgstr "Pixel" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:125 #: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:93 -#: /Users/tobi/Projects/antville/current/code/User/User.js:112 +#: /Users/tobi/Projects/antville/current/code/User/User.js:227 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:129 msgid "Please avoid special characters or HTML code in the name field." msgstr "" "Bitte vermeiden Sie Sonderzeichen oder HTML-Code im Feld für den Namen." @@ -1229,24 +1261,24 @@ msgstr "" #: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:91 msgid "Please choose a prototype and enter a skin name" -msgstr "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin." +msgstr "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin" #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:180 msgid "Please choose a role for this member." msgstr "Bitte wählen Sie eine Rolle für dieses Mitglied." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:113 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:122 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:120 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:137 msgid "Please contact an administrator for further information." msgstr "" "Bitte wenden Sie sich an einen Administrator für weitere Informationen." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1199 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1245 msgid "Please enable JavaScript in your browser for improved functionality." msgstr "" "Bitte aktivieren Sie für optimale Funktionalität JavaScript in Ihrem Browser." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:114 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:118 msgid "Please enter a name for your new site." msgstr "Bitte geben Sie einen Namen für Ihre neue Website ein." @@ -1254,33 +1286,33 @@ msgstr "Bitte geben Sie einen Namen für Ihre neue Website ein." msgid "Please enter a new name for this tag" msgstr "Bitte geben Sie einen neuen Namen für dieses Stichwort an" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:137 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:147 msgid "Please enter a new password." msgstr "Bitte geben Sie ein neues Kennwort ein." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:283 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1007 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:976 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:314 msgid "Please enter a query in the search form." msgstr "Bitte geben Sie eine Suchanfrage in das Suchformular ein." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:111 -msgid "Please enter a user name and e-mail address." -msgstr "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein." +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:121 +msgid "Please enter a username and e-mail address." +msgstr "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:105 +#: /Users/tobi/Projects/antville/current/code/User/User.js:220 msgid "Please enter a username." msgstr "Bitte geben Sie einen Namen ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:429 +#: /Users/tobi/Projects/antville/current/code/User/User.js:666 msgid "Please enter a valid URL" -msgstr "Bitte geben Sie eine gültige Internet-Adresse ein." +msgstr "Bitte geben Sie eine gültige Internet-Adresse ein" -#: /Users/tobi/Projects/antville/current/code/User/User.js:119 -#: /Users/tobi/Projects/antville/current/code/User/User.js:426 +#: /Users/tobi/Projects/antville/current/code/User/User.js:234 +#: /Users/tobi/Projects/antville/current/code/User/User.js:662 msgid "Please enter a valid e-mail address" msgstr "Bitte geben Sie eine gültige E-Mail-Adresse an" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:251 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:253 msgid "Please enter at least something into the “title” or “text” field." msgstr "" "Bitte geben Sie zumindest etwas in eines der beiden Felder »Titel« oder " @@ -1290,7 +1322,6 @@ msgstr "" msgid "Please enter something into the comment field." msgstr "Bitte geben Sie etwas in das Kommentarfeld ein." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:27 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:193 msgid "Please enter the message text." msgstr "Bitte geben Sie einen Nachrichtentext ein." @@ -1299,7 +1330,6 @@ msgstr "Bitte geben Sie einen Nachrichtentext ein." msgid "Please enter the name of the new setting:" msgstr "Bitte geben Sie den Namen der neuen Einstellung ein:" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:4 #: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:59 msgid "Please enter your message to the user below." msgstr "Bitte geben Sie Ihre Nachricht an den Empfänger ein." @@ -1310,8 +1340,8 @@ msgstr "" "Bitte füllen Sie das gesamte Formular aus, um eine gültige Umfrage zu " "erstellen." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:133 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:307 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:309 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:151 msgid "Please login first." msgstr "Bitte melden Sie sich zuerst an." @@ -1325,9 +1355,9 @@ msgstr "" msgid "Please upload a zipped layout archive" msgstr "Bitte laden Sie ein Layout als ZIP-Archiv hoch" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:163 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:22 #: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:86 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:178 +#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:22 msgid "Poll" msgstr "Umfrage" @@ -1351,7 +1381,7 @@ msgstr "Umfragen" msgid "Polls by {0}" msgstr "Umfragen von {0}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:158 #, java-format msgid "Post to {0}" msgstr "Auf {0} veröffentlichen." @@ -1368,13 +1398,13 @@ msgstr "Erstellt von {0} um {1}" msgid "Posted by {0} on {1}" msgstr "Erstellt von {0} am {1}" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:14 -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:139 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:19 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:90 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:15 #: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:10 +#: /Users/tobi/Projects/antville/current/code/File/$File.skin:14 +#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:90 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:19 +#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:139 #: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:25 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:15 msgid "Press CTRL & C to copy to clipboard." msgstr "Drücken Sie CTRL & C, um in die Zwischenablage zu kopieren." @@ -1386,13 +1416,14 @@ msgstr "Vorschau" msgid "Previous page" msgstr "Vorige Seite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:379 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:108 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:115 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:435 +#: /Users/tobi/Projects/antville/current/code/User/User.js:200 msgid "Privileged" msgstr "Privilegiert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:60 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:93 msgid "Probation Period" msgstr "Bewährungsfrist" @@ -1400,11 +1431,12 @@ msgstr "Bewährungsfrist" msgid "Proceed" msgstr "Fortfahren" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 msgid "Public" msgstr "Öffentlich" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:182 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:25 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:190 msgid "Public Sites" msgstr "Öffentliche Websites" @@ -1412,12 +1444,12 @@ msgstr "Öffentliche Websites" msgid "Publish" msgstr "Veröffentlichen" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:89 #: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:14 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:89 msgid "Question" msgstr "Frage" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:107 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:109 msgid "Queue" msgstr "Warteschlange" @@ -1425,43 +1457,49 @@ msgstr "Warteschlange" msgid "Recover your password" msgstr "Wiederherstellung Ihres Kennworts" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:267 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:157 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:301 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:190 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:172 msgid "Reference" msgstr "Bezug" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:995 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1044 msgid "Referrer" msgstr "Rückverweis" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:129 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:132 msgid "Referrer Filter" msgstr "Rückverweis-Filter" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:708 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:37 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:34 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:686 msgid "Referrers" msgstr "Rückverweise" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:110 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:132 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:101 msgid "Register" msgstr "Registrieren" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:247 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:214 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:280 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:244 msgid "Registered" msgstr "Registriert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:257 msgid "Registration" msgstr "Registrierung" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:49 +msgid "Registration & Login" +msgstr "Registrierung & Anmeldung" + +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:94 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:108 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:115 +#: /Users/tobi/Projects/antville/current/code/User/User.js:200 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 msgid "Regular" msgstr "Normal" @@ -1469,28 +1507,29 @@ msgstr "Normal" msgid "Remember Login" msgstr "Anmeldung speichern" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:156 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:166 msgid "Request Password Reset" msgstr "Anfrage zum Zurücksetzen des Kennworts" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:83 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:85 msgid "Requests" msgstr "Aufrufe" #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:52 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:85 msgid "Required Account Status" msgstr "Benötigter Konto-Status" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:190 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:143 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:39 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:976 #: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:68 +#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:39 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:269 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:176 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1025 msgid "Reset" msgstr "Zurücksetzen" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:146 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:156 msgid "Reset Password" msgstr "Kennwort zurücksetzen" @@ -1498,8 +1537,8 @@ msgstr "Kennwort zurücksetzen" msgid "Resource type (e.g. Story or Comment)" msgstr "Art der Ressource (z.B. Beitrag oder Kommentar)" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:101 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:60 msgid "Restricted" msgstr "Eingeschränkt" @@ -1507,10 +1546,10 @@ msgstr "Eingeschränkt" msgid "Results" msgstr "Ergebnis" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:215 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:16 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:7 #: /Users/tobi/Projects/antville/current/code/User/$User.skin:34 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:16 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:245 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:7 msgid "Role" msgstr "Rolle" @@ -1522,18 +1561,18 @@ msgstr "Laufende" msgid "Running Polls" msgstr "Laufende Umfragen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:104 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:69 +#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:29 #: /Users/tobi/Projects/antville/current/code/File/$File.skin:61 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:85 +#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:69 #: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:37 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:182 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:137 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:101 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:87 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:173 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:212 +#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:80 #: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:16 #: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:112 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:170 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:29 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:80 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:100 msgid "Save" msgstr "Speichern" @@ -1541,52 +1580,61 @@ msgstr "Speichern" msgid "Save and Run" msgstr "Speichern und starten" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:974 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1077 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:734 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:41 -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:245 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:712 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1023 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1126 +#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:246 msgid "Search" msgstr "Suche" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:21 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:75 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:295 +#, java-format +msgid "Search with {0}" +msgstr "Mit {0} suchen" + +#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:39 +msgid "Select" +msgstr "Auswählen" + +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:76 msgid "Send" msgstr "Senden" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:164 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:194 msgid "Send Request" msgstr "Anfrage senden" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:71 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:73 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:54 msgid "Separated by commas" msgstr "Durch Komma getrennt" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:74 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:76 msgid "Sessions" msgstr "Sitzungen" #: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:24 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:329 +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:35 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:31 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:341 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1197 msgid "Settings" msgstr "Einstellungen" +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:477 #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:7 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:434 msgid "Setup" msgstr "Konfiguration" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:120 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:121 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:93 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:94 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:207 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:208 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:48 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:49 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:177 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:178 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:92 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:93 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:123 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:124 msgid "Show" msgstr "Anzeigen" @@ -1594,12 +1642,12 @@ msgstr "Anzeigen" msgid "Show Controls" msgstr "Kontrollelemente anzeigen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:195 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:241 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:262 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:148 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:205 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:283 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:295 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:228 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:274 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:181 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:286 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:235 #, java-format msgid "Showing {0} result" msgid_plural "Showing {0} results" @@ -1619,13 +1667,14 @@ msgstr "" "verwalten, alle Aktivitäten zu verfolgen, sowie die Konfiguration zu verändern." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:155 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:22 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:188 #: /Users/tobi/Projects/antville/current/code/User/$User.skin:33 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:170 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:22 msgid "Site" msgstr "Site" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:49 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:82 msgid "Site Creation" msgstr "Erstellen von Websites" @@ -1633,26 +1682,21 @@ msgstr "Erstellen von Websites" msgid "Site Page" msgstr "Basis-Seite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:76 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:109 msgid "Site Phase-Out" msgstr "Automatisches Löschen von Websites" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:782 -msgid "Site is scheduled for export." -msgstr "Die Website ist für den Export eingeplant." - -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:836 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:811 msgid "Site is scheduled for import." msgstr "Die Website ist für den Import eingeplant." +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:578 #: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:536 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:25 msgid "Sites" msgstr "Sites" -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:14 #: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:17 +#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:15 msgid "Size" msgstr "Größe" @@ -1667,29 +1711,32 @@ msgid "Skins" msgstr "Skins" #: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:173 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:868 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:843 msgid "Something went wrong." msgstr "Irgendwas ist schiefgelaufen." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:61 #: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:56 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:61 msgid "Sorry!" msgstr "Hoppla!" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:178 +msgid "Sorry, logging in is currently not possible." +msgstr "Die Anmeldung ist derzeit leider nicht möglich." + #: /Users/tobi/Projects/antville/current/code/File/File.js:134 #, java-format msgid "Sorry, the file exceeds the maximum upload limit of {0} kB." msgstr "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB." -#: /Users/tobi/Projects/antville/current/code/User/User.js:114 +#: /Users/tobi/Projects/antville/current/code/User/User.js:229 msgid "" -"Sorry, the user name you entered already exists. Please enter a different " -"one." +"Sorry, the username you entered already exists. Please enter a different one." msgstr "" -"Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie " -"einen anderslautenden Namen ein." +"Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto " +"registriert. Bitte geben Sie einen anderslautenden Namen ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:110 +#: /Users/tobi/Projects/antville/current/code/User/User.js:225 msgid "" "Sorry, the username you entered is too long. Please choose a shorter one." msgstr "" @@ -1708,21 +1755,18 @@ msgstr "" msgid "Sorry, this layout is not compatible with Antville." msgstr "Leider funktioniert das Layout nicht mit dieser Antville-Installation." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:361 -msgid "Sorry, your input did not match any registered user." -msgstr "" -"Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben." +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:412 +msgid "Sorry, your input did not match any registered account." +msgstr "Leider ist unter diesem Namen kein Konto registriert." -#: /Users/tobi/Projects/antville/current/code/File/File.js:287 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:288 +#: /Users/tobi/Projects/antville/current/code/File/File.js:338 #, java-format msgid "Source: {0}" msgstr "Quelle: {0}" #: /Users/tobi/Projects/antville/current/code/Root/Site.skin:24 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:18 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1216 msgid "Start" msgstr "Start" @@ -1730,23 +1774,22 @@ msgstr "Start" msgid "Start Page" msgstr "Startseite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:249 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:68 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:234 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:124 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:282 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:125 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:70 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:237 msgid "Status" msgstr "Status" +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1216 #: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:115 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 msgid "Stop" msgstr "Beenden" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:26 #: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:22 #: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:68 +#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:26 msgid "Stories" msgstr "Beiträge" @@ -1755,8 +1798,8 @@ msgstr "Beiträge" msgid "Stories by {0}" msgstr "Beiträge von {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:164 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:22 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:179 msgid "Story" msgstr "Beitrag" @@ -1765,6 +1808,14 @@ msgstr "Beitrag" msgid "Story Archive {0} ({1})" msgstr "Beitrags-Archiv {0} ({1})" +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:71 +msgid "Story about Data Privacy Statement" +msgstr "Beitrag über die Datenschutzerklärung" + +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:60 +msgid "Story about Terms and Conditions" +msgstr "Beitrag über die Nutzungsbedingungen" + #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:64 msgid "Stylesheet" msgstr "Stilvorlagen" @@ -1777,37 +1828,37 @@ msgstr "Abonnieren" msgid "Subscribed" msgstr "Abonniert" +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:89 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:53 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:92 msgid "Subscriber" msgstr "Abonnent" +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:277 #: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:246 msgid "Subscribers" msgstr "Abonnenten" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:267 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:10 #: /Users/tobi/Projects/antville/current/code/User/$User.skin:27 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:298 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:10 msgid "Subscriptions" msgstr "Abonnements" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:305 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:336 #, java-format msgid "Successfully added {0} to the list of members." msgstr "{0} wurde erfolgreich zur Liste der Mitglieder hinzugefügt." -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:154 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:162 msgid "Successfully created your site." msgstr "Ihr Website wurde erfolgreich erstellt." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:743 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:721 #, java-format msgid "Successfully subscribed to site {0}." msgstr "Die Website {0} wurde erfolgreich abonniert." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:757 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:735 #, java-format msgid "Successfully unsubscribed from site {0}." msgstr "Das Abonnement der Website {0} wurde erfolgreich storniert." @@ -1816,7 +1867,7 @@ msgstr "Das Abonnement der Website {0} wurde erfolgreich storniert." msgid "Successfully updated the layout." msgstr "Das Layout wurde erfolgreich aktualisiert." -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:426 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:469 msgid "Successfully updated the setup." msgstr "Die Konfiguration wurde erfolgreich aktualisiert." @@ -1833,13 +1884,18 @@ msgstr "Stichwort" msgid "Tag: {0}" msgstr "Stichwort: {0}" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:70 +#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:72 +#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:22 #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:19 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:53 -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:22 msgid "Tags" msgstr "Stichworte" +#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:26 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:68 +msgid "Terms and Conditions" +msgstr "Nutzungsbedingungen" + #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:45 msgid "Text" msgstr "Text" @@ -1852,16 +1908,16 @@ msgstr "" "Danke, Ihre Stimme wurde gezählt. Bis die Umfrage beendet ist, können Sie " "Ihre Meinung jederzeit ändern." +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:219 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1230 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1240 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:107 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:135 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:124 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:156 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:146 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:38 #: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:47 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:145 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:134 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:155 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:123 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:106 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1184 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1194 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:163 msgid "The Management" msgstr "Die Direktion" @@ -1869,6 +1925,21 @@ msgstr "Die Direktion" msgid "The URL endpoint for each of these APIs is located at" msgstr "Die Internet-Adresse für jede dieser Schnittstellen lautet" +#: /Users/tobi/Projects/antville/current/code/User/User.js:568 +msgid "" +"The account data will be available for download from here within the next " +"days." +msgstr "Die Kontodaten stehen demnächst hier zum Download bereit." + +#: /Users/tobi/Projects/antville/current/code/User/User.js:556 +msgid "The account is queued for export." +msgstr "Der Export der Kontodaten wird vorbereitet." + +#: /Users/tobi/Projects/antville/current/code/User/User.js:620 +#, java-format +msgid "The account {0} is being deleted." +msgstr "Das Konto {0} wird gelöscht." + #: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:18 msgid "" "The callback URL will be invoked as an HTTP POST request with the following " @@ -1877,18 +1948,17 @@ msgstr "" "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-" "Methode aufgerufen:" -#: /Users/tobi/Projects/antville/current/code/File/File.js:208 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:201 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:195 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:159 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:320 #: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:157 +#: /Users/tobi/Projects/antville/current/code/File/File.js:208 #: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:99 -#: /Users/tobi/Projects/antville/current/code/User/User.js:390 +#: /Users/tobi/Projects/antville/current/code/User/User.js:522 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:203 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:332 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:159 msgid "The changes were saved successfully." msgstr "Die Änderungen wurden erfolgreich gespeichert." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:118 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:122 msgid "The chosen name is too long. Please enter a shorter one." msgstr "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein." @@ -1907,7 +1977,7 @@ msgstr "" "sie einfach der claustra-Eigenschaft in den app." "properties hinzugefügt bzw. von dort entfernt." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:315 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:317 msgid "The comment was successfully created." msgstr "Der Kommentar wurde erfolgreich erstellt." @@ -1959,7 +2029,15 @@ msgstr "Die Umfrage wurde erfolgreich erstellt." msgid "The poll was updated successfully." msgstr "Die Umfrage wurde erfolgreich aktualisiert." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1157 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:776 +msgid "The site data will be available for download from here, soon." +msgstr "Der Site-Export steht demnächst hier zum Download bereit." + +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:764 +msgid "The site is queued for export." +msgstr "Der Export der Site-Daten wird vorbereitet." + +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1203 #, java-format msgid "" "The site is scheduled for importing the file {0}. The imported site data " @@ -1968,11 +2046,11 @@ msgstr "" "Der Import der Datei {0} ist vorgesehen. Die eingelesenen Daten sind " "innerhalb von 24 Stunden verfügbar." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:121 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:136 msgid "The site you requested has been blocked." msgstr "Die von Ihnen angeforderte Website ist gesperrt." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1179 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1225 #, java-format msgid "" "The site {0} at {1} will be blocked in {2} because it is being restricted " @@ -1981,7 +2059,7 @@ msgstr "" "Die Website {0} unter {1} wird in {2} gesperrt werden, weil sie schon für zu " "lange Zeit eingeschränkt ist." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1189 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1235 #, java-format msgid "" "The site {0} at {1} will be deleted in {2} because it has been considered as " @@ -1990,10 +2068,10 @@ msgstr "" "Die Website {0} unter {1} wird in {2} gelöscht werden, weil sie verlassen zu " "sein scheint." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:345 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:355 #, java-format -msgid "The site {0} is queued for removal." -msgstr "Die Website {0} ist zur Löschung vorgesehen." +msgid "The site {0} is being deleted." +msgstr "Die Website {0} wird gelöscht." #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:63 #, java-format @@ -2004,7 +2082,7 @@ msgstr "Der Beitrag ist {0} und {1}" msgid "The story was successfully created." msgstr "Der Beitrag wurde erfolgreich erstellt." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:225 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:227 msgid "The story was successfully updated." msgstr "Der Beitrag wurde erfolgreich aktualisiert." @@ -2016,7 +2094,7 @@ msgstr "" "Der Titel erscheint im Kopf jeder Seite. Sie können den Titel jederzeit " "ändern." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:139 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:140 #, java-format msgid "" "The user {0} has added your account to the list of members of the site {1} " @@ -2025,7 +2103,7 @@ msgstr "" "Ihr Konto wurde von {0} zur Mitgliederliste der Website {1} unter {2} " "hinzugefügt." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:128 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:129 #, java-format msgid "The user {0} has modified your membership of the site {1} at {2}." msgstr "" @@ -2040,23 +2118,28 @@ msgstr "" "Das {0}-Makro fehlt. Es ist erforderlich, um die Website korrekt " "darzustellen und muss unbedingt in diesem Skin enthalten sein." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:127 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:131 msgid "There already is a site with this name." msgstr "Es gibt bereits eine Website mit diesem Namen." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:785 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:823 +#: /Users/tobi/Projects/antville/current/code/User/User.js:553 +#, java-format +msgid "There is already another job queued for this account: {0}" +msgstr "Für dieses Konto wird bereits ein anderer Auftrag berarbeitet: {0}" + +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:761 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:798 #, java-format msgid "There is already another job queued for this site: {0}" msgstr "Ein anderer Prozess ist für diese Website bereits gereiht: {0}" #: /Users/tobi/Projects/antville/current/code/File/File.js:271 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:267 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:281 msgid "There was nothing to upload. Please be sure to choose a file." msgstr "" "Es gab nichts hochzuladen. Bitte wählen Sie eine Datei zum Hochladen aus." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:152 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:162 msgid "This URL is not valid for resetting your password." msgstr "" "Mit dieser Internet-Adresse können Sie Ihr Kennwort leider nicht " @@ -2079,7 +2162,7 @@ msgstr "Dieser Kommentar wurde vom Autor gelöscht." msgid "This comment was removed." msgstr "Dieser Kommentar wurde gelöscht." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:274 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:288 msgid "This does not seem to be a valid JPG, PNG or GIF image." msgstr "Das scheint kein Bild im JPG-, PNG- oder GIF-Format zu sein." @@ -2109,14 +2192,14 @@ msgstr "" "Diese Nachricht wurde automatisch an Sie versendet, weil Sie als Empfänger " "von Benachrichtigungen für die betreffende Website aufgeführt werden." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:91 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:92 #, java-format msgid "This message was sent to you by an anonymous user of the site {0} [1]." msgstr "" "Diese Nachricht wurde Ihnen von einem unbekannten Absender der Website {0} " "gesendet [1]." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:94 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:95 #, java-format msgid "This message was sent to you by the user {0} of the site {1} [1]." msgstr "Diese Nachricht wurde Ihnen von {0} über die Website {1} gesendet [1]." @@ -2131,11 +2214,6 @@ msgstr "Diese Umfrage wurde {0} von {1} beendet" msgid "This site is currently {0}." msgstr "Die Website ist derzeit {0}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1140 -#, java-format -msgid "This site is going to be deleted completely and irreversibly after {0}." -msgstr "Diese Website wird nach {0} vollständig und unwiderruflich gelöscht." - #: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:67 msgid "" "This skin contains additional JavaScript code that will be included in every " @@ -2173,11 +2251,11 @@ msgid "This skin is used to render the start page of your site." msgstr "" "Dieser Skin wird zur Darstellung der Startseite Ihrer Website verwendet." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:363 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:414 msgid "This user is already a member of this site." msgstr "Dieses Konto ist bereits Mitglied der Website." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:78 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:80 msgid "Threads" msgstr "Prozesse" @@ -2193,13 +2271,19 @@ msgstr "" "Daher werden Sie benachrichtigt, wenn die Website – wie in deren " "Einstellungen angegeben – geändert wird." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:91 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:94 msgid "Time Zone" msgstr "Zeitzone" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:44 +#: /Users/tobi/Projects/antville/current/code/User/User.js:603 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:51 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:164 +msgid "Timeline" +msgstr "Zeitleiste" + #: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:23 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:35 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:44 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:38 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:37 msgid "Title" msgstr "Titel" @@ -2208,11 +2292,10 @@ msgstr "Titel" msgid "Title or name of the site" msgstr "Titel oder Name der Website" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:157 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:213 msgid "To confirm the request please click the link below." msgstr "Bitte klicken Sie den folgenden Link, um die Anfrage zu bestätigen." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:5 #: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:60 msgid "" "To prevent abuse, the sender address and the subject of the e-mail are set " @@ -2237,16 +2320,17 @@ msgstr "Summe" msgid "Total sites hosted here" msgstr "Summe aller Websites" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:121 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:124 msgid "Troll Filter" msgstr "Trollfilter" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:376 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:358 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:94 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:108 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:115 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:411 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:432 +#: /Users/tobi/Projects/antville/current/code/User/User.js:200 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 msgid "Trusted" msgstr "Vertrauenswürdig" @@ -2262,20 +2346,24 @@ msgstr "Internet-Adresse der Ressource" msgid "URL string of the site" msgstr "Internet-Adresse der Website" -#: /Users/tobi/Projects/antville/current/code/User/User.js:223 -#: /Users/tobi/Projects/antville/current/code/User/User.js:233 +#: /Users/tobi/Projects/antville/current/code/User/User.js:343 +#: /Users/tobi/Projects/antville/current/code/User/User.js:353 msgid "Unfortunately, your login failed. Maybe a typo?" msgstr "" "Leider ist Ihre Anmeldung fehlgeschlagen. Haben Sie sich vielleicht vertippt?" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:191 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:237 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:144 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:270 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 msgid "Update" msgstr "Aktualisieren" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:255 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:366 +msgid "Updated Terms & Conditions" +msgstr "Geänderte Nutzungsbedingungen" + #: /Users/tobi/Projects/antville/current/code/User/$User.skin:26 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:286 msgid "Updates" msgstr "Letzte Änderungen" @@ -2287,17 +2375,21 @@ msgstr "" "Laden Sie ein mit Antville 1.1 erstelltes Layout-Archiv (ZIP-Datei) hoch, um " "es in ein mit Antville 1.2 kompatibles Archiv umzuwandeln." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:76 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:78 msgid "Uptime" msgstr "Betriebszeit" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:115 -msgid "User name and e-mail address do not match." -msgstr "" -"Es existiert kein Konto für die angegebene Kombination aus Name und E-Mail-" -"Adresse." +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:180 +msgid "User" +msgstr "Konto" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:115 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:125 +msgid "Username and e-mail address do not match." +msgstr "" +"Für die angegebene Kombination aus Name und E-Mail-Adresse ist kein Konto " +"registriert." + +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:117 msgid "Version" msgstr "Version" @@ -2305,8 +2397,8 @@ msgstr "Version" msgid "Via" msgstr "Via" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:58 #: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:22 +#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:58 msgid "Vote" msgstr "Abstimmen" @@ -2314,7 +2406,7 @@ msgstr "Abstimmen" msgid "Warning!" msgstr "Warnung!" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:150 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:151 #, java-format msgid "" "We are sorry to inform you that the user {0} has cancelled your membership " @@ -2323,17 +2415,26 @@ msgstr "" "Wir bedauern Ihnen mitzuteilen, dass Ihre Mitgliedschaft bei der Website {1} " "unter {2} von {0} beendet wurde." +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:165 +msgid "" +"We have updated our terms and conditions. Please reaffirm you understand and " +"accept the following:" +msgstr "" +"Wir haben unsere Nutzungsbedingungen geändert. Bitte bestätigen Sie im " +"folgenden, dass Sie diese verstehen und akzeptieren:" + #: /Users/tobi/Projects/antville/current/code/Site/Site.skin:10 msgid "Welcome" msgstr "Willkommen" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:116 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:117 #, java-format msgid "Welcome to {0}, {1}!" msgstr "Willkommen bei {0}, {1}!" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:166 -#: /Users/tobi/Projects/antville/current/code/User/User.js:210 +#: /Users/tobi/Projects/antville/current/code/User/User.js:330 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:195 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:360 #, java-format msgid "Welcome to {0}, {1}. Have fun!" msgstr "Willkommen bei {0}, {1}. Viel Spaß!" @@ -2343,12 +2444,12 @@ msgstr "Willkommen bei {0}, {1}. Viel Spaß!" msgid "Welcome to {0}." msgstr "Willkommen bei {0}." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:91 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:100 #, java-format msgid "Welcome to “{0}”, {1}. Have fun!" msgstr "Willkommen bei {0}, {1}. Viel Spaß!" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:98 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:100 msgid "Xml-Rpc Count" msgstr "Xml-Rpc-Aufrufe" @@ -2359,7 +2460,7 @@ msgid_plural "Yes, really erase {0} comments" msgstr[0] "Ja, {0} Kommentar soll wirklich gelöscht werden" msgstr[1] "Ja, {0} Kommentare sollen wirklich gelöscht werden" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:154 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:210 #, java-format msgid "" "You (or someone pretending to be you) requested to reset your account " @@ -2370,7 +2471,7 @@ msgstr "" #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:238 #, java-format -msgid "You are about to delete a comment by user {0}." +msgid "You are about to delete a comment by {0}." msgstr "Sie sind im Begriff, einen Kommentar von {0} zu löschen." #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:236 @@ -2384,37 +2485,46 @@ msgstr "" msgid "You are about to delete a poll by user {0}." msgstr "Sie sind im Begriff, eine Umfrage von {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:773 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:791 #, java-format -msgid "You are about to delete a story by user {0}." +msgid "You are about to delete a story by {0}." msgstr "Sie sind im Begriff, einen Beitrag von {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/User/User.js:409 +#: /Users/tobi/Projects/antville/current/code/User/User.js:630 #, java-format msgid "You are about to delete the account {0}." msgstr "Sie sind im Begriff, das Konto {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/File/File.js:354 +#: /Users/tobi/Projects/antville/current/code/File/File.js:367 #, java-format msgid "You are about to delete the file {0}." msgstr "Sie sind im Begriff, die Datei {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:565 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:607 #, java-format msgid "You are about to delete the image {0}." msgstr "Sie sind im Begriff, das Bild {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:275 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:277 #, java-format -msgid "You are about to delete the membership of user {0}." +msgid "You are about to delete the membership of {0}." msgstr "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:403 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:413 #, java-format msgid "You are about to delete the site {0}." msgstr "Sie sind im Begriff, die Website {0} zu löschen." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:261 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:183 +#, java-format +msgid "" +"You are about to delete the whole account which currently contains {0}, {1}, " +"{2}, {3}, {4} and {5}." +msgstr "" +"Sie sind im Begriff, das komplette Konto zu löschen, das zur Zeit {0}, {1}, " +"{2}, {3}, {4} und {5} umfasst." + +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:264 #, java-format msgid "" "You are about to delete the whole site which currently contains {0}, {1}, " @@ -2433,7 +2543,7 @@ msgstr "Sie sind im Begriff, das Layout der Website {0} zurückzusetzen." msgid "You are about to reset the skin {0}.{1}." msgstr "Sie sind im Begriff, den Skin {0}.{1} zurückzusetzen." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:768 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:746 #, java-format msgid "You are about to unsubscribe from the site {0}." msgstr "Sie sind im Begriff, das Abonnement der Website {0} zu löschen." @@ -2442,7 +2552,7 @@ msgstr "Sie sind im Begriff, das Abonnement der Website {0} zu löschen." msgid "You are going to discard unsaved content." msgstr "Sie sind im Begriff, ungesicherte Inhalte zu verwerfen." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:140 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:156 msgid "You are not allowed to access this part of the site." msgstr "" "Sie sind leider nicht berechtigt, auf diesen Teil der Website zuzugreifen." @@ -2451,13 +2561,13 @@ msgstr "" msgid "You are not logged in" msgstr "Sie sind nicht angemeldet" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:142 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:131 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:132 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:143 #, java-format msgid "You are now {0} of the site." msgstr "Sie sind ab sofort {0} der Website." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:118 +#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:119 msgid "" "You can edit your account profile and change its password any time via the " "following link:" @@ -2465,13 +2575,13 @@ msgstr "" "Über folgenden Link können Sie jederzeit Ihr Konto bearbeiten und Ihr " "Kennwort ändern:" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:139 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:172 msgid "You can filter the results by account. Use the asterisk * as wildcard." msgstr "" "Sie können die Ergebnisse nach Konten filtern. Verwenden sie den Asterisk * " "als Platzhalter." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:232 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:265 msgid "" "You can filter the results by name or by e-mail address. Use the asterisk * " "as wildcard." @@ -2479,19 +2589,23 @@ msgstr "" "Sie können die Ergebnisse nach Name oder E-Mail-Adresse bearbeiten. Benutzen " "Sie den Asterisk * als Platzhalter." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:186 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:219 msgid "" "You can filter the results by site name. Use the asterisk * as wildcard." msgstr "" "Sie können die Ergebnisse nach Website-Namen filtern. Verwenden sie den " "Asterisk * als Platzhalter." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:193 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:223 msgid "You can use the asterisk * as wildcard." msgstr "Sie können den Asterisk * als Platzhalter verwenden." -#: /Users/tobi/Projects/antville/current/code/User/User.js:433 -msgid "You cannot revoke permissions from the only privileged user." +#: /Users/tobi/Projects/antville/current/code/User/User.js:674 +msgid "You cannot delete a privileged account." +msgstr "Ein privilegiertes Konto kann nicht gelöscht werden." + +#: /Users/tobi/Projects/antville/current/code/User/User.js:671 +msgid "You cannot revoke permissions from the only privileged account." msgstr "" "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen." @@ -2505,39 +2619,36 @@ msgstr "" "Sie haben noch nicht abgestimmt. Sie können abstimmen, bis die Umfrage " "beendet ist." -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:390 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:399 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:401 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:410 #, java-format msgid "You need to wait {0} before you are allowed to create a new site." msgstr "Sie müssen {0} warten, bevor Sie eine neue Website erstellen können." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:158 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:214 msgid "You will then be asked to change your password." msgstr "Sie werden dann gebeten, Ihr Kennwort zu ändern." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:112 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:119 msgid "Your account has been blocked." msgstr "Ihr Konto wurde gesperrt." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:33 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:198 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:199 msgid "Your message was sent successfully." msgstr "Ihre Nachricht wurde erfolgreich gesendet." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:141 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:151 msgid "Your password was changed." msgstr "Ihr Kennwort wurde geändert." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:32 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:197 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:198 #, java-format -msgid "[{0}] Message from anonymous user" +msgid "[{0}] Message from anonymous" msgstr "[{0}] Nachricht von unbekanntem Absender" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:31 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:196 +#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:197 #, java-format -msgid "[{0}] Message from user {1}" +msgid "[{0}] Message from {1}" msgstr "[{0}] Nachricht von {1}" #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:87 @@ -2545,33 +2656,33 @@ msgstr "[{0}] Nachricht von {1}" msgid "[{0}] Notification of membership cancellation" msgstr "[{0}] Benachrichtigung über Beendigung der Mitgliedschaft" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:304 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:335 #: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:184 #, java-format msgid "[{0}] Notification of membership change" msgstr "[{0}] Benachrichtigung über Änderung der Mitgliedschaft" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:249 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:265 #, java-format msgid "[{0}] Notification of site changes" msgstr "[{0}] Benachrichtigung über Änderung der Website" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:119 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:129 #, java-format msgid "[{0}] Password reset confirmation" msgstr "[{0}] Bestätigung zum Zurücksetzen des Kennworts" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:213 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:235 #, java-format msgid "[{0}] Warning: Site will be blocked" msgstr "[{0}] Warnung: Website wird gesperrt" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:187 +#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:209 #, java-format msgid "[{0}] Warning: Site will be deleted" msgstr "[{0}] Warnung: Website wird gelöscht" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:90 +#: /Users/tobi/Projects/antville/current/code/Members/Members.js:99 #, java-format msgid "[{0}] Welcome to {1}!" msgstr "[{0}] Willkommen bei {1}!" @@ -2593,7 +2704,7 @@ msgstr "einen Kommentar" msgid "a file // accusative" msgstr "eine Datei" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:24 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:26 msgid "a image // accusative" msgstr "ein Bild" @@ -2617,8 +2728,8 @@ msgstr "eine Website" msgid "a skin // accusative" msgstr "einen Skin" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:24 +#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 msgid "a story // accusative" msgstr "einen Beitrag" @@ -2630,28 +2741,28 @@ msgstr "ein Stichwort" msgid "a vote" msgstr "eine Stimme" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 #: /Users/tobi/Projects/antville/current/code/User/User.js:23 msgid "account" msgstr "Konto" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:256 msgid "all" msgstr "alle" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 msgid "any" msgstr "beliebig" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:212 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:258 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:165 msgid "ascending" msgstr "aufsteigend" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:256 msgid "blocked" msgstr "gesperrt" @@ -2659,16 +2770,16 @@ msgstr "gesperrt" msgid "choice" msgstr "Antwortmöglichkeit" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:83 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:80 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:78 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:92 +#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 msgid "closed" msgstr "geschlossen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:23 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 msgid "comment" msgstr "Kommentar" @@ -2676,48 +2787,55 @@ msgstr "Kommentar" msgid "comment // verb" msgstr "Kommentieren" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 msgid "content" msgstr "Inhalt" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:211 msgid "created" msgstr "erstellt" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:63 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:71 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:90 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:98 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:69 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:96 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:104 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:123 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:67 msgid "days" msgstr "Tage" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:29 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:256 msgid "deleted" msgstr "gelöscht" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:212 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:258 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:165 msgid "descending" msgstr "absteigend" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:76 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:98 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:73 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:95 msgid "disabled" msgstr "deaktiviert" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:106 +#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:109 msgid "e-mail" msgstr "E-Mail" +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:63 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:74 +#, java-format +msgid "e.g. {0}" +msgstr "z.B. {0}" + #: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:18 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:66 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:77 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:146 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:77 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:99 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:74 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:96 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:69 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:80 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:149 msgid "enabled" msgstr "aktiviert" @@ -2729,8 +2847,8 @@ msgstr "Exportieren" msgid "featured" msgstr "sichtbar" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 #: /Users/tobi/Projects/antville/current/code/File/File.js:23 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 msgid "file" msgstr "Datei" @@ -2738,7 +2856,7 @@ msgstr "Datei" msgid "files" msgstr "Dateien" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:957 msgid "free" msgstr "frei" @@ -2746,8 +2864,8 @@ msgstr "frei" msgid "hidden" msgstr "versteckt" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:23 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 +#: /Users/tobi/Projects/antville/current/code/Image/Image.js:25 msgid "image" msgstr "Bild" @@ -2763,7 +2881,49 @@ msgstr "Importieren" msgid "in" msgstr "in" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1117 +#, java-format +msgid "in {0} day" +msgid_plural "in {0} days" +msgstr[0] "in {0} Tag" +msgstr[1] "in {0} Tagen" + +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1113 +#, java-format +msgid "in {0} hour" +msgid_plural "in {0} hours" +msgstr[0] "in {0} Stunde" +msgstr[1] "in {0} Stunden" + +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1111 +#, java-format +msgid "in {0} minute" +msgid_plural "in {0} minutes" +msgstr[0] "in {0} Minute" +msgstr[1] "in {0} Minuten" + +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1121 +#, java-format +msgid "in {0} month" +msgid_plural "in {0} months" +msgstr[0] "in {0} Monat" +msgstr[1] "in {0} Monaten" + +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1119 +#, java-format +msgid "in {0} week" +msgid_plural "in {0} weeks" +msgstr[0] "in {0} Woche" +msgstr[1] "in {0} Wochen" + +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1123 +#, java-format +msgid "in {0} year" +msgid_plural "in {0} years" +msgstr[0] "in {0} Jahr" +msgstr[1] "in {0} Jahren" + +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:257 msgid "last login" msgstr "letzte Anmeldung" @@ -2771,7 +2931,7 @@ msgstr "letzte Anmeldung" msgid "layout" msgstr "Layout" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 msgid "link" msgstr "Verknüpfung" @@ -2787,18 +2947,18 @@ msgstr "Mitglieder" msgid "membership" msgstr "Mitgliedschaft" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:211 msgid "modified" msgstr "geändert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:211 msgid "name" msgstr "Name" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:94 +#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 msgid "open" msgstr "offen" @@ -2810,7 +2970,7 @@ msgstr "Besitzer" msgid "pending" msgstr "anhängig" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 #: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:23 msgid "poll" msgstr "Umfrage" @@ -2823,13 +2983,13 @@ msgstr "Umfragen" msgid "posted // has posted" msgstr "veröffentlichte" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:256 msgid "privileged" msgstr "privilegiert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 #: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:84 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:81 #: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 msgid "public" msgstr "öffentlich" @@ -2840,14 +3000,13 @@ msgstr "schreibgeschützt" #: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:24 msgid "remove" -msgstr "" -"Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis." +msgstr "löschen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 msgid "restricted" msgstr "eingeschränkt" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1106 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1162 msgid "right now" msgstr "vor kurzem" @@ -2855,7 +3014,7 @@ msgstr "vor kurzem" msgid "shared" msgstr "geteilt" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:164 #: /Users/tobi/Projects/antville/current/code/Site/Site.js:23 msgid "site" msgstr "Website" @@ -2868,9 +3027,12 @@ msgstr "Skin" msgid "skins" msgstr "Skins" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:70 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1109 +msgid "soon" +msgstr "in Kürze" + #: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:23 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:58 msgid "stories" msgstr "Beiträge" @@ -2886,8 +3048,12 @@ msgstr "Stichwort" msgid "tags" msgstr "Stichworte" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1115 +msgid "tomorrow" +msgstr "morgen" + +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:210 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:256 msgid "trusted" msgstr "vertrauenswürdig" @@ -2895,7 +3061,7 @@ msgstr "vertrauenswürdig" msgid "updated // has updated" msgstr "aktualisierte" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: /Users/tobi/Projects/antville/current/code/Site/Site.js:957 msgid "used" msgstr "benutzt" @@ -2903,127 +3069,124 @@ msgstr "benutzt" msgid "vote" msgstr "Stimme" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1112 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1168 msgid "yesterday" msgstr "gestern" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:138 -#, java-format -msgid "{0} 401 Error" -msgstr "{0} Fehler 401" - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:245 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:136 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:137 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:248 #, java-format msgid "{0} Comment" msgid_plural "{0} Comments" msgstr[0] "{0} Kommentar" msgstr[1] "{0} Kommentare" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:247 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:138 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:139 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:250 #, java-format msgid "{0} File" msgid_plural "{0} Files" msgstr[0] "{0} Datei" msgstr[1] "{0} Dateien" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:246 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:137 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:138 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:249 #, java-format msgid "{0} Image" msgid_plural "{0} Images" msgstr[0] "{0} Bild" msgstr[1] "{0} Bilder" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:105 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:107 #, java-format msgid "{0} MB free" msgstr "{0} MB frei" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:104 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:106 #, java-format msgid "{0} MB total" msgstr "{0} MB gesamt" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:134 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:135 #, java-format msgid "{0} Site" msgid_plural "{0} Sites" msgstr[0] "{0} Website" msgstr[1] "{0} Websites" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:244 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:135 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:136 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:247 #, java-format msgid "{0} Story" msgid_plural "{0} Stories" msgstr[0] "{0} Beitrag" msgstr[1] "{0} Beiträge" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:222 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:255 #, java-format msgid "{0} accounts sorted by {1} in {2} order." msgstr "Typ: {0} Sortierung: {1} {2}" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:80 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:82 #, java-format msgid "{0} active" msgstr "{0} aktiv" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:130 +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:163 #, java-format msgid "{0} activity sorted by date in {1} order." msgstr "Typ: {0} Sortierung: Datum {1}" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:111 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:113 #, java-format msgid "{0} callback" msgid_plural "{0} callbacks" msgstr[0] "{0} Rückruf" msgstr[1] "{0} Rückrufe" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:531 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:545 #, java-format msgid "{0} character" msgid_plural "{0} characters" msgstr[0] "{0} Zeichen" msgstr[1] "{0} Zeichen" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:263 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:559 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:186 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:266 +#: /Users/tobi/Projects/antville/current/code/Story/Story.js:573 #, java-format msgid "{0} comment" msgid_plural "{0} comments" msgstr[0] "{0} Kommentar" msgstr[1] "{0} Kommentare" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:77 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:391 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:400 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1181 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1191 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:79 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:402 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:411 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1227 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1237 #, java-format msgid "{0} day" msgid_plural "{0} days" msgstr[0] "{0} Tag" msgstr[1] "{0} Tage" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1114 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1170 #, java-format msgid "{0} day ago" msgid_plural "{0} days ago" msgstr[0] "vor {0} Tag" msgstr[1] "vor {0} Tagen" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:265 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:188 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:268 #, java-format msgid "{0} file" msgid_plural "{0} files" msgstr[0] "{0} Datei" msgstr[1] "{0} Dateien" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:81 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:83 #, java-format msgid "{0} free" msgstr "{0} frei" @@ -3038,93 +3201,103 @@ msgstr "{0} hat {1} zur Website {2} hinzugefügt:" msgid "{0} has modified {1} at the site {2}:" msgstr "{0} hat {1} auf der Website {2} geändert:" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1110 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1166 #, java-format msgid "{0} hour ago" msgid_plural "{0} hours ago" msgstr[0] "vor {0} Stunde" msgstr[1] "vor {0} Stunden" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:264 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:187 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:267 #, java-format msgid "{0} image" msgid_plural "{0} images" msgstr[0] "{0} Bild" msgstr[1] "{0} Bilder" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:86 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:91 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:88 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:93 #, java-format msgid "{0} in the last 5 min." msgstr "{0} in den letzten 5 Min." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:114 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:116 #, java-format msgid "{0} log entries" msgstr "{0} Protokolleinträge" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:110 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:112 #, java-format msgid "{0} mail" msgid_plural "{0} mails" msgstr[0] "{0} Nachrichten" msgstr[1] "{0} Nachrichten" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1108 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1164 #, java-format msgid "{0} minute ago" msgid_plural "{0} minutes ago" msgstr[0] "vor {0} Minute" msgstr[1] "vor {0} Minuten" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1118 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1174 #, java-format msgid "{0} month ago" msgid_plural "{0} months ago" msgstr[0] "vor {0} Monat" msgstr[1] "vor {0} Monaten" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:101 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:103 #, java-format msgid "{0} of {1} objects" msgstr "{0} von {1} Objekten" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:58 #, java-format msgid "{0} per page" msgstr "{0} pro Seite" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:266 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:189 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:269 #, java-format msgid "{0} poll" msgid_plural "{0} polls" msgstr[0] "{0} Umfrage" msgstr[1] "{0} Umfragen" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:99 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:109 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:5 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:101 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:111 #: /Users/tobi/Projects/antville/current/code/Story/Story.skin:75 +#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:5 #, java-format msgid "{0} request" msgid_plural "{0} requests" msgstr[0] "{0} Aufruf" msgstr[1] "{0} Aufrufe" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:176 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:184 +#, java-format +msgid "{0} site" +msgid_plural "{0} sites" +msgstr[0] "{0} Website" +msgstr[1] "{0} Websites" + +#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:209 #, java-format msgid "{0} sites sorted by {1} in {2} order." msgstr "Typ: {0} Sortierung: {1} {2}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:262 +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:185 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:265 #, java-format msgid "{0} story" msgid_plural "{0} stories" msgstr[0] "{0} Beitrag" msgstr[1] "{0} Beiträge" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:85 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:90 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:87 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:92 #, java-format msgid "{0} total" msgstr "{0} gesamt" @@ -3137,33 +3310,33 @@ msgid_plural "{0} votes" msgstr[0] "{0} Stimme" msgstr[1] "{0} Stimmen" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:171 +#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:188 #, java-format msgid "{0} was successfully deleted." msgstr "{0} wurde erfolgreich gelöscht." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 #: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 #, java-format msgid "{0} was successfully reset." msgstr "{0} wurde erfolgreich zurückgesetzt." -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1116 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1172 #, java-format msgid "{0} week ago" msgid_plural "{0} weeks ago" msgstr[0] "vor {0} Woche" msgstr[1] "vor {0} Wochen" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1120 +#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1176 #, java-format msgid "{0} year ago" msgid_plural "{0} years ago" msgstr[0] "vor {0} Jahr" msgstr[1] "vor {0} Jahren" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:129 #: /Users/tobi/Projects/antville/current/code/Root/Root.js:137 +#: /Users/tobi/Projects/antville/current/code/Root/Root.js:145 #, java-format msgid "{0} {1} Error" msgstr "{0} {1} Fehler" @@ -3175,16 +3348,72 @@ msgid "" "{Antville}”" msgstr "{0} {2} {1} {3} in {4}" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:96 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:98 #, java-format msgid "{0}% in the last 5 min." msgstr "{0}% in den letzten 5 Min." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:95 +#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:97 #, java-format msgid "{0}% total" msgstr "{0}% gesamt" +#: /Users/tobi/Projects/antville/current/code/User/$User.skin:154 +#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1191 +#, java-format +msgid "{0}Download the archive{1} or click “Export” to create a new one." +msgstr "" +"{0}Laden Sie das Archiv herunter{1} oder klicken Sie »Exportieren«, um ein " +"neues zu erstellen." + +#~ msgid "Browse" +#~ msgstr "Blättern" + +#~ msgid "Click to cancel deletion" +#~ msgstr "Löschauftrag widerrufen" + +#~ msgid "Deleted Site" +#~ msgstr "Gelöschte Site" + +#~ msgid "Scheduled for deletion {0}" +#~ msgstr "Zur Löschung {0} vorgesehen" + +#~ msgid "This site is going to be deleted completely and irreversibly {0}." +#~ msgstr "Diese Website wird {0} vollständig und unwiderruflich gelöscht." + +#~ msgid "" +#~ "You still can revert the request for deletion in the {0}site settings{1}." +#~ msgstr "" +#~ "Sie können den Löschauftrag in den {0}Site-Einstellungen{1} widerrufen." + +#~ msgid "" +#~ "Currently, it is not possible to delete an account. Please accept our " +#~ "humble apologies." +#~ msgstr "" +#~ "Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um " +#~ "Verständnis." + +#~ msgid "" +#~ "A Blogger export file (.xml) will be created and available for download " +#~ "from here within 24 hours." +#~ msgstr "" +#~ "Eine Blogger-Export-Datei (.xml) wird erstellt und steht hier spätestens " +#~ "nach 24 Stunden zum Download bereit." + +#~ msgid "Download the file {0} or klick “Start” to create a new one." +#~ msgstr "" +#~ "Laden Sie die Datei {0} herunter oder klicken Sie »Start«, um eine neue " +#~ "zu erstellen." + +#~ msgid "Site is scheduled for export." +#~ msgstr "Die Website ist für den Export eingeplant." + +#~ msgid "{0} 401 Error" +#~ msgstr "{0} Fehler 401" + +#~ msgid "Login Mode" +#~ msgstr "Anmeldemodus" + #~ msgid "ID" #~ msgstr "ID" diff --git a/i18n/de.po b/i18n/de.po index dc57a78d..a4d3fbfc 100644 --- a/i18n/de.po +++ b/i18n/de.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: Antville-1.5\n" "Report-Msgid-Bugs-To: mail@antville.org\n" -"POT-Creation-Date: 2015-08-10 16:26+0200\n" -"PO-Revision-Date: 2015-08-10 16:26+0200\n" +"POT-Creation-Date: 2020-06-14 16:31+0200\n" +"PO-Revision-Date: 2020-06-14 16:33+0200\n" "Last-Translator: Tobi Schäfer \n" "Language-Team: The Antville People \n" "Language: de\n" @@ -27,156 +27,136 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.4\n" +"X-Generator: Poedit 2.0.6\n" "X-Poedit-SourceCharset: UTF-8\n" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:948 +#: Global/Global.js:987 #, java-format msgid "({0} character)" msgid_plural "({0} characters)" msgstr[0] "({0} Zeichen)" msgstr[1] "({0} Zeichen)" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:802 -msgid "" -"A Blogger export file (.xml) will be created and available for download from " -"here within 24 hours." -msgstr "" -"Eine Blogger-Export-Datei (.xml) wird erstellt und steht hier spätestens " -"nach 24 Stunden zum Download bereit." - -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:124 +#: Members/Members.js:143 msgid "A confirmation mail was sent to your e-mail address." msgstr "Eine Bestätigungs-Nachricht wurde an Ihre E-Mail-Adresse geschickt." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:7 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:62 +#: Membership/$Membership.skin:62 msgid "A generic disclaimer will be automatically appended to your message." msgstr "Ein allgemeiner Hinweis wird der Nachricht automatisch hinzugefügt." -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:101 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:30 +#: Root/Site.skin:32 Api/Api.js:101 msgid "API" msgstr "API" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Abandoned" msgstr "Verwaist" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:268 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:154 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:15 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:15 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:20 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:98 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:213 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:153 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:33 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:203 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:8 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:46 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:76 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:16 -#: /Users/tobi/Projects/antville/current/code/User/User.js:22 +#: Members/$Members.skin:153 +msgid "Accept" +msgstr "Akzeptieren" + +#: Images/$Images.skin:20 Membership/Membership.skin:8 User/User.js:22 +#: User/$User.skin:148 Root/$Root.skin:46 Admin/$Admin.skin:291 +#: Admin/$Admin.skin:175 Skins/$Skins.skin:76 Files/$Files.skin:16 +#: Comments/$Comments.skin:15 Stories/$Stories.skin:16 +#: Members/$Members.skin:165 Members/$Members.skin:48 Members/$Members.skin:225 +#: Members/$Members.skin:92 Polls/$Polls.skin:15 msgid "Account" msgstr "Konto" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:60 +#: User/$User.skin:61 msgid "Account Image" msgstr "Kontobild" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:9 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:556 +#: User/$User.skin:190 +msgid "Account is being deleted" +msgstr "Konto wird gelöscht" + +#: Admin/Admin.js:598 Admin/$Admin.skin:9 msgid "Accounts" msgstr "Konten" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:8 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:496 +#: Admin/Admin.js:539 Admin/$Admin.skin:8 msgid "Activity" msgstr "Aktivität" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:100 +#: Poll/$Poll.skin:100 msgid "Add Choice" msgstr "Antwortmöglichkeit hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:324 +#: Story/Story.js:329 msgid "Add Comment" msgstr "Kommentar hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:69 +#: Files/Files.js:69 msgid "Add File" msgstr "Datei hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:90 +#: Images/Images.js:90 msgid "Add Image" msgstr "Bild hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:314 +#: Members/Members.js:352 msgid "Add Member" msgstr "Mitglied hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:78 +#: Polls/Polls.js:78 msgid "Add Poll" msgstr "Umfrage hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:167 +#: Root/Root.js:181 msgid "Add Site" msgstr "Site hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:110 +#: Skins/Skins.js:110 msgid "Add Skin" msgstr "Skin hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:25 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:94 +#: Site/Site.skin:25 Stories/Stories.js:94 msgid "Add Story" msgstr "Beitrag hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:74 +#: Poll/$Poll.skin:74 msgid "Add Your Vote" msgstr "Stimmen Sie ab" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:327 +#: Comment/Comment.js:331 msgid "Admin" msgstr "Verwaltung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:231 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:121 +#: Site/$Site.skin:279 User/$User.skin:110 msgid "Administration" msgstr "Vewaltung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:107 +#: Site/$Site.skin:131 msgid "Advanced" msgstr "Erweitert" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:7 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:6 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:6 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:52 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:6 +#: Images/$Images.skin:7 Skins/$Skins.skin:52 Files/$Files.skin:6 +#: Comments/$Comments.skin:7 Stories/$Stories.skin:6 Members/$Members.skin:6 +#: Polls/$Polls.skin:6 msgid "All" msgstr "Alle" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:58 +#: Polls/Polls.js:58 msgid "All Polls" msgstr "Alle Umfragen" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:135 +#: Skins/Skins.js:135 msgid "All Skins" msgstr "Alle Skins" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:267 +#: Site/$Site.skin:315 User/$User.skin:178 msgid "All of this will be deleted irreversibly." msgstr "All das wird unwiderruflich gelöscht werden." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:62 +#: Root/$Root.skin:62 msgid "An error occurred while processing your request." msgstr "Bei der Bearbeitung der Anfrage ist ein Fehler aufgetreten." -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:3 +#: Root/Site.skin:3 #, java-format msgid "" "Antville is an open source project aimed at the development of a simple site " @@ -185,7 +165,7 @@ msgstr "" "Antville ist ein quelloffenes Projekt zum einfachen Veröffentlichen von " "Websites und bietet einige besondere Merkmale." -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:37 +#: Api/$Api.skin:37 msgid "" "Antville itself provides a default callback URL invoking the basic ping " "method of the weblogs.com API." @@ -193,16 +173,16 @@ msgstr "" "Antville selbst bietet eine standardmäßige Rückruf-Adresse, welche die Ping-" "Methode der Website weblogs.com aufruft." -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:3 +#: Api/$Api.skin:3 msgid "Antville supports the following application programming interfaces:" msgstr "" "Antville unterstützt folgende Schnittstellen zur Anwendungsprogrammierung:" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:72 +#: Site/$Site.skin:88 msgid "Archive" msgstr "Archiv" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1049 +#: Site/$Site.skin:1180 msgid "" "Are you sure you want to add this URL to the referrer filter? Edit it below " "to filter a pattern only." @@ -210,411 +190,328 @@ msgstr "" "Sind Sie sicher, dass Sie diesen Rückverweis filtern wollen? Sie können ihn " "bearbeiten, um ein Schema zu filtern." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:268 +#: Site/$Site.skin:316 User/$User.skin:179 msgid "Are you sure you want to proceed?" msgstr "Sind Sie sicher, dass Sie fortfahren wollen?" -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:36 +#: Tags/$Tags.skin:28 msgid "Are you sure you want to remove this tag?" msgstr "Sind Sie sicher, dass Sie das Stichwort {0} entfernen wollen?" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:50 +#: Skins/$Skins.skin:50 msgid "Basic" msgstr "Grundlegende" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:79 +#: Skins/Skins.js:79 msgid "Basic Skins" msgstr "Grundlegende Skins" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:37 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:46 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:144 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:133 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:154 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1183 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1193 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:162 +#: Membership/$Membership.skin:106 Membership/$Membership.skin:134 +#: Membership/$Membership.skin:155 Membership/$Membership.skin:145 +#: Site/$Site.skin:1303 Site/$Site.skin:1313 User/$User.skin:206 +#: HopObject/$HopObject.skin:37 HopObject/$HopObject.skin:46 msgid "Best regards." msgstr "Beste Grüße." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:355 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:373 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Site/Site.js:53 User/User.js:213 Admin/$Admin.skin:417 Admin/$Admin.skin:396 msgid "Blocked" msgstr "Gesperrt" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:152 +#: Site/$Site.skin:185 msgid "Bookmarklet" msgstr "Bookmarklet" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Both" msgstr "Beides" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:39 -msgid "Browse" -msgstr "Blättern" - -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:117 +#: Root/$Root.skin:119 msgid "Build" msgstr "Gestalt" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:100 +#: Root/$Root.skin:102 msgid "Cache" msgstr "Zwischenspeicher" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:13 -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:123 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:140 +#: Site/$Site.skin:171 Api/Api.js:123 Api/$Api.skin:13 msgid "Callback URL" msgstr "Rückruf-Adresse" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:23 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:106 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:70 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:64 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:22 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:88 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:106 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:40 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:134 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:165 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:64 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:200 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:183 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:18 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:77 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:120 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:279 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1172 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1151 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:173 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:69 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:32 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:83 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:103 -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:13 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:9 +#: Membership/$Membership.skin:18 Membership/$Membership.skin:78 +#: Site/$Site.skin:1292 Site/$Site.skin:327 Site/$Site.skin:1269 +#: Site/$Site.skin:212 User/$User.skin:104 User/$User.skin:146 +#: Poll/$Poll.skin:120 File/$File.skin:64 Root/$Root.skin:33 +#: HopObject/$HopObject.skin:22 Image/$Image.skin:90 Story/Story.skin:83 +#: Admin/$Admin.skin:139 Skin/$Skin.skin:72 Skin/$Skin.skin:32 +#: Layout/$Layout.skin:115 Layout/$Layout.skin:89 Comment/Comment.skin:70 +#: Members/$Members.skin:212 Members/$Members.skin:195 +#: Members/$Members.skin:177 Members/$Members.skin:79 Members/$Members.skin:125 +#: Members/$Members.skin:155 ../compat/Site/$Site.skin:10 +#: ../compat/Layout/$Layout.skin:13 msgid "Cancel" msgstr "Abbrechen" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:263 +#: Story/Story.js:268 #, java-format msgid "Cannot parse timestamp {0} as a date." msgstr "Der Zeitstempel {0} kann nicht in ein Datum überführt werden." -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:22 +#: Choice/Choice.js:22 msgid "Choice" msgstr "Antwortmöglichkeit" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:95 +#: Poll/$Poll.skin:95 msgid "Choices" msgstr "Antwortmöglichkeiten" -#: /Users/tobi/Projects/antville/current/code/Claustra/Claustra.js:78 +#: Claustra/Claustra.js:78 msgid "Claustra" msgstr "Claustra" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:16 +#: HopObject/$HopObject.skin:16 msgid "Click “Cancel” now if you are not really sure you want to proceed." msgstr "" "Klicken Sie jetzt auf »Abbrechen«, falls Sie nicht sicher sind, ob Sie " "fortfahren möchten." -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:70 +#: ../compat/Story/Story.js:70 msgid "Close" msgstr "Schließen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:8 +#: Site/Site.js:60 Stories/$Stories.skin:8 msgid "Closed" msgstr "Geschlossen" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:107 +#: Stories/Stories.js:107 msgid "Closed Stories" msgstr "Geschlossene Beiträge" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:22 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:62 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:159 +#: HopObject/HopObject.js:173 Comment/Comment.js:22 Comment/Comment.skin:62 msgid "Comment" msgstr "Kommentar" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:31 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:61 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:21 +#: Site/Site.skin:21 Site/$Site.skin:75 Comments/Comments.js:31 msgid "Comments" msgstr "Kommentare" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:43 +#: Comments/Comments.js:43 #, java-format msgid "Comments by {0}" msgstr "Kommentare von {0}" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:67 +#: Story/Story.skin:67 #, java-format msgid "Comments of the story are {0}" msgstr "Kommentare zum Beitrag sind {0}" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:31 +#: Skin/$Skin.skin:31 msgid "Compare" msgstr "Vergleichen" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:266 +#: Skin/Skin.js:266 #, java-format msgid "Compare {0}" msgstr "Vergleichen {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:180 +#: HopObject/HopObject.js:201 msgid "Confirm Deletion" msgstr "Löschen bestätigen" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:254 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:209 +#: Skin/Skin.js:209 Layout/Layout.js:255 msgid "Confirm Reset" msgstr "Zurücksetzen bestätigen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:766 +#: Site/Site.js:732 msgid "Confirm Unsubscribe" msgstr "Stornierung bestätigen" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:32 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:39 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:46 -#, java-format -msgid "Connect with {0}" -msgstr "Mit {0} verbinden" - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:101 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:172 -#, java-format -msgid "Connecting with {0} failed. {1} Please try again." -msgstr "" -"Die Verbindung mit {0} ist fehlgeschlagen. {1} Bitte versuchen Sie es erneut." - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:94 -msgid "Connections" -msgstr "Verbindungen" - -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:22 +#: Site/Site.skin:22 Root/Site.skin:28 msgid "Contact" msgstr "Kontakt" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:41 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:208 +#: Membership/Membership.js:216 #, java-format msgid "Contact {0}" msgstr "{0} kontaktieren" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:14 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:15 +#: Comments/$Comments.skin:14 Stories/$Stories.skin:15 msgid "Content" msgstr "Inhalt" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:219 +#: Membership/Membership.js:228 #, java-format msgid "Content of Member {0}" msgstr "Beiträge von Mitglied {0}" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Contributor" msgstr "Autorin" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:8 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:237 +#: Members/$Members.skin:8 Members/Members.js:275 msgid "Contributors" msgstr "Autorinnen" -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:12 +#: ../compat/Layout/$Layout.skin:12 msgid "Convert" msgstr "Umwandeln" -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.convert.js:42 +#: ../compat/Layout/Layout.convert.js:42 msgid "Convert Layout" msgstr "Layout umwandeln" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:212 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:233 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:239 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:244 -#, java-format -msgid "Could not connect with Facebook. ({0})" -msgstr "Die Verbindung mit Facebook ist fehlgeschlagen. ({0})" - -#: /Users/tobi/Projects/antville/current/code/File/File.js:268 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:264 +#: File/File.js:265 Image/Image.js:286 msgid "Could not fetch the file from the given URL." msgstr "Die Datei konnte nicht von der angegebenen Adresse gelesen werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:556 +#: Image/Image.js:606 msgid "Could not remove the image file from disk." msgstr "Die Bild-Datei konnte nicht von der Festplatte entfernt werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:512 +#: Image/Image.js:562 msgid "Could not resize the image." msgstr "Die Bildgröße konnte nicht angepasst werden." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:538 +#: Image/Image.js:588 msgid "Could not save the image file on disk." msgstr "Die Bild-Datei konnte nicht auf die Festplatte geschrieben werden." -#: /Users/tobi/Projects/antville/current/code/User/User.js:129 +#: User/User.js:258 msgid "Could not verify your password. Please repeat your input." msgstr "" "Ihr Kennwort konnte nicht bestätigt werden. Bitte wiederholen Sie Ihre " "Eingabe." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:31 +#: Root/$Root.skin:31 msgid "Create" msgstr "Erstellen" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:6 +#: Root/Site.skin:6 msgid "Create a site. It only takes a few clicks." msgstr "Erstellen Sie Ihre eigene Website mit ein paar Mausklicks." -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:525 +#: Global/Global.js:552 msgid "Create missing file" msgstr "Fehlende Datei hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:572 +#: Global/Global.js:599 msgid "Create missing image" msgstr "Fehlendes Bild hinzufügen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:201 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:156 +#: User/$User.skin:159 Admin/$Admin.skin:222 Admin/$Admin.skin:177 msgid "Created" msgstr "Erstellt" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:3 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:17 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:48 +#: Site/$Site.skin:18 HopObject/$HopObject.skin:3 #, java-format msgid "Created by {0} on {1}" msgstr "Erstellt von {0} am {1}" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:12 +#: Site/Site.skin:12 #, java-format msgid "Created by {0} on {1}." msgstr "Erstellt von {0} am {1}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:363 +#: User/$User.skin:183 +#, java-format +msgid "Created on {0}" +msgstr "Erstellt am {0}" + +#: Site/$Site.skin:372 #, java-format msgid "Created {0}" msgstr "Erstellt {0}" -#: /Users/tobi/Projects/antville/current/code/User/User.js:67 -msgid "" -"Currently, it is not possible to remove an account. Please accept our humble " -"apologies." -msgstr "" -"Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis." +#: Root/Site.skin:27 Members/$Members.skin:84 +msgid "Data Privacy Statement" +msgstr "Datenschutzerklärung" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:28 +#: Admin/$Admin.skin:287 +msgid "Date" +msgstr "Datum" + +#: Api/$Api.skin:28 msgid "Date string in Unix timestamp format" msgstr "Datum im Unix-Format" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:63 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:87 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:119 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:172 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:82 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:102 +#: Site/$Site.skin:211 User/$User.skin:103 Poll/$Poll.skin:119 +#: File/$File.skin:63 Image/$Image.skin:89 Story/Story.skin:82 msgid "Delete" msgstr "Löschen" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 +#: Site/Site.js:53 User/User.js:213 Admin/$Admin.skin:402 Admin/$Admin.skin:414 msgid "Deleted" msgstr "Gelöscht" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:10 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:47 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:62 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:43 +#: User/$User.skin:192 +#, java-format +msgid "Deleted on {0}" +msgstr "Gelöscht am {0}" + +#: Site/$Site.skin:53 File/$File.skin:47 Image/$Image.skin:64 +#: Claustra/$Claustra.skin:10 msgid "Description" msgstr "Beschreibung" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:72 +#: Root/$Root.skin:74 msgid "Details" msgstr "Einzelheiten" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:31 +#: Root/Site.skin:33 msgid "Development" msgstr "Entwicklung" -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:19 +#: Images/$Images.skin:19 msgid "Dimensions" msgstr "Abmessungen" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:981 +#: Site/$Site.skin:1110 msgid "Disable filter" msgstr "Filter aufheben" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Disabled" msgstr "Deaktiviert" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:30 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:37 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:44 -#, java-format -msgid "Disconnect from {0}" -msgstr "Verbindung mit {0} trennen" - -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:41 +#: Admin/$Admin.skin:41 msgid "Disk Quota" msgstr "Speicherplatzanteil" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:160 +#: Site/$Site.skin:195 msgid "Disk Space" msgstr "Speicherplatz" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:173 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:219 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:127 +#: Admin/$Admin.skin:194 Admin/$Admin.skin:240 Admin/$Admin.skin:148 msgid "Display" msgstr "Anzeige" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Recaptcha/Recaptcha.js:32 +#: Global/Captcha.js:44 msgid "Do Androids dream of electric sheep?" msgstr "Zählen Androiden elektrische Schäfchen?" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1145 -#, java-format -msgid "Download the file {0} or klick “Start” to create a new one." -msgstr "" -"Laden Sie die Datei {0} herunter oder klicken Sie »Start«, um eine neue zu " -"erstellen." - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 msgid "Drag to Bookmarks Bar" msgstr "In die Lesezeichenleiste ziehen" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:20 +#: ../compat/Members/Members.js:20 msgid "" -"Due to security reasons user passwords are not stored in the Antville " -"database any longer. Thus, your password cannot be sent to you, anymore." +"Due to security reasons passwords are not stored in the Antville database " +"any longer. Thus, your password cannot be sent to you, anymore." msgstr "" "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-" "Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:159 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:67 +#: User/$User.skin:68 Members/$Members.skin:171 msgid "E-mail" msgstr "E-Mail" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:16 +#: Root/$Root.skin:16 #, java-format msgid "E.g. if you enter {0} here your site will be reachable via {1}" msgstr "" "Wenn Sie z.B. {0} als Name eingeben, wird die Website unter dieser " "Adresse erreichbar sein: {1}" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:15 +#: Api/$Api.skin:15 msgid "" "Each Antville site provides a setting to define a callback URL that will be " "invoked each time the site content has changed. This way users can define " @@ -627,48 +524,45 @@ msgstr "" "verschiedene Ereignisse individuell behandeln – auf einem Server und in " "einer Programmiersprache ihrer Wahl." -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:15 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:29 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:67 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:24 +#: Poll/$Poll.skin:29 Image/Image.skin:15 Story/Story.skin:24 +#: Skin/$Skin.skin:70 msgid "Edit" msgstr "Bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:174 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:48 +#: Comment/Comment.js:176 Comment/Comment.skin:48 msgid "Edit Comment" msgstr "Kommentar bearbeiten" -#: /Users/tobi/Projects/antville/current/code/File/File.js:217 +#: File/File.js:214 msgid "Edit File" msgstr "Datei bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:210 +#: Image/Image.js:212 msgid "Edit Image" msgstr "Bild bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:170 +#: Poll/Poll.js:170 msgid "Edit Poll" msgstr "Umfrage bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:234 +#: Story/Story.js:239 msgid "Edit Story" msgstr "Beitrag bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:982 +#: Site/$Site.skin:1111 msgid "Edit the filter in the site settings." msgstr "Der Filter kann in den Einstellungen bearbeitet werden." -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:169 +#: Skin/Skin.js:169 #, java-format msgid "Edit {0}.{1}" msgstr "{0}.{1} bearbeiten" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:11 +#: Claustra/$Claustra.skin:11 msgid "Enabled" msgstr "Aktiviert" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:134 +#: Site/$Site.skin:164 #, java-format msgid "" "Enter one filter {0}pattern{1} per line to be applied on every URL in the " @@ -677,7 +571,7 @@ msgstr "" "Geben Sie ein {0}Filter-Schema{1} pro Zeile ein, das für jede Adresse in den " "Rückverweis-Listen angewendet werden soll." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:149 +#: Members/$Members.skin:161 msgid "" "Enter your username and the e-mail address you have used when you " "registered. You will then receive a confirmation e-mail containing further " @@ -687,128 +581,126 @@ msgstr "" "Registrierung verwendet haben. Ihnen wird dann eine Nachricht mit weiteren " "Anleitungen zugestellt." -#: /Users/tobi/Projects/antville/current/code/Comment/$Comment.skin:20 +#: Comment/$Comment.skin:20 #, java-format msgid "Erase all comments of user {0}" msgstr "Alle Kommentare von {0} löschen" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:93 +#: Root/$Root.skin:95 msgid "Error Ratio" msgstr "Fehler-Rate" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:88 +#: Root/$Root.skin:90 msgid "Errors" msgstr "Fehler" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:8 +#: Site/$Site.skin:1269 Site/$Site.skin:26 User/$User.skin:52 +#: User/$User.skin:146 Layout/$Layout.skin:10 msgid "Export" msgstr "Exportieren" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1143 +#: User/$User.skin:140 +msgid "Export Account Data" +msgstr "Kontodaten exportieren" + +#: Site/$Site.skin:1263 msgid "Export Site Data" msgstr "Site-Daten exportieren" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:30 -#: /Users/tobi/Projects/antville/current/code/File/File.js:22 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:160 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:45 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1162 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:82 +#: Site/$Site.skin:1282 File/File.js:22 File/$File.skin:30 +#: HopObject/HopObject.js:174 Image/$Image.skin:47 Story/$Story.skin:96 msgid "File" msgstr "Datei" -#: /Users/tobi/Projects/antville/current/code/File/File.js:258 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:254 +#: File/File.js:255 Image/Image.js:256 msgid "File size is exceeding the upload limit." msgstr "Die Dateigröße überschreitet die Upload-Grenze." -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:22 -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:79 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:28 +#: Site/Site.skin:28 Files/Files.js:22 Files/Files.js:79 msgid "Files" msgstr "Dateien" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:89 +#: Files/Files.js:89 #, java-format msgid "Files by {0}" msgstr "Dateien von {0}" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:185 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:231 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:138 +#: Admin/$Admin.skin:206 Admin/$Admin.skin:252 Admin/$Admin.skin:159 msgid "Filter" msgstr "Filtern" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:198 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:277 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:7 +#: Site/$Site.skin:325 Members/$Members.skin:210 ../compat/Site/$Site.skin:8 msgid "Find" msgstr "Finden" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:289 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:722 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1020 +#: Site/Site.js:688 Site/Site.js:968 Members/Members.js:327 #, java-format msgid "Found more than {0} results. Please try a more specific query." msgstr "" "Mehr als {0} Ergebnisse gefunden. Bitte versuchen Sie es mit einer genaueren " "Suchanfrage." -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:20 +#: Site/Site.skin:20 msgid "Galleries" msgstr "Galerien" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:22 +#: Admin/$Admin.skin:22 msgid "General" msgstr "Allgemein" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:183 +#: Members/Members.js:221 #, java-format msgid "Good bye, {0}! Looking forward to seeing you again!" msgstr "Auf Wiedersehen, {0}! Schauen Sie bald wieder vorbei!" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:95 +#: Admin/$Admin.skin:128 msgid "Grace Period" msgstr "Gnadenfrist" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:214 +#: Story/$Story.skin:229 msgid "HTML" msgstr "HTML" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:17 +#: User/$User.skin:17 msgid "Have a lot of fun!" msgstr "Viel Vergnügen!" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:122 +#: Membership/$Membership.skin:123 msgid "Have fun!" msgstr "Viele Späße!" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:280 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:29 +#: Root/Site.skin:31 Root/Root.js:295 msgid "Health" msgstr "Statusmonitor" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:32 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:41 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:137 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:126 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:148 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1177 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1187 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:152 +#: Membership/$Membership.skin:127 Membership/$Membership.skin:149 +#: Membership/$Membership.skin:138 Site/$Site.skin:1297 Site/$Site.skin:1307 +#: User/$User.skin:196 HopObject/$HopObject.skin:32 +#: HopObject/$HopObject.skin:41 #, java-format msgid "Hello {0}." msgstr "Hallo {0}." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:119 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:47 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:176 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:91 -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:68 +#: Root/$Root.skin:123 +msgid "Helma Version" +msgstr "Helma-Version" + +#: User/$User.skin:92 Members/$Members.skin:188 Members/$Members.skin:62 +#: Members/$Members.skin:113 ../compat/Story/Story.js:68 msgid "Hide" msgstr "Verstecken" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:100 +#: Members/$Members.skin:141 +#, java-format +msgid "I understand and accept the {0}data privacy statement{1}" +msgstr "Ich verstehe und akzeptiere die {0}Datenschutzerklärung{1}" + +#: Members/$Members.skin:133 +#, java-format +msgid "I understand and accept the {0}terms and conditions{1}" +msgstr "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}" + +#: Membership/$Membership.skin:101 msgid "" "If the user did not include contact information in the message itself, you " "can send your reply via the user’s contact form [2]." @@ -816,23 +708,22 @@ msgstr "" "Falls die Absenderin der Nachricht keine Kontaktinformationen hinzugefügt " "hat, können Sie Ihre Antwort über das Kontaktformular senden [2]." -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:39 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:54 +#: File/$File.skin:39 Image/$Image.skin:56 msgid "" "If you do not specify a name Antville will create one based on the filename." msgstr "" "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des " "Dateinamens erstellen." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:77 +#: User/$User.skin:78 msgid "" -"If you enter a URL here your user name will appear as link next to your " +"If you enter a URL here your username will appear as link next to your " "posted items." msgstr "" "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit " "verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen." -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:21 +#: ../compat/Members/Members.js:21 #, java-format msgid "" "If you should really have forgotten your password, you can use the zurücksetzen lassen." -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:77 +#: Global/$Global.skin:59 msgid "" "If you think you have received this e-mail in error please contact the " "maintainer of the site." @@ -849,7 +740,7 @@ msgstr "" "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte " "Verbindung mit der Eigentümerin der Website auf." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:111 +#: Site/$Site.skin:136 msgid "" "If you want to resize the image please specify your desired maximum width " "and/or maximum height in pixels. If you specify both the image will be " @@ -863,282 +754,238 @@ msgstr "" "beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, " "erstellt Antville außerdem automatisch ein Miniaturbild davon." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:161 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:22 +#: HopObject/HopObject.js:175 Image/Image.js:24 msgid "Image" msgstr "Bild" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:110 +#: Site/$Site.skin:135 msgid "Image Dimension Limits" msgstr "Maximale Bildabmessungen" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:187 +#: Image/Image.js:189 #, java-format msgid "Image: {0}" msgstr "Bild: {0}" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:22 -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:64 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:27 +#: Images/Images.js:22 Images/Images.js:64 Site/Site.skin:27 +#: Layout/$Layout.skin:8 msgid "Images" msgstr "Bilder" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:105 +#: Images/Images.js:105 #, java-format msgid "Images by {0}" msgstr "Bilder von {0}" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:104 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:7 +#: Layout/$Layout.skin:113 Layout/$Layout.skin:9 msgid "Import" msgstr "Importieren" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:311 +#: Layout/Layout.js:312 msgid "Import Layout" msgstr "Layout importieren" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1155 +#: Site/$Site.skin:1275 msgid "Import Site Data" msgstr "Site-Daten importieren" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:54 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:78 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:242 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:71 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:132 +#: Site/$Site.skin:290 User/$User.skin:121 Poll/$Poll.skin:105 +#: File/$File.skin:54 Image/$Image.skin:80 Story/Story.skin:71 msgid "Information" msgstr "Information" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:68 +#: Admin/$Admin.skin:101 msgid "Interval" msgstr "Pause" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:66 +#: Skins/$Skins.skin:66 msgid "JavaScript" msgstr "JavaScript" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:11 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:507 +#: Admin/Admin.js:550 Admin/$Admin.skin:11 msgid "Jobs" msgstr "Aufträge" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:83 +#: Site/$Site.skin:101 msgid "Language" msgstr "Sprache" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:248 +#: Admin/$Admin.skin:269 msgid "Last Login" msgstr "Letzte Anmeldung" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:45 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:35 +#: User/$User.skin:35 Root/$Root.skin:45 msgid "Last Update" msgstr "Letzte Änderung" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:56 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:20 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:50 +#: Site/$Site.skin:21 HopObject/$HopObject.skin:6 Comment/Comment.skin:56 #, java-format msgid "Last modified by {0} on {1}" msgstr "Zuletzt geändert von {0} am {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:364 +#: User/$User.skin:185 +#, java-format +msgid "Last modified on {0}" +msgstr "Zuletzt geändert am {0}" + +#: Site/$Site.skin:373 #, java-format msgid "Last modified {0}" msgstr "Zuletzt geändert {0}" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:22 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:189 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:34 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:32 -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.js:33 -#: /Users/tobi/Projects/antville/current/compat/Site/Site.js:92 +#: Site/Site.skin:32 Root/Site.skin:36 Layout/Layout.js:22 Layout/Layout.js:189 +#: Layout/Layout.js:245 ../compat/Site/Site.js:92 ../compat/Layout/Layout.js:33 msgid "Layout" msgstr "Layout" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:111 +#: Images/Images.js:111 msgid "Layout Images" msgstr "Layout-Bilder" -#: /Users/tobi/Projects/antville/current/code/LogEntry/LogEntry.js:22 +#: LogEntry/LogEntry.js:22 msgid "Log Entry" msgstr "Protokolleintrag" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:3 +#: Membership/Membership.skin:3 #, java-format msgid "Logged in as {0}" msgstr "Angemeldet als {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:175 +#: Members/Members.js:213 msgid "Login" msgstr "Anmeldung" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:62 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:18 +#: Membership/Membership.skin:18 Members/$Members.skin:77 msgid "Login // verb" msgstr "Anmelden" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:13 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:16 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:19 -#, java-format -msgid "Login with {0}" -msgstr "Anmeldung mit {0}" - -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:7 +#: Membership/Membership.skin:7 msgid "Logout // verb" msgstr "Abmelden" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Manager" msgstr "Redakteurin" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:9 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:228 +#: Members/$Members.skin:9 Members/Members.js:266 msgid "Managers" msgstr "Redakteurinnen" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:215 +#: Story/$Story.skin:230 msgid "Markdown" msgstr "Markdown" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:168 +#: Membership/Membership.js:168 #, java-format msgid "Member {0}" msgstr "Mitglied {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:22 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:72 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:33 +#: Site/Site.skin:33 Members/Members.js:22 Members/Members.js:80 msgid "Members" msgstr "Mitglieder" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:162 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:22 +#: Membership/Membership.js:22 HopObject/HopObject.js:176 msgid "Membership" msgstr "Mitgliedschaft" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:102 +#: Root/$Root.skin:104 msgid "Memory" msgstr "Speicher" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:12 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:67 +#: Membership/$Membership.skin:67 msgid "Message" msgstr "Nachricht" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:266 +#: Admin/$Admin.skin:288 msgid "Method" msgstr "Methode" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:79 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:27 +#: Site/$Site.skin:33 Admin/$Admin.skin:224 Admin/$Admin.skin:112 msgid "Mode" msgstr "Modus" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:202 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:16 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:16 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:21 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:16 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:77 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:51 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:17 +#: Images/$Images.skin:21 Admin/$Admin.skin:223 Skins/$Skins.skin:51 +#: Skins/$Skins.skin:77 Files/$Files.skin:17 Comments/$Comments.skin:16 +#: Stories/$Stories.skin:17 Polls/$Polls.skin:16 msgid "Modified" msgstr "Geändert" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:119 +#: Skins/Skins.js:119 msgid "Modified Skins" msgstr "Geänderte Skins" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:142 +#: Skins/Skins.js:142 msgid "Modified Skins (Safe Mode)" msgstr "Geänderte Skins (sicherer Modus)" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:78 +#: Skin/$Skin.skin:81 msgid "Modified skin" msgstr "Geänderter Skin" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:200 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:246 -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:9 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:38 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:13 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:53 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:192 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:75 -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:15 +#: Tags/$Tags.skin:17 File/$File.skin:38 Root/$Root.skin:6 Image/$Image.skin:55 +#: Admin/$Admin.skin:290 Admin/$Admin.skin:221 Admin/$Admin.skin:245 +#: Admin/$Admin.skin:267 Skins/$Skins.skin:75 Files/$Files.skin:14 +#: Members/$Members.skin:204 Members/$Members.skin:15 Claustra/$Claustra.skin:9 msgid "Name" msgstr "Name" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:30 +#: Api/$Api.skin:30 msgid "Name of the account that triggered the event" msgstr "Name des Kontos, von welchem das Ereignis ausgelöst wurde" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:62 +#: Skins/$Skins.skin:62 msgid "Navigation" msgstr "Navigation" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:72 +#: ../compat/Global/aspects.js:72 msgid "Next page" msgstr "Nächste Seite" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:221 +#: Skin/Skin.js:221 msgid "No differences were found." msgstr "Es wurden keine Unterschiede gefunden." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:90 +#: Site/Site.js:87 msgid "Nobody" msgstr "Niemand" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 +#: Admin/Admin.js:94 Admin/Admin.js:115 msgid "None" msgstr "Keine" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:37 +#: Members/$Members.skin:52 msgid "Not registered yet?" msgstr "Noch nicht registriert?" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 msgid "Note" msgstr "Bemerkung" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:251 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:142 +#: Site/$Site.skin:299 User/$User.skin:131 msgid "Notes" msgstr "Anmerkungen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:33 +#: Admin/$Admin.skin:33 msgid "Notification E-Mail" msgstr "E-Mail-Adresse für Benachrichtigungen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:87 +#: Admin/$Admin.skin:120 msgid "Notification Period" msgstr "Benachrichtigungsfrist" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:25 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:99 +#: Site/$Site.skin:121 Admin/$Admin.skin:25 msgid "Notifications" msgstr "Benachrichtigungen" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:12 +#: Root/Site.skin:12 msgid "Number of public sites" msgstr "Anzahl öffentlicher Websites" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:24 +#: Api/$Api.skin:24 msgid "Numeric identifier of the resource" msgstr "Numerischer Schlüssel der Ressource" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:14 +#: User/$User.skin:14 #, java-format msgid "" "Of course, you can now also start to add stories, upload " @@ -1155,70 +1002,71 @@ msgstr "" "sich den Layout-Bereich anschauen, wo Sie das " "Erscheinungsbild Ihrer Website nach Ihren Wünschen ändern können." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Open" msgstr "Offen" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:61 +#: Story/Story.skin:61 msgid "Options" msgstr "Optionen" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:80 +#: Skin/$Skin.skin:83 msgid "Original skin" msgstr "Ursprünglicher Skin" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Owner" msgstr "Besitzerin" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:10 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:219 +#: Members/$Members.skin:10 Members/Members.js:257 msgid "Owners" msgstr "Besitzerinnen" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:71 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:98 +#: Membership/$Membership.skin:99 Global/$Global.skin:53 msgid "PLEASE DO NOT REPLY TO THE SENDER ADDRESS OF THIS MESSAGE." msgstr "" "BITTE VERWENDEN SIE FÜR IHRE ANTWORT NICHT DIE ABSENDE-ADRESSE DIESER " "NACHRICHT." -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:97 +#: Archive/Archive.js:97 #, java-format msgid "Page {0} of {1}" msgstr "Seite {0} von {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:51 +#: Site/$Site.skin:63 msgid "Pagination" msgstr "Seitenumbruch" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:114 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:42 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:86 +#: User/$User.skin:87 Members/$Members.skin:57 Members/$Members.skin:108 msgid "Password" msgstr "Kennwort" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:51 +#: Members/$Members.skin:66 msgid "Password forgotten?" msgstr "Kennwort vergessen?" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:76 +#: User/$User.skin:77 msgid "Personal URL" msgstr "Internet-Adresse" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:116 +#: Site/$Site.skin:142 msgid "Pixels" msgstr "Pixel" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:125 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:93 -#: /Users/tobi/Projects/antville/current/code/User/User.js:112 +#: Members/Members.js:368 +msgid "Please accept the data privacy statement." +msgstr "Bitte akzeptieren Sie die Datenschutzerklärung." + +#: Members/Members.js:364 +msgid "Please accept the terms and conditions." +msgstr "Bitte akzeptieren Sie die Nutzungsbedingungen." + +#: Site/Site.js:122 User/User.js:241 Skins/Skins.js:93 msgid "Please avoid special characters or HTML code in the name field." msgstr "" "Bitte vermeiden Sie Sonderzeichen oder HTML-Code im Feld für den Namen." -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:13 +#: HopObject/$HopObject.skin:13 msgid "" "Please be aware of the fact that there is no “undo”, so if you click " "“Proceed” below the changes will be applied irreversibly." @@ -1227,386 +1075,342 @@ msgstr "" "werden kann. Wenn Sie also auf »Fortfahren« klicken, werden die Änderungen " "unwiderruflich durchgeführt." -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:91 +#: Skins/Skins.js:91 msgid "Please choose a prototype and enter a skin name" -msgstr "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin." +msgstr "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:180 +#: Membership/Membership.js:180 msgid "Please choose a role for this member." msgstr "Bitte wählen Sie eine Rolle für dieses Mitglied." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:113 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:122 +#: HopObject/HopObject.js:120 HopObject/HopObject.js:137 msgid "Please contact an administrator for further information." msgstr "" "Bitte wenden Sie sich an eine Administratorin für weitere Informationen." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1199 +#: Site/$Site.skin:1319 msgid "Please enable JavaScript in your browser for improved functionality." msgstr "" "Bitte aktivieren Sie für optimale Funktionalität JavaScript in Ihrem Browser." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:114 +#: Site/Site.js:111 msgid "Please enter a name for your new site." msgstr "Bitte geben Sie einen Namen für Ihre neue Website ein." -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:27 +#: Tags/$Tags.skin:23 msgid "Please enter a new name for this tag" msgstr "Bitte geben Sie einen neuen Namen für dieses Stichwort an" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:137 +#: Members/Members.js:156 msgid "Please enter a new password." msgstr "Bitte geben Sie ein neues Kennwort ein." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:283 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1007 +#: Site/Site.js:955 Members/Members.js:321 msgid "Please enter a query in the search form." msgstr "Bitte geben Sie eine Suchanfrage in das Suchformular ein." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:111 -msgid "Please enter a user name and e-mail address." -msgstr "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein." +#: Members/Members.js:130 +msgid "Please enter a username and e-mail address." +msgstr "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:105 +#: User/User.js:234 msgid "Please enter a username." msgstr "Bitte geben Sie einen Namen ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:429 +#: User/User.js:678 msgid "Please enter a valid URL" -msgstr "Bitte geben Sie eine gültige Internet-Adresse ein." +msgstr "Bitte geben Sie eine gültige Internet-Adresse ein" -#: /Users/tobi/Projects/antville/current/code/User/User.js:119 -#: /Users/tobi/Projects/antville/current/code/User/User.js:426 +#: User/User.js:248 User/User.js:674 msgid "Please enter a valid e-mail address" msgstr "Bitte geben Sie eine gültige E-Mail-Adresse an" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:251 +#: Story/Story.js:256 msgid "Please enter at least something into the “title” or “text” field." msgstr "" "Bitte geben Sie zumindest etwas in eines der beiden Felder »Titel« oder " "»Text« ein." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:203 +#: Comment/Comment.js:202 msgid "Please enter something into the comment field." msgstr "Bitte geben Sie etwas in das Kommentarfeld ein." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:27 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:193 +#: Membership/Membership.js:193 msgid "Please enter the message text." msgstr "Bitte geben Sie einen Nachrichtentext ein." -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:56 +#: Layout/$Layout.skin:37 msgid "Please enter the name of the new setting:" msgstr "Bitte geben Sie den Namen der neuen Einstellung ein:" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:4 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:59 +#: Membership/$Membership.skin:59 msgid "Please enter your message to the user below." msgstr "Bitte geben Sie Ihre Nachricht an die Empfängerin ein." -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:196 +#: Poll/Poll.js:196 msgid "Please fill out the whole form to create a valid poll." msgstr "" "Bitte füllen Sie das gesamte Formular aus, um eine gültige Umfrage zu " "erstellen." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:133 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:307 +#: HopObject/HopObject.js:150 Story/Story.js:312 msgid "Please login first." msgstr "Bitte melden Sie sich zuerst an." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 +#: Root/$Root.skin:6 msgid "Please note that you cannot change the name after the site was created." msgstr "" "Bitte beachten Sie, dass Sie den Namen nicht mehr ändern können, nachdem die " "Website erstellt wurde." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:276 +#: Layout/Layout.js:277 msgid "Please upload a zipped layout archive" msgstr "Bitte laden Sie ein Layout als ZIP-Archiv hoch" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:163 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:22 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:86 +#: Poll/Poll.js:22 HopObject/HopObject.js:177 Story/$Story.skin:101 msgid "Poll" msgstr "Umfrage" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:226 +#: Poll/Poll.js:226 #, java-format msgid "Poll Results: {0}" msgstr "Umfrage-Ergebnis: {0}" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:133 +#: Poll/Poll.js:133 #, java-format msgid "Poll: {0}" msgstr "Umfrage: {0}" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:22 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:29 +#: Site/Site.skin:29 Polls/Polls.js:22 msgid "Polls" msgstr "Umfragen" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:89 +#: Polls/Polls.js:89 #, java-format msgid "Polls by {0}" msgstr "Umfragen von {0}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 #, java-format msgid "Post to {0}" msgstr "Auf {0} veröffentlichen." -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:15 +#: Story/Story.skin:15 #, java-format msgid "Posted by {0} at {1}" msgstr "Erstellt von {0} um {1}" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:53 -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:4 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:24 +#: Poll/$Poll.skin:24 Image/Image.skin:4 Comment/Comment.skin:53 #, java-format msgid "Posted by {0} on {1}" msgstr "Erstellt von {0} am {1}" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:14 -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:139 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:19 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:90 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:15 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:25 +#: Poll/$Poll.skin:15 File/$File.skin:14 Global/i18n.js:139 +#: Image/$Image.skin:19 Story/$Story.skin:25 Skin/$Skin.skin:10 +#: Layout/$Layout.skin:99 msgid "Press CTRL & C to copy to clipboard." msgstr "Drücken Sie CTRL & C, um in die Zwischenablage zu kopieren." -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:213 +#: Story/$Story.skin:228 msgid "Preview" msgstr "Vorschau" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:69 +#: ../compat/Global/aspects.js:69 msgid "Previous page" msgstr "Vorige Seite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:379 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: User/User.js:214 Admin/Admin.js:108 Admin/Admin.js:115 Admin/$Admin.skin:423 msgid "Privileged" msgstr "Privilegiert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:60 +#: Admin/$Admin.skin:93 msgid "Probation Period" msgstr "Bewährungsfrist" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:21 +#: HopObject/$HopObject.skin:21 msgid "Proceed" msgstr "Fortfahren" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Public" msgstr "Öffentlich" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:182 +#: Root/Site.skin:25 Root/Root.js:196 msgid "Public Sites" msgstr "Öffentliche Websites" -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:66 +#: ../compat/Story/Story.js:66 msgid "Publish" msgstr "Veröffentlichen" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:89 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:14 +#: Poll/$Poll.skin:89 Polls/$Polls.skin:14 msgid "Question" msgstr "Frage" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:107 +#: Root/$Root.skin:109 msgid "Queue" msgstr "Warteschlange" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:19 +#: ../compat/Members/Members.js:19 msgid "Recover your password" msgstr "Wiederherstellung Ihres Kennworts" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:267 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:157 +#: User/$User.skin:160 Admin/$Admin.skin:289 Admin/$Admin.skin:178 msgid "Reference" msgstr "Bezug" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:995 +#: Site/$Site.skin:1124 msgid "Referrer" msgstr "Rückverweis" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:129 +#: Site/$Site.skin:158 msgid "Referrer Filter" msgstr "Rückverweis-Filter" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:708 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:34 +#: Site/Site.js:674 Site/Site.skin:34 Root/Site.skin:37 msgid "Referrers" msgstr "Rückverweise" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:132 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:101 +#: Members/$Members.skin:123 Members/Members.js:119 msgid "Register" msgstr "Registrieren" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:247 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:214 +#: Admin/$Admin.skin:268 Members/$Members.skin:226 msgid "Registered" msgstr "Registriert" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: Admin/$Admin.skin:245 msgid "Registration" msgstr "Registrierung" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Admin/$Admin.skin:49 +msgid "Registration & Login" +msgstr "Registrierung & Anmeldung" + +#: Site/Site.js:54 User/User.js:214 Admin/Admin.js:94 Admin/Admin.js:108 +#: Admin/Admin.js:115 msgid "Regular" msgstr "Normal" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:56 +#: Members/$Members.skin:71 msgid "Remember Login" msgstr "Anmeldung speichern" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:156 +#: Members/Members.js:175 msgid "Request Password Reset" msgstr "Anfrage zum Zurücksetzen des Kennworts" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:83 +#: Root/$Root.skin:85 msgid "Requests" msgstr "Aufrufe" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:52 +#: Admin/$Admin.skin:52 Admin/$Admin.skin:85 msgid "Required Account Status" msgstr "Benötigter Konto-Status" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:190 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:143 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:39 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:976 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:68 +#: Site/$Site.skin:1105 Admin/$Admin.skin:211 Admin/$Admin.skin:257 +#: Admin/$Admin.skin:164 Skin/$Skin.skin:71 Layout/$Layout.skin:88 msgid "Reset" msgstr "Zurücksetzen" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:146 +#: Members/Members.js:165 msgid "Reset Password" msgstr "Kennwort zurücksetzen" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:22 +#: Api/$Api.skin:22 msgid "Resource type (e.g. Story or Comment)" msgstr "Art der Ressource (z.B. Beitrag oder Kommentar)" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 +#: Site/Site.js:60 Admin/Admin.js:101 msgid "Restricted" msgstr "Eingeschränkt" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:60 +#: Poll/$Poll.skin:60 msgid "Results" msgstr "Ergebnis" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:215 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:16 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:7 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:34 +#: Membership/$Membership.skin:7 User/$User.skin:34 Members/$Members.skin:16 +#: Members/$Members.skin:227 msgid "Role" msgstr "Rolle" -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:8 +#: Polls/$Polls.skin:8 msgid "Running" msgstr "Laufende" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:98 +#: Polls/Polls.js:98 msgid "Running Polls" msgstr "Laufende Umfragen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:104 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:69 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:61 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:85 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:37 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:182 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:16 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:112 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:170 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:29 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:80 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:100 +#: Membership/$Membership.skin:16 Site/$Site.skin:208 User/$User.skin:101 +#: Poll/$Poll.skin:112 File/$File.skin:61 Image/$Image.skin:87 +#: Story/Story.skin:80 Admin/$Admin.skin:137 Skin/$Skin.skin:29 +#: Layout/$Layout.skin:86 Comment/Comment.skin:69 Members/$Members.skin:194 msgid "Save" msgstr "Speichern" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:117 +#: Poll/$Poll.skin:117 msgid "Save and Run" msgstr "Speichern und starten" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:974 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1077 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:734 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:41 -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:245 +#: Site/Site.js:700 Site/Site.skin:41 Site/$Site.skin:1103 Site/$Site.skin:1203 +#: ../compat/Global/aspects.js:246 msgid "Search" msgstr "Suche" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:21 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:75 +#: Site/$Site.skin:340 +#, java-format +msgid "Search with {0}" +msgstr "Mit {0} suchen" + +#: Global/$Global.skin:40 +msgid "Select" +msgstr "Auswählen" + +#: Membership/$Membership.skin:76 msgid "Send" msgstr "Senden" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:164 +#: Members/$Members.skin:176 msgid "Send Request" msgstr "Anfrage senden" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:71 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:54 +#: Image/$Image.skin:73 Story/Story.skin:54 msgid "Separated by commas" msgstr "Durch Komma getrennt" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:74 +#: Root/$Root.skin:76 msgid "Sessions" msgstr "Sitzungen" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:24 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:329 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:31 +#: Site/Site.js:338 Site/Site.skin:31 Site/$Site.skin:1271 Root/Site.skin:35 +#: Layout/$Layout.skin:73 msgid "Settings" msgstr "Einstellungen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:7 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:434 +#: Admin/Admin.js:477 Admin/$Admin.skin:7 msgid "Setup" msgstr "Konfiguration" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:120 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:121 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:48 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:49 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:177 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:178 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:92 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:93 +#: User/$User.skin:93 User/$User.skin:94 Members/$Members.skin:189 +#: Members/$Members.skin:190 Members/$Members.skin:63 Members/$Members.skin:64 +#: Members/$Members.skin:114 Members/$Members.skin:115 msgid "Show" msgstr "Anzeigen" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:14 +#: Layout/$Layout.skin:18 msgid "Show Controls" msgstr "Kontrollelemente anzeigen" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:195 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:241 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:262 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:148 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:205 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:283 +#: Site/$Site.skin:331 Admin/$Admin.skin:283 Admin/$Admin.skin:216 +#: Admin/$Admin.skin:262 Admin/$Admin.skin:169 Members/$Members.skin:217 #, java-format msgid "Showing {0} result" msgid_plural "Showing {0} results" msgstr[0] "{0} Treffer wird angezeigt" msgstr[1] "{0} Treffer werden angezeigt" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 #, java-format msgid "" "Since you are an administrator of this Antville installation you are " @@ -1619,84 +1423,74 @@ msgstr "" "verwalten, alle Aktivitäten zu verfolgen, sowie die Konfiguration zu verändern." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:155 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:22 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:33 +#: Site/Site.js:22 User/$User.skin:33 User/$User.skin:158 Admin/$Admin.skin:176 msgid "Site" msgstr "Site" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:49 +#: Admin/$Admin.skin:82 msgid "Site Creation" msgstr "Erstellen von Websites" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:58 +#: Skins/$Skins.skin:58 msgid "Site Page" msgstr "Basis-Seite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:76 +#: Admin/$Admin.skin:109 msgid "Site Phase-Out" msgstr "Automatisches Löschen von Websites" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:782 -msgid "Site is scheduled for export." -msgstr "Die Website ist für den Export eingeplant." - -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:836 +#: Site/Site.js:799 msgid "Site is scheduled for import." msgstr "Die Website ist für den Import eingeplant." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:536 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:25 +#: Admin/Admin.js:578 Admin/$Admin.skin:10 msgid "Sites" msgstr "Sites" -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:14 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:17 +#: Images/$Images.skin:17 Files/$Files.skin:15 msgid "Size" msgstr "Größe" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:22 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: Skin/Skin.js:22 Skin/Skin.js:200 msgid "Skin" msgstr "Skin" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:5 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:22 +#: Skins/Skins.js:22 Layout/$Layout.skin:7 msgid "Skins" msgstr "Skins" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:173 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:868 +#: Site/Site.js:831 msgid "Something went wrong." msgstr "Irgendwas ist schiefgelaufen." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:61 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:56 +#: Root/$Root.skin:56 Root/$Root.skin:61 msgid "Sorry!" msgstr "Hoppla!" -#: /Users/tobi/Projects/antville/current/code/File/File.js:134 +#: Members/Members.js:187 +msgid "Sorry, logging in is currently not possible." +msgstr "Die Anmeldung ist derzeit leider nicht möglich." + +#: File/File.js:131 #, java-format msgid "Sorry, the file exceeds the maximum upload limit of {0} kB." msgstr "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB." -#: /Users/tobi/Projects/antville/current/code/User/User.js:114 +#: User/User.js:243 msgid "" -"Sorry, the user name you entered already exists. Please enter a different " -"one." +"Sorry, the username you entered already exists. Please enter a different one." msgstr "" -"Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie " -"einen anderslautenden Namen ein." +"Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto " +"registriert. Bitte geben Sie einen anderslautenden Namen ein." -#: /Users/tobi/Projects/antville/current/code/User/User.js:110 +#: User/User.js:239 msgid "" "Sorry, the username you entered is too long. Please choose a shorter one." msgstr "" "Leider ist der von Ihnen eingegebene Name zu lang. Bitte geben Sie einen " "kürzeren ein." -#: /Users/tobi/Projects/antville/current/code/File/File.js:147 +#: File/File.js:144 msgid "" "Sorry, there is no disk space left. Please try to delete some files or " "images first." @@ -1704,147 +1498,139 @@ msgstr "" "Es ist leider kein Speicherplatz mehr frei. Bitte löschen Sie zuerst einige " "Dateien oder Bilder." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:291 +#: Layout/Layout.js:292 msgid "Sorry, this layout is not compatible with Antville." msgstr "Leider funktioniert das Layout nicht mit dieser Antville-Installation." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:361 -msgid "Sorry, your input did not match any registered user." -msgstr "" -"Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben." +#: Members/Members.js:426 +msgid "Sorry, your input did not match any registered account." +msgstr "Leider ist unter diesem Namen kein Konto registriert." -#: /Users/tobi/Projects/antville/current/code/File/File.js:287 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:288 +#: File/File.js:335 #, java-format msgid "Source: {0}" msgstr "Quelle: {0}" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:24 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:18 +#: Site/Site.skin:18 Site/$Site.skin:1290 Root/Site.skin:24 msgid "Start" msgstr "Start" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:60 +#: Skins/$Skins.skin:60 msgid "Start Page" msgstr "Startseite" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:249 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:68 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:234 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:124 +#: Site/$Site.skin:282 User/$User.skin:113 Root/$Root.skin:70 +#: Admin/$Admin.skin:224 Admin/$Admin.skin:270 msgid "Status" msgstr "Status" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:115 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 +#: Site/$Site.skin:1290 Poll/$Poll.skin:115 msgid "Stop" msgstr "Beenden" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:22 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:68 +#: Site/Site.skin:26 Stories/Stories.js:22 Stories/Stories.js:68 msgid "Stories" msgstr "Beiträge" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:117 +#: Stories/Stories.js:117 #, java-format msgid "Stories by {0}" msgstr "Beiträge von {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:164 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:22 +#: HopObject/HopObject.js:178 Story/Story.js:22 msgid "Story" msgstr "Beitrag" -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:99 +#: Archive/Archive.js:99 #, java-format msgid "Story Archive {0} ({1})" msgstr "Beitrags-Archiv {0} ({1})" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:64 +#: Admin/$Admin.skin:71 +msgid "Story about Data Privacy Statement" +msgstr "Beitrag über die Datenschutzerklärung" + +#: Admin/$Admin.skin:60 +msgid "Story about Terms and Conditions" +msgstr "Beitrag über die Nutzungsbedingungen" + +#: Skins/$Skins.skin:64 msgid "Stylesheet" msgstr "Stilvorlagen" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:9 +#: Membership/Membership.skin:9 msgid "Subscribe // verb" msgstr "Abonnieren" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:17 +#: Members/$Members.skin:17 msgid "Subscribed" msgstr "Abonniert" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:53 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:92 +#: Membership/Membership.js:53 Site/Site.js:89 msgid "Subscriber" msgstr "Abonnentin" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:246 +#: Members/$Members.skin:7 Members/Members.js:284 msgid "Subscribers" msgstr "Abonnentinnen" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:267 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:10 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:27 +#: Membership/Membership.skin:10 User/$User.skin:27 Members/Members.js:305 msgid "Subscriptions" msgstr "Abonnements" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:305 +#: Members/Members.js:343 #, java-format msgid "Successfully added {0} to the list of members." msgstr "{0} wurde erfolgreich zur Liste der Mitglieder hinzugefügt." -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:154 +#: Root/Root.js:168 msgid "Successfully created your site." msgstr "Ihr Website wurde erfolgreich erstellt." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:743 +#: Site/Site.js:709 #, java-format msgid "Successfully subscribed to site {0}." msgstr "Die Website {0} wurde erfolgreich abonniert." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:757 +#: Site/Site.js:723 #, java-format msgid "Successfully unsubscribed from site {0}." msgstr "Das Abonnement der Website {0} wurde erfolgreich storniert." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:182 +#: Layout/Layout.js:182 msgid "Successfully updated the layout." msgstr "Das Layout wurde erfolgreich aktualisiert." -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:426 +#: Admin/Admin.js:469 msgid "Successfully updated the setup." msgstr "Die Konfiguration wurde erfolgreich aktualisiert." -#: /Users/tobi/Projects/antville/current/code/Root/Root.skin:2 +#: Root/Root.skin:2 msgid "System is up and running." msgstr "System ist betriebsbereit." -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:22 +#: Tag/Tag.js:22 msgid "Tag" msgstr "Stichwort" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:95 +#: Tag/Tag.js:95 #, java-format msgid "Tag: {0}" msgstr "Stichwort: {0}" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:70 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:19 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:53 -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:22 +#: Tags/Tags.js:22 Site/Site.skin:19 Image/$Image.skin:72 Story/Story.skin:53 msgid "Tags" msgstr "Stichworte" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:45 +#: Root/Site.skin:26 Members/$Members.skin:83 +msgid "Terms and Conditions" +msgstr "Nutzungsbedingungen" + +#: Story/Story.skin:45 msgid "Text" msgstr "Text" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:125 +#: Poll/Poll.js:125 msgid "" "Thanks, your vote was registered. You can change your mind until the poll is " "closed." @@ -1852,24 +1638,34 @@ msgstr "" "Danke, Ihre Stimme wurde gezählt. Bis die Umfrage beendet ist, können Sie " "Ihre Meinung jederzeit ändern." -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:38 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:47 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:145 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:134 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:155 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:123 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:106 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1184 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1194 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:163 +#: Membership/$Membership.skin:107 Membership/$Membership.skin:135 +#: Membership/$Membership.skin:124 Membership/$Membership.skin:156 +#: Membership/$Membership.skin:146 Site/$Site.skin:1304 Site/$Site.skin:1314 +#: User/$User.skin:207 HopObject/$HopObject.skin:38 +#: HopObject/$HopObject.skin:47 msgid "The Management" msgstr "Die Direktion" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:9 +#: Api/$Api.skin:9 msgid "The URL endpoint for each of these APIs is located at" msgstr "Die Internet-Adresse für jede dieser Schnittstellen lautet" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:18 +#: User/User.js:578 +msgid "" +"The account data will be available for download from here within the next " +"days." +msgstr "Die Kontodaten stehen demnächst hier zum Download bereit." + +#: User/User.js:566 +msgid "The account is queued for export." +msgstr "Der Export der Kontodaten wird vorbereitet." + +#: User/User.js:626 +#, java-format +msgid "The account {0} was deleted." +msgstr "Das Konto {0} wurde gelöscht." + +#: Api/$Api.skin:18 msgid "" "The callback URL will be invoked as an HTTP POST request with the following " "parameters:" @@ -1877,22 +1673,16 @@ msgstr "" "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-" "Methode aufgerufen:" -#: /Users/tobi/Projects/antville/current/code/File/File.js:208 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:201 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:195 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:159 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:320 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:157 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:99 -#: /Users/tobi/Projects/antville/current/code/User/User.js:390 +#: Membership/Membership.js:159 Site/Site.js:329 User/User.js:532 +#: File/File.js:205 Image/Image.js:203 Skins/Skins.js:99 Skin/Skin.js:157 msgid "The changes were saved successfully." msgstr "Die Änderungen wurden erfolgreich gespeichert." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:118 +#: Site/Site.js:115 msgid "The chosen name is too long. Please enter a shorter one." msgstr "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein." -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:4 +#: Claustra/$Claustra.skin:4 msgid "" "The claustra – or cloistral chamber – is the first thing an ant queen " "creates when founding a new colony. In Antville, we call that an extension " @@ -1907,15 +1697,15 @@ msgstr "" "sie einfach der claustra-Eigenschaft in den app." "properties hinzugefügt bzw. von dort entfernt." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:315 +#: Story/Story.js:320 msgid "The comment was successfully created." msgstr "Der Kommentar wurde erfolgreich erstellt." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:164 +#: Comment/Comment.js:166 msgid "The comment was successfully updated." msgstr "Der Kommentar wurde erfolgreich aktualisiert." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:11 +#: User/$User.skin:11 #, java-format msgid "" "The easiest way to customize your site is to change its \n" "Language-Team: The Antville People \n" "Language: en\n" @@ -27,156 +27,136 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.4\n" +"X-Generator: Poedit 2.0.6\n" "X-Poedit-SourceCharset: UTF-8\n" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:948 +#: Global/Global.js:987 #, java-format msgid "({0} character)" msgid_plural "({0} characters)" msgstr[0] "({0} character)" msgstr[1] "({0} characters)" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:802 -msgid "" -"A Blogger export file (.xml) will be created and available for download from " -"here within 24 hours." -msgstr "" -"A Blogger export file (.xml) will be created and available for download from " -"here within 24 hours." - -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:124 +#: Members/Members.js:143 msgid "A confirmation mail was sent to your e-mail address." msgstr "A confirmation mail was sent to your e-mail address." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:7 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:62 +#: Membership/$Membership.skin:62 msgid "A generic disclaimer will be automatically appended to your message." msgstr "A generic disclaimer will be automatically appended to your message." -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:101 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:30 +#: Root/Site.skin:32 Api/Api.js:101 msgid "API" msgstr "API" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Abandoned" msgstr "Abandoned" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:268 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:154 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:15 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:15 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:20 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:98 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:213 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:153 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:33 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:203 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:8 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:46 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:76 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:16 -#: /Users/tobi/Projects/antville/current/code/User/User.js:22 +#: Members/$Members.skin:153 +msgid "Accept" +msgstr "Accept" + +#: Images/$Images.skin:20 Membership/Membership.skin:8 User/User.js:22 +#: User/$User.skin:148 Root/$Root.skin:46 Admin/$Admin.skin:291 +#: Admin/$Admin.skin:175 Skins/$Skins.skin:76 Files/$Files.skin:16 +#: Comments/$Comments.skin:15 Stories/$Stories.skin:16 +#: Members/$Members.skin:165 Members/$Members.skin:48 Members/$Members.skin:225 +#: Members/$Members.skin:92 Polls/$Polls.skin:15 msgid "Account" msgstr "Account" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:60 +#: User/$User.skin:61 msgid "Account Image" msgstr "Account Image" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:9 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:556 +#: User/$User.skin:190 +msgid "Account is being deleted" +msgstr "Account is being deleted" + +#: Admin/Admin.js:598 Admin/$Admin.skin:9 msgid "Accounts" msgstr "Accounts" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:8 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:496 +#: Admin/Admin.js:539 Admin/$Admin.skin:8 msgid "Activity" msgstr "Activity" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:100 +#: Poll/$Poll.skin:100 msgid "Add Choice" msgstr "Add Choice" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:324 +#: Story/Story.js:329 msgid "Add Comment" msgstr "Add Comment" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:69 +#: Files/Files.js:69 msgid "Add File" msgstr "Add File" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:90 +#: Images/Images.js:90 msgid "Add Image" msgstr "Add Image" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:314 +#: Members/Members.js:352 msgid "Add Member" msgstr "Add Member" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:78 +#: Polls/Polls.js:78 msgid "Add Poll" msgstr "Add Poll" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:167 +#: Root/Root.js:181 msgid "Add Site" msgstr "Add Site" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:110 +#: Skins/Skins.js:110 msgid "Add Skin" msgstr "Add Skin" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:25 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:94 +#: Site/Site.skin:25 Stories/Stories.js:94 msgid "Add Story" msgstr "Add Story" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:74 +#: Poll/$Poll.skin:74 msgid "Add Your Vote" msgstr "Add Your Vote" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:327 +#: Comment/Comment.js:331 msgid "Admin" msgstr "Admin" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:231 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:121 +#: Site/$Site.skin:279 User/$User.skin:110 msgid "Administration" msgstr "Administration" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:107 +#: Site/$Site.skin:131 msgid "Advanced" msgstr "Advanced" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:7 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:6 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:6 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:52 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:6 +#: Images/$Images.skin:7 Skins/$Skins.skin:52 Files/$Files.skin:6 +#: Comments/$Comments.skin:7 Stories/$Stories.skin:6 Members/$Members.skin:6 +#: Polls/$Polls.skin:6 msgid "All" msgstr "All" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:58 +#: Polls/Polls.js:58 msgid "All Polls" msgstr "All Polls" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:135 +#: Skins/Skins.js:135 msgid "All Skins" msgstr "All Skins" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:267 +#: Site/$Site.skin:315 User/$User.skin:178 msgid "All of this will be deleted irreversibly." msgstr "All of this will be deleted irreversibly." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:62 +#: Root/$Root.skin:62 msgid "An error occurred while processing your request." msgstr "An error occurred while processing your request." -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:3 +#: Root/Site.skin:3 #, java-format msgid "" "Antville is an open source project aimed at the development of a simple site " @@ -185,7 +165,7 @@ msgstr "" "Antville is an open source project aimed at the development of a simple site " "hosting system with many advanced features." -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:37 +#: Api/$Api.skin:37 msgid "" "Antville itself provides a default callback URL invoking the basic ping " "method of the weblogs.com API." @@ -193,15 +173,15 @@ msgstr "" "Antville itself provides a default callback URL invoking the basic ping " "method of the weblogs.com API." -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:3 +#: Api/$Api.skin:3 msgid "Antville supports the following application programming interfaces:" msgstr "Antville supports the following application programming interfaces:" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:72 +#: Site/$Site.skin:88 msgid "Archive" msgstr "Archive" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1049 +#: Site/$Site.skin:1180 msgid "" "Are you sure you want to add this URL to the referrer filter? Edit it below " "to filter a pattern only." @@ -209,404 +189,323 @@ msgstr "" "Are you sure you want to add this URL to the referrer filter? Edit it below " "to filter a pattern only." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:268 +#: Site/$Site.skin:316 User/$User.skin:179 msgid "Are you sure you want to proceed?" msgstr "Are you sure you want to proceed?" -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:36 +#: Tags/$Tags.skin:28 msgid "Are you sure you want to remove this tag?" msgstr "Are you sure you want to remove this tag?" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:50 +#: Skins/$Skins.skin:50 msgid "Basic" msgstr "Basic" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:79 +#: Skins/Skins.js:79 msgid "Basic Skins" msgstr "Basic Skins" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:37 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:46 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:144 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:133 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:154 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1183 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1193 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:162 +#: Membership/$Membership.skin:106 Membership/$Membership.skin:134 +#: Membership/$Membership.skin:155 Membership/$Membership.skin:145 +#: Site/$Site.skin:1303 Site/$Site.skin:1313 User/$User.skin:206 +#: HopObject/$HopObject.skin:37 HopObject/$HopObject.skin:46 msgid "Best regards." msgstr "Best regards." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:355 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:373 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:54 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Site/Site.js:53 User/User.js:213 Admin/$Admin.skin:417 Admin/$Admin.skin:396 msgid "Blocked" msgstr "Blocked" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:152 +#: Site/$Site.skin:185 msgid "Bookmarklet" msgstr "Bookmarklet" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Both" msgstr "Both" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:39 -msgid "Browse" -msgstr "Browse" - -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:117 +#: Root/$Root.skin:119 msgid "Build" msgstr "Build" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:100 +#: Root/$Root.skin:102 msgid "Cache" msgstr "Cache" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:13 -#: /Users/tobi/Projects/antville/current/code/Api/Api.js:123 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:140 +#: Site/$Site.skin:171 Api/Api.js:123 Api/$Api.skin:13 msgid "Callback URL" msgstr "Callback URL" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:23 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:106 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:70 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:64 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:22 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:88 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:106 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:40 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:134 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:165 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:64 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:200 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:183 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:18 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:77 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:120 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:279 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1172 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1151 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:173 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:69 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:32 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:83 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:103 -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:13 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:9 +#: Membership/$Membership.skin:18 Membership/$Membership.skin:78 +#: Site/$Site.skin:1292 Site/$Site.skin:327 Site/$Site.skin:1269 +#: Site/$Site.skin:212 User/$User.skin:104 User/$User.skin:146 +#: Poll/$Poll.skin:120 File/$File.skin:64 Root/$Root.skin:33 +#: HopObject/$HopObject.skin:22 Image/$Image.skin:90 Story/Story.skin:83 +#: Admin/$Admin.skin:139 Skin/$Skin.skin:72 Skin/$Skin.skin:32 +#: Layout/$Layout.skin:115 Layout/$Layout.skin:89 Comment/Comment.skin:70 +#: Members/$Members.skin:212 Members/$Members.skin:195 +#: Members/$Members.skin:177 Members/$Members.skin:79 Members/$Members.skin:125 +#: Members/$Members.skin:155 ../compat/Site/$Site.skin:10 +#: ../compat/Layout/$Layout.skin:13 msgid "Cancel" msgstr "Cancel" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:263 +#: Story/Story.js:268 #, java-format msgid "Cannot parse timestamp {0} as a date." msgstr "Cannot parse timestamp {0} as a date." -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:22 +#: Choice/Choice.js:22 msgid "Choice" msgstr "Choice" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:95 +#: Poll/$Poll.skin:95 msgid "Choices" msgstr "Choices" -#: /Users/tobi/Projects/antville/current/code/Claustra/Claustra.js:78 +#: Claustra/Claustra.js:78 msgid "Claustra" msgstr "Claustra" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:16 +#: HopObject/$HopObject.skin:16 msgid "Click “Cancel” now if you are not really sure you want to proceed." msgstr "Click “Cancel” now if you are not really sure you want to proceed." -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:70 +#: ../compat/Story/Story.js:70 msgid "Close" msgstr "Close" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:8 +#: Site/Site.js:60 Stories/$Stories.skin:8 msgid "Closed" msgstr "Closed" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:107 +#: Stories/Stories.js:107 msgid "Closed Stories" msgstr "Closed Stories" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:22 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:62 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:159 +#: HopObject/HopObject.js:173 Comment/Comment.js:22 Comment/Comment.skin:62 msgid "Comment" msgstr "Comment" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:31 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:61 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:21 +#: Site/Site.skin:21 Site/$Site.skin:75 Comments/Comments.js:31 msgid "Comments" msgstr "Comments" -#: /Users/tobi/Projects/antville/current/code/Comments/Comments.js:43 +#: Comments/Comments.js:43 #, java-format msgid "Comments by {0}" msgstr "Comments by {0}" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:67 +#: Story/Story.skin:67 #, java-format msgid "Comments of the story are {0}" msgstr "Comments of the story are {0}" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:31 +#: Skin/$Skin.skin:31 msgid "Compare" msgstr "Compare" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:266 +#: Skin/Skin.js:266 #, java-format msgid "Compare {0}" msgstr "Compare {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:180 +#: HopObject/HopObject.js:201 msgid "Confirm Deletion" msgstr "Confirm Deletion" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:254 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:209 +#: Skin/Skin.js:209 Layout/Layout.js:255 msgid "Confirm Reset" msgstr "Confirm Reset" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:766 +#: Site/Site.js:732 msgid "Confirm Unsubscribe" msgstr "Confirm Unsubscribe" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:32 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:39 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:46 -#, java-format -msgid "Connect with {0}" -msgstr "Connect with {0}" - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:101 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:172 -#, java-format -msgid "Connecting with {0} failed. {1} Please try again." -msgstr "Connecting with {0} failed. {1} Please try again." - -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:94 -msgid "Connections" -msgstr "Connections" - -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:22 +#: Site/Site.skin:22 Root/Site.skin:28 msgid "Contact" msgstr "Contact" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:41 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:208 +#: Membership/Membership.js:216 #, java-format msgid "Contact {0}" msgstr "Contact {0}" -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:14 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:15 +#: Comments/$Comments.skin:14 Stories/$Stories.skin:15 msgid "Content" msgstr "Content" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:219 +#: Membership/Membership.js:228 #, java-format msgid "Content of Member {0}" msgstr "Content of Member {0}" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Contributor" msgstr "Contributor" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:8 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:237 +#: Members/$Members.skin:8 Members/Members.js:275 msgid "Contributors" msgstr "Contributors" -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:12 +#: ../compat/Layout/$Layout.skin:12 msgid "Convert" msgstr "Convert" -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.convert.js:42 +#: ../compat/Layout/Layout.convert.js:42 msgid "Convert Layout" msgstr "Convert Layout" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:212 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:233 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:239 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:244 -#, java-format -msgid "Could not connect with Facebook. ({0})" -msgstr "Could not connect with Facebook. ({0})" - -#: /Users/tobi/Projects/antville/current/code/File/File.js:268 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:264 +#: File/File.js:265 Image/Image.js:286 msgid "Could not fetch the file from the given URL." msgstr "Could not fetch the file from the given URL." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:556 +#: Image/Image.js:606 msgid "Could not remove the image file from disk." msgstr "Could not remove the image file from disk." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:512 +#: Image/Image.js:562 msgid "Could not resize the image." msgstr "Could not resize the image." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:538 +#: Image/Image.js:588 msgid "Could not save the image file on disk." msgstr "Could not save the image file on disk." -#: /Users/tobi/Projects/antville/current/code/User/User.js:129 +#: User/User.js:258 msgid "Could not verify your password. Please repeat your input." msgstr "Could not verify your password. Please repeat your input." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:31 +#: Root/$Root.skin:31 msgid "Create" msgstr "Create" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:6 +#: Root/Site.skin:6 msgid "Create a site. It only takes a few clicks." msgstr "Create a site. It only takes a few clicks." -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:525 +#: Global/Global.js:552 msgid "Create missing file" msgstr "Create missing file" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:572 +#: Global/Global.js:599 msgid "Create missing image" msgstr "Create missing image" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:201 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:156 +#: User/$User.skin:159 Admin/$Admin.skin:222 Admin/$Admin.skin:177 msgid "Created" msgstr "Created" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:3 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:17 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:48 +#: Site/$Site.skin:18 HopObject/$HopObject.skin:3 #, java-format msgid "Created by {0} on {1}" msgstr "Created by {0} on {1}" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:12 +#: Site/Site.skin:12 #, java-format msgid "Created by {0} on {1}." msgstr "Created by {0} on {1}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:363 +#: User/$User.skin:183 +#, java-format +msgid "Created on {0}" +msgstr "Created on {0}" + +#: Site/$Site.skin:372 #, java-format msgid "Created {0}" msgstr "Created {0}" -#: /Users/tobi/Projects/antville/current/code/User/User.js:67 -msgid "" -"Currently, it is not possible to remove an account. Please accept our humble " -"apologies." -msgstr "" -"Currently, it is not possible to remove an account. Please accept our humble " -"apologies." +#: Root/Site.skin:27 Members/$Members.skin:84 +msgid "Data Privacy Statement" +msgstr "Data Privacy Statement" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:28 +#: Admin/$Admin.skin:287 +msgid "Date" +msgstr "Date" + +#: Api/$Api.skin:28 msgid "Date string in Unix timestamp format" msgstr "Date string in Unix timestamp format" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:63 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:87 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:119 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:172 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:82 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:102 +#: Site/$Site.skin:211 User/$User.skin:103 Poll/$Poll.skin:119 +#: File/$File.skin:63 Image/$Image.skin:89 Story/Story.skin:82 msgid "Delete" msgstr "Delete" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:61 +#: Site/Site.js:53 User/User.js:213 Admin/$Admin.skin:402 Admin/$Admin.skin:414 msgid "Deleted" msgstr "Deleted" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:10 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:47 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:62 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:43 +#: User/$User.skin:192 +#, java-format +msgid "Deleted on {0}" +msgstr "Deleted on {0}" + +#: Site/$Site.skin:53 File/$File.skin:47 Image/$Image.skin:64 +#: Claustra/$Claustra.skin:10 msgid "Description" msgstr "Description" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:72 +#: Root/$Root.skin:74 msgid "Details" msgstr "Details" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:31 +#: Root/Site.skin:33 msgid "Development" msgstr "Development" -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:19 +#: Images/$Images.skin:19 msgid "Dimensions" msgstr "Dimensions" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:981 +#: Site/$Site.skin:1110 msgid "Disable filter" msgstr "Disable filter" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 +#: Admin/Admin.js:101 msgid "Disabled" msgstr "Disabled" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:30 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:37 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:44 -#, java-format -msgid "Disconnect from {0}" -msgstr "Disconnect from {0}" - -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:41 +#: Admin/$Admin.skin:41 msgid "Disk Quota" msgstr "Disk Quota" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:160 +#: Site/$Site.skin:195 msgid "Disk Space" msgstr "Disk Space" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:173 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:219 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:127 +#: Admin/$Admin.skin:194 Admin/$Admin.skin:240 Admin/$Admin.skin:148 msgid "Display" msgstr "Display" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Recaptcha/Recaptcha.js:32 +#: Global/Captcha.js:44 msgid "Do Androids dream of electric sheep?" msgstr "Do Androids dream of electric sheep?" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1145 -#, java-format -msgid "Download the file {0} or klick “Start” to create a new one." -msgstr "Download the file {0} or klick “Start” to create a new one." - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 msgid "Drag to Bookmarks Bar" msgstr "Drag to Bookmarks Bar" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:20 +#: ../compat/Members/Members.js:20 msgid "" -"Due to security reasons user passwords are not stored in the Antville " -"database any longer. Thus, your password cannot be sent to you, anymore." +"Due to security reasons passwords are not stored in the Antville database " +"any longer. Thus, your password cannot be sent to you, anymore." msgstr "" -"Due to security reasons user passwords are not stored in the Antville " -"database any longer. Thus, your password cannot be sent to you, anymore." +"Due to security reasons passwords are not stored in the Antville database " +"any longer. Thus, your password cannot be sent to you, anymore." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:159 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:67 +#: User/$User.skin:68 Members/$Members.skin:171 msgid "E-mail" msgstr "E-mail" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:16 +#: Root/$Root.skin:16 #, java-format msgid "E.g. if you enter {0} here your site will be reachable via {1}" msgstr "" "E.g. if you enter {0} here your site will be reachable via {1}" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:15 +#: Api/$Api.skin:15 msgid "" "Each Antville site provides a setting to define a callback URL that will be " "invoked each time the site content has changed. This way users can define " @@ -618,48 +517,45 @@ msgstr "" "custom handlers for different site events with their own code running behind " "this URL – on a server and in a programming language of their choice." -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:15 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:29 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:67 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:24 +#: Poll/$Poll.skin:29 Image/Image.skin:15 Story/Story.skin:24 +#: Skin/$Skin.skin:70 msgid "Edit" msgstr "Edit" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:174 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:48 +#: Comment/Comment.js:176 Comment/Comment.skin:48 msgid "Edit Comment" msgstr "Edit Comment" -#: /Users/tobi/Projects/antville/current/code/File/File.js:217 +#: File/File.js:214 msgid "Edit File" msgstr "Edit File" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:210 +#: Image/Image.js:212 msgid "Edit Image" msgstr "Edit Image" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:170 +#: Poll/Poll.js:170 msgid "Edit Poll" msgstr "Edit Poll" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:234 +#: Story/Story.js:239 msgid "Edit Story" msgstr "Edit Story" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:982 +#: Site/$Site.skin:1111 msgid "Edit the filter in the site settings." msgstr "Edit the filter in the site settings." -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:169 +#: Skin/Skin.js:169 #, java-format msgid "Edit {0}.{1}" msgstr "Edit {0}.{1}" -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:11 +#: Claustra/$Claustra.skin:11 msgid "Enabled" msgstr "Enabled" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:134 +#: Site/$Site.skin:164 #, java-format msgid "" "Enter one filter {0}pattern{1} per line to be applied on every URL in the " @@ -668,7 +564,7 @@ msgstr "" "Enter one filter {0}pattern{1} per line to be applied on every URL in the " "referrer and backlink lists." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:149 +#: Members/$Members.skin:161 msgid "" "Enter your username and the e-mail address you have used when you " "registered. You will then receive a confirmation e-mail containing further " @@ -678,126 +574,124 @@ msgstr "" "registered. You will then receive a confirmation e-mail containing further " "instructions." -#: /Users/tobi/Projects/antville/current/code/Comment/$Comment.skin:20 +#: Comment/$Comment.skin:20 #, java-format msgid "Erase all comments of user {0}" msgstr "Erase all comments of user {0}" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:93 +#: Root/$Root.skin:95 msgid "Error Ratio" msgstr "Error Ratio" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:88 +#: Root/$Root.skin:90 msgid "Errors" msgstr "Errors" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:8 +#: Site/$Site.skin:1269 Site/$Site.skin:26 User/$User.skin:52 +#: User/$User.skin:146 Layout/$Layout.skin:10 msgid "Export" msgstr "Export" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1143 +#: User/$User.skin:140 +msgid "Export Account Data" +msgstr "Export Account Data" + +#: Site/$Site.skin:1263 msgid "Export Site Data" msgstr "Export Site Data" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:30 -#: /Users/tobi/Projects/antville/current/code/File/File.js:22 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:160 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:45 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1162 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:82 +#: Site/$Site.skin:1282 File/File.js:22 File/$File.skin:30 +#: HopObject/HopObject.js:174 Image/$Image.skin:47 Story/$Story.skin:96 msgid "File" msgstr "File" -#: /Users/tobi/Projects/antville/current/code/File/File.js:258 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:254 +#: File/File.js:255 Image/Image.js:256 msgid "File size is exceeding the upload limit." msgstr "File size is exceeding the upload limit." -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:22 -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:79 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:28 +#: Site/Site.skin:28 Files/Files.js:22 Files/Files.js:79 msgid "Files" msgstr "Files" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:89 +#: Files/Files.js:89 #, java-format msgid "Files by {0}" msgstr "Files by {0}" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:185 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:231 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:138 +#: Admin/$Admin.skin:206 Admin/$Admin.skin:252 Admin/$Admin.skin:159 msgid "Filter" msgstr "Filter" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:198 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:277 -#: /Users/tobi/Projects/antville/current/compat/Site/$Site.skin:7 +#: Site/$Site.skin:325 Members/$Members.skin:210 ../compat/Site/$Site.skin:8 msgid "Find" msgstr "Find" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:289 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:722 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1020 +#: Site/Site.js:688 Site/Site.js:968 Members/Members.js:327 #, java-format msgid "Found more than {0} results. Please try a more specific query." msgstr "Found more than {0} results. Please try a more specific query." -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:20 +#: Site/Site.skin:20 msgid "Galleries" msgstr "Galleries" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:22 +#: Admin/$Admin.skin:22 msgid "General" msgstr "General" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:183 +#: Members/Members.js:221 #, java-format msgid "Good bye, {0}! Looking forward to seeing you again!" msgstr "Good bye, {0}! Looking forward to seeing you again!" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:95 +#: Admin/$Admin.skin:128 msgid "Grace Period" msgstr "Grace Period" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:214 +#: Story/$Story.skin:229 msgid "HTML" msgstr "HTML" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:17 +#: User/$User.skin:17 msgid "Have a lot of fun!" msgstr "Have a lot of fun!" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:122 +#: Membership/$Membership.skin:123 msgid "Have fun!" msgstr "Have fun!" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:280 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:29 +#: Root/Site.skin:31 Root/Root.js:295 msgid "Health" msgstr "Health" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:32 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:41 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:137 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:126 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:148 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1177 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1187 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:152 +#: Membership/$Membership.skin:127 Membership/$Membership.skin:149 +#: Membership/$Membership.skin:138 Site/$Site.skin:1297 Site/$Site.skin:1307 +#: User/$User.skin:196 HopObject/$HopObject.skin:32 +#: HopObject/$HopObject.skin:41 #, java-format msgid "Hello {0}." msgstr "Hello {0}." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:119 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:47 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:176 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:91 -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:68 +#: Root/$Root.skin:123 +msgid "Helma Version" +msgstr "Helma Version" + +#: User/$User.skin:92 Members/$Members.skin:188 Members/$Members.skin:62 +#: Members/$Members.skin:113 ../compat/Story/Story.js:68 msgid "Hide" msgstr "Hide" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:100 +#: Members/$Members.skin:141 +#, java-format +msgid "I understand and accept the {0}data privacy statement{1}" +msgstr "I understand and accept the {0}data privacy statement{1}" + +#: Members/$Members.skin:133 +#, java-format +msgid "I understand and accept the {0}terms and conditions{1}" +msgstr "I understand and accept the {0}terms and conditions{1}" + +#: Membership/$Membership.skin:101 msgid "" "If the user did not include contact information in the message itself, you " "can send your reply via the user’s contact form [2]." @@ -805,22 +699,21 @@ msgstr "" "If the user did not include contact information in the message itself, you " "can send your reply via the user’s contact form [2]." -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:39 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:54 +#: File/$File.skin:39 Image/$Image.skin:56 msgid "" "If you do not specify a name Antville will create one based on the filename." msgstr "" "If you do not specify a name Antville will create one based on the filename." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:77 +#: User/$User.skin:78 msgid "" -"If you enter a URL here your user name will appear as link next to your " +"If you enter a URL here your username will appear as link next to your " "posted items." msgstr "" -"If you enter a URL here your user name will appear as link next to your " +"If you enter a URL here your username will appear as link next to your " "posted items." -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:21 +#: ../compat/Members/Members.js:21 #, java-format msgid "" "If you should really have forgotten your password, you can use the password reset option." -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:77 +#: Global/$Global.skin:59 msgid "" "If you think you have received this e-mail in error please contact the " "maintainer of the site." @@ -837,7 +730,7 @@ msgstr "" "If you think you have received this e-mail in error please contact the " "maintainer of the site." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:111 +#: Site/$Site.skin:136 msgid "" "If you want to resize the image please specify your desired maximum width " "and/or maximum height in pixels. If you specify both the image will be " @@ -851,282 +744,238 @@ msgstr "" "the width or height of your image exceeds 100 pixels Antville automatically " "creates a thumbnail of it, too." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:161 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:22 +#: HopObject/HopObject.js:175 Image/Image.js:24 msgid "Image" msgstr "Image" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:110 +#: Site/$Site.skin:135 msgid "Image Dimension Limits" msgstr "Image Dimension Limits" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:187 +#: Image/Image.js:189 #, java-format msgid "Image: {0}" msgstr "Image: {0}" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:22 -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:64 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:27 +#: Images/Images.js:22 Images/Images.js:64 Site/Site.skin:27 +#: Layout/$Layout.skin:8 msgid "Images" msgstr "Images" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:105 +#: Images/Images.js:105 #, java-format msgid "Images by {0}" msgstr "Images by {0}" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:104 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:7 +#: Layout/$Layout.skin:113 Layout/$Layout.skin:9 msgid "Import" msgstr "Import" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:311 +#: Layout/Layout.js:312 msgid "Import Layout" msgstr "Import Layout" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1155 +#: Site/$Site.skin:1275 msgid "Import Site Data" msgstr "Import Site Data" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:54 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:78 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:105 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:242 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:71 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:132 +#: Site/$Site.skin:290 User/$User.skin:121 Poll/$Poll.skin:105 +#: File/$File.skin:54 Image/$Image.skin:80 Story/Story.skin:71 msgid "Information" msgstr "Information" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:68 +#: Admin/$Admin.skin:101 msgid "Interval" msgstr "Interval" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:66 +#: Skins/$Skins.skin:66 msgid "JavaScript" msgstr "JavaScript" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:11 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:507 +#: Admin/Admin.js:550 Admin/$Admin.skin:11 msgid "Jobs" msgstr "Jobs" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:83 +#: Site/$Site.skin:101 msgid "Language" msgstr "Language" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:248 +#: Admin/$Admin.skin:269 msgid "Last Login" msgstr "Last Login" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:45 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:35 +#: User/$User.skin:35 Root/$Root.skin:45 msgid "Last Update" msgstr "Last Update" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:56 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:6 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:20 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:50 +#: Site/$Site.skin:21 HopObject/$HopObject.skin:6 Comment/Comment.skin:56 #, java-format msgid "Last modified by {0} on {1}" msgstr "Last modified by {0} on {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:364 +#: User/$User.skin:185 +#, java-format +msgid "Last modified on {0}" +msgstr "Last modified on {0}" + +#: Site/$Site.skin:373 #, java-format msgid "Last modified {0}" msgstr "Last modified {0}" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:22 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:189 -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:34 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:32 -#: /Users/tobi/Projects/antville/current/compat/Layout/Layout.js:33 -#: /Users/tobi/Projects/antville/current/compat/Site/Site.js:92 +#: Site/Site.skin:32 Root/Site.skin:36 Layout/Layout.js:22 Layout/Layout.js:189 +#: Layout/Layout.js:245 ../compat/Site/Site.js:92 ../compat/Layout/Layout.js:33 msgid "Layout" msgstr "Layout" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:111 +#: Images/Images.js:111 msgid "Layout Images" msgstr "Layout Images" -#: /Users/tobi/Projects/antville/current/code/LogEntry/LogEntry.js:22 +#: LogEntry/LogEntry.js:22 msgid "Log Entry" msgstr "Log Entry" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:3 +#: Membership/Membership.skin:3 #, java-format msgid "Logged in as {0}" msgstr "Logged in as {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:175 +#: Members/Members.js:213 msgid "Login" msgstr "Login" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:62 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:18 +#: Membership/Membership.skin:18 Members/$Members.skin:77 msgid "Login // verb" msgstr "Login" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:13 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:16 -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/$Connect.skin:19 -#, java-format -msgid "Login with {0}" -msgstr "Login with {0}" - -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:7 +#: Membership/Membership.skin:7 msgid "Logout // verb" msgstr "Logout" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Manager" msgstr "Manager" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:9 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:228 +#: Members/$Members.skin:9 Members/Members.js:266 msgid "Managers" msgstr "Managers" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:215 +#: Story/$Story.skin:230 msgid "Markdown" msgstr "Markdown" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:168 +#: Membership/Membership.js:168 #, java-format msgid "Member {0}" msgstr "Member {0}" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:22 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:72 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:33 +#: Site/Site.skin:33 Members/Members.js:22 Members/Members.js:80 msgid "Members" msgstr "Members" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:162 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:22 +#: Membership/Membership.js:22 HopObject/HopObject.js:176 msgid "Membership" msgstr "Membership" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:102 +#: Root/$Root.skin:104 msgid "Memory" msgstr "Memory" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:12 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:67 +#: Membership/$Membership.skin:67 msgid "Message" msgstr "Message" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:266 +#: Admin/$Admin.skin:288 msgid "Method" msgstr "Method" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:79 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:27 +#: Site/$Site.skin:33 Admin/$Admin.skin:224 Admin/$Admin.skin:112 msgid "Mode" msgstr "Mode" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:202 -#: /Users/tobi/Projects/antville/current/code/Comments/$Comments.skin:16 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:16 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:21 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:16 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:77 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:51 -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:17 +#: Images/$Images.skin:21 Admin/$Admin.skin:223 Skins/$Skins.skin:51 +#: Skins/$Skins.skin:77 Files/$Files.skin:17 Comments/$Comments.skin:16 +#: Stories/$Stories.skin:17 Polls/$Polls.skin:16 msgid "Modified" msgstr "Modified" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:119 +#: Skins/Skins.js:119 msgid "Modified Skins" msgstr "Modified Skins" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:142 +#: Skins/Skins.js:142 msgid "Modified Skins (Safe Mode)" msgstr "Modified Skins (Safe Mode)" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:78 +#: Skin/$Skin.skin:81 msgid "Modified skin" msgstr "Modified skin" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:200 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:246 -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:9 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:38 -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:13 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:53 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:192 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:15 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:75 -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:15 +#: Tags/$Tags.skin:17 File/$File.skin:38 Root/$Root.skin:6 Image/$Image.skin:55 +#: Admin/$Admin.skin:290 Admin/$Admin.skin:221 Admin/$Admin.skin:245 +#: Admin/$Admin.skin:267 Skins/$Skins.skin:75 Files/$Files.skin:14 +#: Members/$Members.skin:204 Members/$Members.skin:15 Claustra/$Claustra.skin:9 msgid "Name" msgstr "Name" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:30 +#: Api/$Api.skin:30 msgid "Name of the account that triggered the event" msgstr "Name of the account that triggered the event" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:62 +#: Skins/$Skins.skin:62 msgid "Navigation" msgstr "Navigation" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:72 +#: ../compat/Global/aspects.js:72 msgid "Next page" msgstr "Next page" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:221 +#: Skin/Skin.js:221 msgid "No differences were found." msgstr "No differences were found." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:90 +#: Site/Site.js:87 msgid "Nobody" msgstr "Nobody" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 +#: Admin/Admin.js:94 Admin/Admin.js:115 msgid "None" msgstr "None" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:37 +#: Members/$Members.skin:52 msgid "Not registered yet?" msgstr "Not registered yet?" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 msgid "Note" msgstr "Note" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:251 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:142 +#: Site/$Site.skin:299 User/$User.skin:131 msgid "Notes" msgstr "Notes" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:33 +#: Admin/$Admin.skin:33 msgid "Notification E-Mail" msgstr "Notification E-Mail" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:87 +#: Admin/$Admin.skin:120 msgid "Notification Period" msgstr "Notification Period" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:25 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:99 +#: Site/$Site.skin:121 Admin/$Admin.skin:25 msgid "Notifications" msgstr "Notifications" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:12 +#: Root/Site.skin:12 msgid "Number of public sites" msgstr "Number of public sites" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:24 +#: Api/$Api.skin:24 msgid "Numeric identifier of the resource" msgstr "Numeric identifier of the resource" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:14 +#: User/$User.skin:14 #, java-format msgid "" "Of course, you can now also start to add stories, upload " @@ -1143,67 +992,70 @@ msgstr "" "section where you can modify the appearance of your site according to " "your needs." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Open" msgstr "Open" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:61 +#: Story/Story.skin:61 msgid "Options" msgstr "Options" -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:80 +#: Skin/$Skin.skin:83 msgid "Original skin" msgstr "Original skin" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:54 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:91 +#: Membership/Membership.js:54 Site/Site.js:88 msgid "Owner" msgstr "Owner" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:10 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:219 +#: Members/$Members.skin:10 Members/Members.js:257 msgid "Owners" msgstr "Owners" -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:71 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:98 +#: Membership/$Membership.skin:99 Global/$Global.skin:53 msgid "PLEASE DO NOT REPLY TO THE SENDER ADDRESS OF THIS MESSAGE." msgstr "PLEASE DO NOT REPLY TO THE SENDER ADDRESS OF THIS MESSAGE." -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:97 +#: Archive/Archive.js:97 #, java-format msgid "Page {0} of {1}" msgstr "Page {0} of {1}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:51 +#: Site/$Site.skin:63 msgid "Pagination" msgstr "Pagination" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:114 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:42 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:86 +#: User/$User.skin:87 Members/$Members.skin:57 Members/$Members.skin:108 msgid "Password" msgstr "Password" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:51 +#: Members/$Members.skin:66 msgid "Password forgotten?" msgstr "Password forgotten?" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:76 +#: User/$User.skin:77 msgid "Personal URL" msgstr "Personal URL" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:116 +#: Site/$Site.skin:142 msgid "Pixels" msgstr "Pixels" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:125 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:93 -#: /Users/tobi/Projects/antville/current/code/User/User.js:112 +#: Members/Members.js:368 +#| msgid "I understand and accept the {0}data privacy statement{1}" +msgid "Please accept the data privacy statement." +msgstr "Please accept the data privacy statement." + +#: Members/Members.js:364 +#| msgid "I understand and accept the {0}terms and conditions{1}" +msgid "Please accept the terms and conditions." +msgstr "Please accept the terms and conditions." + +#: Site/Site.js:122 User/User.js:241 Skins/Skins.js:93 msgid "Please avoid special characters or HTML code in the name field." msgstr "Please avoid special characters or HTML code in the name field." -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:13 +#: HopObject/$HopObject.skin:13 msgid "" "Please be aware of the fact that there is no “undo”, so if you click " "“Proceed” below the changes will be applied irreversibly." @@ -1211,379 +1063,335 @@ msgstr "" "Please be aware of the fact that there is no “undo”, so if you click " "“Proceed” below the changes will be applied irreversibly." -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:91 +#: Skins/Skins.js:91 msgid "Please choose a prototype and enter a skin name" msgstr "Please choose a prototype and enter a skin name" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:180 +#: Membership/Membership.js:180 msgid "Please choose a role for this member." msgstr "Please choose a role for this member." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:113 -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:122 +#: HopObject/HopObject.js:120 HopObject/HopObject.js:137 msgid "Please contact an administrator for further information." msgstr "Please contact an administrator for further information." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1199 +#: Site/$Site.skin:1319 msgid "Please enable JavaScript in your browser for improved functionality." msgstr "Please enable JavaScript in your browser for improved functionality." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:114 +#: Site/Site.js:111 msgid "Please enter a name for your new site." msgstr "Please enter a name for your new site." -#: /Users/tobi/Projects/antville/current/code/Tags/$Tags.skin:27 +#: Tags/$Tags.skin:23 msgid "Please enter a new name for this tag" msgstr "Please enter a new name for this tag" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:137 +#: Members/Members.js:156 msgid "Please enter a new password." msgstr "Please enter a new password." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:283 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:1007 +#: Site/Site.js:955 Members/Members.js:321 msgid "Please enter a query in the search form." msgstr "Please enter a query in the search form." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:111 -msgid "Please enter a user name and e-mail address." -msgstr "Please enter a user name and e-mail address." +#: Members/Members.js:130 +msgid "Please enter a username and e-mail address." +msgstr "Please enter a username and e-mail address." -#: /Users/tobi/Projects/antville/current/code/User/User.js:105 +#: User/User.js:234 msgid "Please enter a username." msgstr "Please enter a username." -#: /Users/tobi/Projects/antville/current/code/User/User.js:429 +#: User/User.js:678 msgid "Please enter a valid URL" msgstr "Please enter a valid URL" -#: /Users/tobi/Projects/antville/current/code/User/User.js:119 -#: /Users/tobi/Projects/antville/current/code/User/User.js:426 +#: User/User.js:248 User/User.js:674 msgid "Please enter a valid e-mail address" msgstr "Please enter a valid e-mail address" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:251 +#: Story/Story.js:256 msgid "Please enter at least something into the “title” or “text” field." msgstr "Please enter at least something into the “title” or “text” field." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:203 +#: Comment/Comment.js:202 msgid "Please enter something into the comment field." msgstr "Please enter something into the comment field." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:27 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:193 +#: Membership/Membership.js:193 msgid "Please enter the message text." msgstr "Please enter the message text." -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:56 +#: Layout/$Layout.skin:37 msgid "Please enter the name of the new setting:" msgstr "Please enter the name of the new setting:" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:4 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:59 +#: Membership/$Membership.skin:59 msgid "Please enter your message to the user below." msgstr "Please enter your message to the user below." -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:196 +#: Poll/Poll.js:196 msgid "Please fill out the whole form to create a valid poll." msgstr "Please fill out the whole form to create a valid poll." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:133 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:307 +#: HopObject/HopObject.js:150 Story/Story.js:312 msgid "Please login first." msgstr "Please login first." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:6 +#: Root/$Root.skin:6 msgid "Please note that you cannot change the name after the site was created." msgstr "" "Please note that you cannot change the name after the site was created." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:276 +#: Layout/Layout.js:277 msgid "Please upload a zipped layout archive" msgstr "Please upload a zipped layout archive" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:163 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:22 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:86 +#: Poll/Poll.js:22 HopObject/HopObject.js:177 Story/$Story.skin:101 msgid "Poll" msgstr "Poll" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:226 +#: Poll/Poll.js:226 #, java-format msgid "Poll Results: {0}" msgstr "Poll Results: {0}" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:133 +#: Poll/Poll.js:133 #, java-format msgid "Poll: {0}" msgstr "Poll: {0}" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:22 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:29 +#: Site/Site.skin:29 Polls/Polls.js:22 msgid "Polls" msgstr "Polls" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:89 +#: Polls/Polls.js:89 #, java-format msgid "Polls by {0}" msgstr "Polls by {0}" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:155 +#: Site/$Site.skin:189 #, java-format msgid "Post to {0}" msgstr "Post to {0}" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:15 +#: Story/Story.skin:15 #, java-format msgid "Posted by {0} at {1}" msgstr "Posted by {0} at {1}" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:53 -#: /Users/tobi/Projects/antville/current/code/Image/Image.skin:4 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:24 +#: Poll/$Poll.skin:24 Image/Image.skin:4 Comment/Comment.skin:53 #, java-format msgid "Posted by {0} on {1}" msgstr "Posted by {0} on {1}" -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:14 -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:139 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:19 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:90 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:15 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:25 +#: Poll/$Poll.skin:15 File/$File.skin:14 Global/i18n.js:139 +#: Image/$Image.skin:19 Story/$Story.skin:25 Skin/$Skin.skin:10 +#: Layout/$Layout.skin:99 msgid "Press CTRL & C to copy to clipboard." msgstr "Press CTRL & C to copy to clipboard." -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:213 +#: Story/$Story.skin:228 msgid "Preview" msgstr "Preview" -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:69 +#: ../compat/Global/aspects.js:69 msgid "Previous page" msgstr "Previous page" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:379 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: User/User.js:214 Admin/Admin.js:108 Admin/Admin.js:115 Admin/$Admin.skin:423 msgid "Privileged" msgstr "Privileged" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:60 +#: Admin/$Admin.skin:93 msgid "Probation Period" msgstr "Probation Period" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:21 +#: HopObject/$HopObject.skin:21 msgid "Proceed" msgstr "Proceed" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:63 +#: Site/Site.js:61 msgid "Public" msgstr "Public" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:182 +#: Root/Site.skin:25 Root/Root.js:196 msgid "Public Sites" msgstr "Public Sites" -#: /Users/tobi/Projects/antville/current/compat/Story/Story.js:66 +#: ../compat/Story/Story.js:66 msgid "Publish" msgstr "Publish" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:89 -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:14 +#: Poll/$Poll.skin:89 Polls/$Polls.skin:14 msgid "Question" msgstr "Question" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:107 +#: Root/$Root.skin:109 msgid "Queue" msgstr "Queue" -#: /Users/tobi/Projects/antville/current/compat/Members/Members.js:19 +#: ../compat/Members/Members.js:19 msgid "Recover your password" msgstr "Recover your password" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:267 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:157 +#: User/$User.skin:160 Admin/$Admin.skin:289 Admin/$Admin.skin:178 msgid "Reference" msgstr "Reference" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:995 +#: Site/$Site.skin:1124 msgid "Referrer" msgstr "Referrer" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:129 +#: Site/$Site.skin:158 msgid "Referrer Filter" msgstr "Referrer Filter" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:708 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:34 +#: Site/Site.js:674 Site/Site.skin:34 Root/Site.skin:37 msgid "Referrers" msgstr "Referrers" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:132 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:101 +#: Members/$Members.skin:123 Members/Members.js:119 msgid "Register" msgstr "Register" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:247 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:214 +#: Admin/$Admin.skin:268 Members/$Members.skin:226 msgid "Registered" msgstr "Registered" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: Admin/$Admin.skin:245 msgid "Registration" msgstr "Registration" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Admin/$Admin.skin:49 +msgid "Registration & Login" +msgstr "Registration & Login" + +#: Site/Site.js:54 User/User.js:214 Admin/Admin.js:94 Admin/Admin.js:108 +#: Admin/Admin.js:115 msgid "Regular" msgstr "Regular" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:56 +#: Members/$Members.skin:71 msgid "Remember Login" msgstr "Remember Login" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:156 +#: Members/Members.js:175 msgid "Request Password Reset" msgstr "Request Password Reset" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:83 +#: Root/$Root.skin:85 msgid "Requests" msgstr "Requests" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:52 +#: Admin/$Admin.skin:52 Admin/$Admin.skin:85 msgid "Required Account Status" msgstr "Required Account Status" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:190 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:236 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:143 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:39 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:976 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:68 +#: Site/$Site.skin:1105 Admin/$Admin.skin:211 Admin/$Admin.skin:257 +#: Admin/$Admin.skin:164 Skin/$Skin.skin:71 Layout/$Layout.skin:88 msgid "Reset" msgstr "Reset" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:146 +#: Members/Members.js:165 msgid "Reset Password" msgstr "Reset Password" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:22 +#: Api/$Api.skin:22 msgid "Resource type (e.g. Story or Comment)" msgstr "Resource type (e.g. Story or Comment)" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:96 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:62 +#: Site/Site.js:60 Admin/Admin.js:101 msgid "Restricted" msgstr "Restricted" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:60 +#: Poll/$Poll.skin:60 msgid "Results" msgstr "Results" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:215 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:16 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:7 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:34 +#: Membership/$Membership.skin:7 User/$User.skin:34 Members/$Members.skin:16 +#: Members/$Members.skin:227 msgid "Role" msgstr "Role" -#: /Users/tobi/Projects/antville/current/code/Polls/$Polls.skin:8 +#: Polls/$Polls.skin:8 msgid "Running" msgstr "Running" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:98 +#: Polls/Polls.js:98 msgid "Running Polls" msgstr "Running Polls" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:104 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.skin:69 -#: /Users/tobi/Projects/antville/current/code/File/$File.skin:61 -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:85 -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:37 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:182 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:16 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:112 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:170 -#: /Users/tobi/Projects/antville/current/code/Skin/$Skin.skin:29 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:80 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:100 +#: Membership/$Membership.skin:16 Site/$Site.skin:208 User/$User.skin:101 +#: Poll/$Poll.skin:112 File/$File.skin:61 Image/$Image.skin:87 +#: Story/Story.skin:80 Admin/$Admin.skin:137 Skin/$Skin.skin:29 +#: Layout/$Layout.skin:86 Comment/Comment.skin:69 Members/$Members.skin:194 msgid "Save" msgstr "Save" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:117 +#: Poll/$Poll.skin:117 msgid "Save and Run" msgstr "Save and Run" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:974 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1077 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:734 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:41 -#: /Users/tobi/Projects/antville/current/compat/Global/aspects.js:245 +#: Site/Site.js:700 Site/Site.skin:41 Site/$Site.skin:1103 Site/$Site.skin:1203 +#: ../compat/Global/aspects.js:246 msgid "Search" msgstr "Search" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:21 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:75 +#: Site/$Site.skin:340 +#, java-format +msgid "Search with {0}" +msgstr "Search with {0}" + +#: Global/$Global.skin:40 +msgid "Select" +msgstr "Select" + +#: Membership/$Membership.skin:76 msgid "Send" msgstr "Send" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:164 +#: Members/$Members.skin:176 msgid "Send Request" msgstr "Send Request" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:71 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:54 +#: Image/$Image.skin:73 Story/Story.skin:54 msgid "Separated by commas" msgstr "Separated by commas" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:74 +#: Root/$Root.skin:76 msgid "Sessions" msgstr "Sessions" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:24 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:33 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:329 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:31 +#: Site/Site.js:338 Site/Site.skin:31 Site/$Site.skin:1271 Root/Site.skin:35 +#: Layout/$Layout.skin:73 msgid "Settings" msgstr "Settings" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:7 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:434 +#: Admin/Admin.js:477 Admin/$Admin.skin:7 msgid "Setup" msgstr "Setup" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:120 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:121 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:48 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:49 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:177 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:178 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:92 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:93 +#: User/$User.skin:93 User/$User.skin:94 Members/$Members.skin:189 +#: Members/$Members.skin:190 Members/$Members.skin:63 Members/$Members.skin:64 +#: Members/$Members.skin:114 Members/$Members.skin:115 msgid "Show" msgstr "Show" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:14 +#: Layout/$Layout.skin:18 msgid "Show Controls" msgstr "Show Controls" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:195 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:241 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:262 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:148 -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:205 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:283 +#: Site/$Site.skin:331 Admin/$Admin.skin:283 Admin/$Admin.skin:216 +#: Admin/$Admin.skin:262 Admin/$Admin.skin:169 Members/$Members.skin:217 #, java-format msgid "Showing {0} result" msgid_plural "Showing {0} results" msgstr[0] "Showing {0} result" msgstr[1] "Showing {0} results" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:15 +#: Admin/$Admin.skin:15 #, java-format msgid "" "Since you are an administrator of this Antville installation you are " @@ -1596,83 +1404,72 @@ msgstr "" "a>, monitor all activity, configure the setup and much more." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:155 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:22 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:33 +#: Site/Site.js:22 User/$User.skin:33 User/$User.skin:158 Admin/$Admin.skin:176 msgid "Site" msgstr "Site" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:49 +#: Admin/$Admin.skin:82 msgid "Site Creation" msgstr "Site Creation" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:58 +#: Skins/$Skins.skin:58 msgid "Site Page" msgstr "Site Page" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:76 +#: Admin/$Admin.skin:109 msgid "Site Phase-Out" msgstr "Site Phase-Out" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:782 -msgid "Site is scheduled for export." -msgstr "Site is scheduled for export." - -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:836 +#: Site/Site.js:799 msgid "Site is scheduled for import." msgstr "Site is scheduled for import." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:10 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:536 -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:25 +#: Admin/Admin.js:578 Admin/$Admin.skin:10 msgid "Sites" msgstr "Sites" -#: /Users/tobi/Projects/antville/current/code/Files/$Files.skin:14 -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:17 +#: Images/$Images.skin:17 Files/$Files.skin:15 msgid "Size" msgstr "Size" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:22 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: Skin/Skin.js:22 Skin/Skin.js:200 msgid "Skin" msgstr "Skin" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:5 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:22 +#: Skins/Skins.js:22 Layout/$Layout.skin:7 msgid "Skins" msgstr "Skins" -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:173 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:868 +#: Site/Site.js:831 msgid "Something went wrong." msgstr "Something went wrong." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:61 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:56 +#: Root/$Root.skin:56 Root/$Root.skin:61 msgid "Sorry!" msgstr "Sorry!" -#: /Users/tobi/Projects/antville/current/code/File/File.js:134 +#: Members/Members.js:187 +msgid "Sorry, logging in is currently not possible." +msgstr "Sorry, logging in is currently not possible." + +#: File/File.js:131 #, java-format msgid "Sorry, the file exceeds the maximum upload limit of {0} kB." msgstr "Sorry, the file exceeds the maximum upload limit of {0} kB." -#: /Users/tobi/Projects/antville/current/code/User/User.js:114 +#: User/User.js:243 msgid "" -"Sorry, the user name you entered already exists. Please enter a different " -"one." +"Sorry, the username you entered already exists. Please enter a different one." msgstr "" -"Sorry, the user name you entered already exists. Please enter a different " -"one." +"Sorry, the username you entered already exists. Please enter a different one." -#: /Users/tobi/Projects/antville/current/code/User/User.js:110 +#: User/User.js:239 msgid "" "Sorry, the username you entered is too long. Please choose a shorter one." msgstr "" "Sorry, the username you entered is too long. Please choose a shorter one." -#: /Users/tobi/Projects/antville/current/code/File/File.js:147 +#: File/File.js:144 msgid "" "Sorry, there is no disk space left. Please try to delete some files or " "images first." @@ -1680,146 +1477,139 @@ msgstr "" "Sorry, there is no disk space left. Please try to delete some files or " "images first." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:291 +#: Layout/Layout.js:292 msgid "Sorry, this layout is not compatible with Antville." msgstr "Sorry, this layout is not compatible with Antville." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:361 -msgid "Sorry, your input did not match any registered user." -msgstr "Sorry, your input did not match any registered user." +#: Members/Members.js:426 +msgid "Sorry, your input did not match any registered account." +msgstr "Sorry, your input did not match any registered account." -#: /Users/tobi/Projects/antville/current/code/File/File.js:287 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:288 +#: File/File.js:335 #, java-format msgid "Source: {0}" msgstr "Source: {0}" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:24 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:18 +#: Site/Site.skin:18 Site/$Site.skin:1290 Root/Site.skin:24 msgid "Start" msgstr "Start" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:60 +#: Skins/$Skins.skin:60 msgid "Start Page" msgstr "Start Page" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:203 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:249 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:68 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:234 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:124 +#: Site/$Site.skin:282 User/$User.skin:113 Root/$Root.skin:70 +#: Admin/$Admin.skin:224 Admin/$Admin.skin:270 msgid "Status" msgstr "Status" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:115 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1170 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1149 +#: Site/$Site.skin:1290 Poll/$Poll.skin:115 msgid "Stop" msgstr "Stop" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:26 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:22 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:68 +#: Site/Site.skin:26 Stories/Stories.js:22 Stories/Stories.js:68 msgid "Stories" msgstr "Stories" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:117 +#: Stories/Stories.js:117 #, java-format msgid "Stories by {0}" msgstr "Stories by {0}" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:164 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:22 +#: HopObject/HopObject.js:178 Story/Story.js:22 msgid "Story" msgstr "Story" -#: /Users/tobi/Projects/antville/current/code/Archive/Archive.js:99 +#: Archive/Archive.js:99 #, java-format msgid "Story Archive {0} ({1})" msgstr "Story Archive {0} ({1})" -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:64 +#: Admin/$Admin.skin:71 +msgid "Story about Data Privacy Statement" +msgstr "Story about Data Privacy Statement" + +#: Admin/$Admin.skin:60 +msgid "Story about Terms and Conditions" +msgstr "Story about Terms and Conditions" + +#: Skins/$Skins.skin:64 msgid "Stylesheet" msgstr "Stylesheet" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:9 +#: Membership/Membership.skin:9 msgid "Subscribe // verb" msgstr "Subscribe" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:17 +#: Members/$Members.skin:17 msgid "Subscribed" msgstr "Subscribed" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:53 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:92 +#: Membership/Membership.js:53 Site/Site.js:89 msgid "Subscriber" msgstr "Subscriber" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:7 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:246 +#: Members/$Members.skin:7 Members/Members.js:284 msgid "Subscribers" msgstr "Subscribers" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:267 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:10 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:27 +#: Membership/Membership.skin:10 User/$User.skin:27 Members/Members.js:305 msgid "Subscriptions" msgstr "Subscriptions" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:305 +#: Members/Members.js:343 #, java-format msgid "Successfully added {0} to the list of members." msgstr "Successfully added {0} to the list of members." -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:154 +#: Root/Root.js:168 msgid "Successfully created your site." msgstr "Successfully created your site." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:743 +#: Site/Site.js:709 #, java-format msgid "Successfully subscribed to site {0}." msgstr "Successfully subscribed to site {0}." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:757 +#: Site/Site.js:723 #, java-format msgid "Successfully unsubscribed from site {0}." msgstr "Successfully unsubscribed from site {0}." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:182 +#: Layout/Layout.js:182 msgid "Successfully updated the layout." msgstr "Successfully updated the layout." -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:426 +#: Admin/Admin.js:469 msgid "Successfully updated the setup." msgstr "Successfully updated the setup." -#: /Users/tobi/Projects/antville/current/code/Root/Root.skin:2 +#: Root/Root.skin:2 msgid "System is up and running." msgstr "System is up and running." -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:22 +#: Tag/Tag.js:22 msgid "Tag" msgstr "Tag" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:95 +#: Tag/Tag.js:95 #, java-format msgid "Tag: {0}" msgstr "Tag: {0}" -#: /Users/tobi/Projects/antville/current/code/Image/$Image.skin:70 -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:19 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:53 -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:22 +#: Tags/Tags.js:22 Site/Site.skin:19 Image/$Image.skin:72 Story/Story.skin:53 msgid "Tags" msgstr "Tags" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:45 +#: Root/Site.skin:26 Members/$Members.skin:83 +msgid "Terms and Conditions" +msgstr "Terms and Conditions" + +#: Story/Story.skin:45 msgid "Text" msgstr "Text" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:125 +#: Poll/Poll.js:125 msgid "" "Thanks, your vote was registered. You can change your mind until the poll is " "closed." @@ -1827,24 +1617,37 @@ msgstr "" "Thanks, your vote was registered. You can change your mind until the poll is " "closed." -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:38 -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:47 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:145 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:134 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:155 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:123 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:106 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1184 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1194 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:163 +#: Membership/$Membership.skin:107 Membership/$Membership.skin:135 +#: Membership/$Membership.skin:124 Membership/$Membership.skin:156 +#: Membership/$Membership.skin:146 Site/$Site.skin:1304 Site/$Site.skin:1314 +#: User/$User.skin:207 HopObject/$HopObject.skin:38 +#: HopObject/$HopObject.skin:47 msgid "The Management" msgstr "The Management" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:9 +#: Api/$Api.skin:9 msgid "The URL endpoint for each of these APIs is located at" msgstr "The URL endpoint for each of these APIs is located at" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:18 +#: User/User.js:578 +msgid "" +"The account data will be available for download from here within the next " +"days." +msgstr "" +"The account data will be available for download from here within the next " +"days." + +#: User/User.js:566 +msgid "The account is queued for export." +msgstr "The account is queued for export." + +#: User/User.js:626 +#, java-format +#| msgid "The account {0} is being deleted." +msgid "The account {0} was deleted." +msgstr "The account {0} was deleted." + +#: Api/$Api.skin:18 msgid "" "The callback URL will be invoked as an HTTP POST request with the following " "parameters:" @@ -1852,22 +1655,16 @@ msgstr "" "The callback URL will be invoked as an HTTP POST request with the following " "parameters:" -#: /Users/tobi/Projects/antville/current/code/File/File.js:208 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:201 -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:195 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:159 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:320 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:157 -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:99 -#: /Users/tobi/Projects/antville/current/code/User/User.js:390 +#: Membership/Membership.js:159 Site/Site.js:329 User/User.js:532 +#: File/File.js:205 Image/Image.js:203 Skins/Skins.js:99 Skin/Skin.js:157 msgid "The changes were saved successfully." msgstr "The changes were saved successfully." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:118 +#: Site/Site.js:115 msgid "The chosen name is too long. Please enter a shorter one." msgstr "The chosen name is too long. Please enter a shorter one." -#: /Users/tobi/Projects/antville/current/code/Claustra/$Claustra.skin:4 +#: Claustra/$Claustra.skin:4 msgid "" "The claustra – or cloistral chamber – is the first thing an ant queen " "creates when founding a new colony. In Antville, we call that an extension " @@ -1881,15 +1678,15 @@ msgstr "" "To enable or disable an Antville Claustra, simply add it to or remove it " "from the claustra property in app.properties." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:315 +#: Story/Story.js:320 msgid "The comment was successfully created." msgstr "The comment was successfully created." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:164 +#: Comment/Comment.js:166 msgid "The comment was successfully updated." msgstr "The comment was successfully updated." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:11 +#: User/$User.skin:11 #, java-format msgid "" "The easiest way to customize your site is to change its settings. You can change the language and time zone or the main " "title of your site, open or close it and much more." -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:60 +#: Files/Files.js:60 msgid "The file was successfully added." msgstr "The file was successfully added." -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:79 +#: Images/Images.js:79 msgid "The image was successfully added." msgstr "The image was successfully added." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:304 +#: Layout/Layout.js:305 msgid "The layout was successfully imported." msgstr "The layout was successfully imported." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:11 +#: Root/$Root.skin:11 msgid "The name will be part of the URL of your site." msgstr "The name will be part of the URL of your site." -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:81 +#: Membership/Membership.js:81 msgid "The only owner of a site cannot be removed." msgstr "The only owner of a site cannot be removed." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:57 +#: Root/$Root.skin:57 msgid "The path you requested was not found." msgstr "The path you requested was not found." -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:69 +#: Polls/Polls.js:69 msgid "The poll was created successfully." msgstr "The poll was created successfully." -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:162 +#: Poll/Poll.js:162 msgid "The poll was updated successfully." msgstr "The poll was updated successfully." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1157 +#: Site/Site.js:764 +msgid "The site data will be available for download from here, soon." +msgstr "The site data will be available for download from here, soon." + +#: Site/Site.js:752 +msgid "The site is queued for export." +msgstr "The site is queued for export." + +#: Site/$Site.skin:1277 #, java-format msgid "" "The site is scheduled for importing the file {0}. The imported site data " @@ -1941,11 +1746,11 @@ msgstr "" "The site is scheduled for importing the file {0}. The imported site data " "will be available within 24 hours." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:121 +#: HopObject/HopObject.js:136 msgid "The site you requested has been blocked." msgstr "The site you requested has been blocked." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1179 +#: Site/$Site.skin:1299 #, java-format msgid "" "The site {0} at {1} will be blocked in {2} because it is being restricted " @@ -1954,7 +1759,7 @@ msgstr "" "The site {0} at {1} will be blocked in {2} because it is being restricted " "for too long." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1189 +#: Site/$Site.skin:1309 #, java-format msgid "" "The site {0} at {1} will be deleted in {2} because it has been considered as " @@ -1963,25 +1768,25 @@ msgstr "" "The site {0} at {1} will be deleted in {2} because it has been considered as " "abandoned." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:345 +#: Site/Site.js:354 #, java-format -msgid "The site {0} is queued for removal." -msgstr "The site {0} is queued for removal." +msgid "The site {0} is being deleted." +msgstr "The site {0} is being deleted." -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:63 +#: Story/Story.skin:63 #, java-format msgid "The story is {0} and {1}" msgstr "The story is {0} and {1}" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:85 +#: Stories/Stories.js:85 msgid "The story was successfully created." msgstr "The story was successfully created." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:225 +#: Story/Story.js:230 msgid "The story was successfully updated." msgstr "The story was successfully updated." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:23 +#: Root/$Root.skin:23 msgid "" "The title will appear in the header of every page of your site. You can " "change it anytime you want." @@ -1989,7 +1794,7 @@ msgstr "" "The title will appear in the header of every page of your site. You can " "change it anytime you want." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:139 +#: Membership/$Membership.skin:140 #, java-format msgid "" "The user {0} has added your account to the list of members of the site {1} " @@ -1998,12 +1803,12 @@ msgstr "" "The user {0} has added your account to the list of members of the site {1} " "at {2}." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:128 +#: Membership/$Membership.skin:129 #, java-format msgid "The user {0} has modified your membership of the site {1} at {2}." msgstr "The user {0} has modified your membership of the site {1} at {2}." -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:188 +#: Skin/Skin.js:188 #, java-format msgid "" "The {0} macro is missing. It is essential for accessing the site and must be " @@ -2012,26 +1817,29 @@ msgstr "" "The {0} macro is missing. It is essential for accessing the site and must be " "present in this skin." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:127 +#: Site/Site.js:124 msgid "There already is a site with this name." msgstr "There already is a site with this name." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:785 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:823 +#: User/User.js:563 +#, java-format +msgid "There is already another job queued for this account: {0}" +msgstr "There is already another job queued for this account: {0}" + +#: Site/Site.js:749 Site/Site.js:786 #, java-format msgid "There is already another job queued for this site: {0}" msgstr "There is already another job queued for this site: {0}" -#: /Users/tobi/Projects/antville/current/code/File/File.js:271 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:267 +#: File/File.js:268 Image/Image.js:289 msgid "There was nothing to upload. Please be sure to choose a file." msgstr "There was nothing to upload. Please be sure to choose a file." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:152 +#: Members/Members.js:171 msgid "This URL is not valid for resetting your password." msgstr "This URL is not valid for resetting your password." -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:44 +#: Api/$Api.skin:44 #, java-format msgid "" "This callback URL invokes the ping method of the {0}. The essential " @@ -2040,25 +1848,25 @@ msgstr "" "This callback URL invokes the ping method of the {0}. The essential " "JavaScript code is shown below." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:289 +#: Comment/Comment.js:293 msgid "This comment was removed by the author." msgstr "This comment was removed by the author." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:290 +#: Comment/Comment.js:294 msgid "This comment was removed." msgstr "This comment was removed." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:274 +#: Image/Image.js:296 msgid "This does not seem to be a valid JPG, PNG or GIF image." msgstr "This does not seem to be a valid JPG, PNG or GIF image." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:39 +#: Root/$Root.skin:39 msgid "" "This is the directory of public sites hosted here, in alphabetical order." msgstr "" "This is the directory of public sites hosted here, in alphabetical order." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:5 +#: User/$User.skin:5 #, java-format msgid "" "This means that only you and other {0} of this site have access to it. You " @@ -2069,7 +1877,7 @@ msgstr "" "can safely start to customize it or to fill it with all the content you have " "in mind." -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:73 +#: Global/$Global.skin:55 msgid "" "This message was automatically sent to you because you are listed as " "recipient of notification e-mails of the corresponding site." @@ -2077,33 +1885,27 @@ msgstr "" "This message was automatically sent to you because you are listed as " "recipient of notification e-mails of the corresponding site." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:91 +#: Membership/$Membership.skin:92 #, java-format msgid "This message was sent to you by an anonymous user of the site {0} [1]." msgstr "This message was sent to you by an anonymous user of the site {0} [1]." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:94 +#: Membership/$Membership.skin:95 #, java-format msgid "This message was sent to you by the user {0} of the site {1} [1]." msgstr "This message was sent to you by the user {0} of the site {1} [1]." -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:76 +#: Poll/$Poll.skin:76 #, java-format msgid "This poll was closed {0} by {1}" msgstr "This poll was closed {0} by {1}" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:3 +#: User/$User.skin:3 #, java-format msgid "This site is currently {0}." msgstr "This site is currently {0}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1140 -#, java-format -msgid "This site is going to be deleted completely and irreversibly after {0}." -msgstr "" -"This site is going to be deleted completely and irreversibly after {0}." - -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:67 +#: Skins/$Skins.skin:67 msgid "" "This skin contains additional JavaScript code that will be included in every " "page." @@ -2111,7 +1913,7 @@ msgstr "" "This skin contains additional JavaScript code that will be included in every " "page." -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:65 +#: Skins/$Skins.skin:65 msgid "" "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, " "font sizes, colors etc. Modifying this skin will affect the general " @@ -2121,7 +1923,7 @@ msgstr "" "font sizes, colors etc. Modifying this skin will affect the general " "appearance of your site." -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:59 +#: Skins/$Skins.skin:59 msgid "" "This skin defines the basic structure of your site. Modifying it will affect " "the general appearance of your site." @@ -2129,27 +1931,27 @@ msgstr "" "This skin defines the basic structure of your site. Modifying it will affect " "the general appearance of your site." -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:63 +#: Skins/$Skins.skin:63 msgid "This skin is used to display the navigation links on the page." msgstr "This skin is used to display the navigation links on the page." -#: /Users/tobi/Projects/antville/current/code/Skins/$Skins.skin:61 +#: Skins/$Skins.skin:61 msgid "This skin is used to render the start page of your site." msgstr "This skin is used to render the start page of your site." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:363 +#: Members/Members.js:428 msgid "This user is already a member of this site." msgstr "This user is already a member of this site." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:78 +#: Root/$Root.skin:80 msgid "Threads" msgstr "Threads" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:7 +#: User/$User.skin:7 msgid "Thus, it is publicly accessible for every visitor." msgstr "Thus, it is publicly accessible for every visitor." -#: /Users/tobi/Projects/antville/current/code/Global/$Global.skin:75 +#: Global/$Global.skin:57 msgid "" "Thus, you will be notified whenever the site has undergone changes as " "specified in the site preferences." @@ -2157,27 +1959,27 @@ msgstr "" "Thus, you will be notified whenever the site has undergone changes as " "specified in the site preferences." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:91 +#: Site/$Site.skin:111 msgid "Time Zone" msgstr "Time Zone" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:44 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:23 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:35 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:37 +#: User/User.js:612 User/$User.skin:51 User/$User.skin:152 +msgid "Timeline" +msgstr "Timeline" + +#: Site/$Site.skin:43 Root/$Root.skin:23 Root/$Root.skin:44 Story/Story.skin:37 msgid "Title" msgstr "Title" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:32 +#: Api/$Api.skin:32 msgid "Title or name of the site" msgstr "Title or name of the site" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:157 +#: User/$User.skin:201 msgid "To confirm the request please click the link below." msgstr "To confirm the request please click the link below." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/$Recaptcha.skin:5 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:60 +#: Membership/$Membership.skin:60 msgid "" "To prevent abuse, the sender address and the subject of the e-mail are set " "to predefined values." @@ -2185,64 +1987,60 @@ msgstr "" "To prevent abuse, the sender address and the subject of the e-mail are set " "to predefined values." -#: /Users/tobi/Projects/antville/current/code/Stories/$Stories.skin:9 +#: Stories/$Stories.skin:9 msgid "Top" msgstr "Top" -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:125 +#: Stories/Stories.js:125 msgid "Top Stories" msgstr "Top Stories" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:69 +#: Poll/$Poll.skin:69 msgid "Total" msgstr "Total" -#: /Users/tobi/Projects/antville/current/code/Root/Site.skin:9 +#: Root/Site.skin:9 msgid "Total sites hosted here" msgstr "Total sites hosted here" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:121 +#: Site/$Site.skin:148 msgid "Troll Filter" msgstr "Troll Filter" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:376 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:358 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:89 -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:103 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:55 -#: /Users/tobi/Projects/antville/current/code/User/User.js:85 +#: Site/Site.js:54 User/User.js:214 Admin/Admin.js:94 Admin/Admin.js:108 +#: Admin/Admin.js:115 Admin/$Admin.skin:399 Admin/$Admin.skin:420 msgid "Trusted" msgstr "Trusted" -#: /Users/tobi/Projects/antville/current/code/Images/$Images.skin:16 +#: Images/$Images.skin:16 msgid "Type" msgstr "Type" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:26 +#: Api/$Api.skin:26 msgid "URL string of the resource" msgstr "URL string of the resource" -#: /Users/tobi/Projects/antville/current/code/Api/$Api.skin:34 +#: Api/$Api.skin:34 msgid "URL string of the site" msgstr "URL string of the site" -#: /Users/tobi/Projects/antville/current/code/User/User.js:223 -#: /Users/tobi/Projects/antville/current/code/User/User.js:233 +#: User/User.js:357 User/User.js:367 msgid "Unfortunately, your login failed. Maybe a typo?" msgstr "Unfortunately, your login failed. Maybe a typo?" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:191 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:237 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:144 +#: Admin/$Admin.skin:212 Admin/$Admin.skin:258 Admin/$Admin.skin:165 msgid "Update" msgstr "Update" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:255 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:26 +#: Members/Members.js:380 +msgid "Updated Terms & Conditions" +msgstr "Updated Terms & Conditions" + +#: User/$User.skin:26 Members/Members.js:293 msgid "Updates" msgstr "Updates" -#: /Users/tobi/Projects/antville/current/compat/Layout/$Layout.skin:5 +#: ../compat/Layout/$Layout.skin:5 msgid "" "Upload a zipped layout archive created with Antville 1.1 to convert it to an " "archive working with Antville 1.2." @@ -2250,32 +2048,35 @@ msgstr "" "Upload a zipped layout archive created with Antville 1.1 to convert it to an " "archive working with Antville 1.2." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:76 +#: Root/$Root.skin:78 msgid "Uptime" msgstr "Uptime" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:115 -msgid "User name and e-mail address do not match." -msgstr "User name and e-mail address do not match." +#: HopObject/HopObject.js:179 +msgid "User" +msgstr "Account" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:115 +#: Members/Members.js:134 +msgid "Username and e-mail address do not match." +msgstr "Username and e-mail address do not match." + +#: Root/$Root.skin:117 msgid "Version" msgstr "Version" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:28 +#: HopObject/$HopObject.skin:28 msgid "Via" msgstr "Via" -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:58 -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:22 +#: Poll/$Poll.skin:58 Vote/Vote.js:22 msgid "Vote" msgstr "Vote" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:10 +#: HopObject/$HopObject.skin:10 msgid "Warning!" msgstr "Warning!" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:150 +#: Membership/$Membership.skin:151 #, java-format msgid "" "We are sorry to inform you that the user {0} has cancelled your membership " @@ -2284,43 +2085,50 @@ msgstr "" "We are sorry to inform you that the user {0} has cancelled your membership " "of the site {1} at {2}." -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:10 +#: Members/$Members.skin:147 +msgid "" +"We have updated our terms and conditions. Please reaffirm you understand and " +"accept the following:" +msgstr "" +"We have updated our terms and conditions. Please reaffirm you understand and " +"accept the following:" + +#: Site/Site.skin:10 msgid "Welcome" msgstr "Welcome" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:116 +#: Membership/$Membership.skin:117 #, java-format msgid "Welcome to {0}, {1}!" msgstr "Welcome to {0}, {1}!" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:166 -#: /Users/tobi/Projects/antville/current/code/User/User.js:210 +#: User/User.js:344 Members/Members.js:204 Members/Members.js:374 #, java-format msgid "Welcome to {0}, {1}. Have fun!" msgstr "Welcome to {0}, {1}. Have fun!" -#: /Users/tobi/Projects/antville/current/code/Site/Site.skin:14 +#: Site/Site.skin:14 #, java-format msgid "Welcome to {0}." msgstr "Welcome to {0}." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:91 +#: Members/Members.js:105 #, java-format msgid "Welcome to “{0}”, {1}. Have fun!" msgstr "Welcome to “{0}”, {1}. Have fun!" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:98 +#: Root/$Root.skin:100 msgid "Xml-Rpc Count" msgstr "Xml-Rpc Count" -#: /Users/tobi/Projects/antville/current/code/Comment/$Comment.skin:23 +#: Comment/$Comment.skin:23 #, java-format msgid "Yes, really erase {0} comment" msgid_plural "Yes, really erase {0} comments" msgstr[0] "Yes, really erase {0} comment" msgstr[1] "Yes, really erase {0} comments" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:154 +#: User/$User.skin:198 #, java-format msgid "" "You (or someone pretending to be you) requested to reset your account " @@ -2329,52 +2137,61 @@ msgstr "" "You (or someone pretending to be you) requested to reset your account " "password for the site {0} at {1}." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:238 +#: Comment/Comment.js:242 #, java-format -msgid "You are about to delete a comment by user {0}." -msgstr "You are about to delete a comment by user {0}." +msgid "You are about to delete a comment by {0}." +msgstr "You are about to delete a comment by {0}." -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:236 +#: Comment/Comment.js:240 #, java-format msgid "You are about to delete a comment thread consisting of {0} postings." msgstr "You are about to delete a comment thread consisting of {0} postings." -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:236 +#: Poll/Poll.js:236 #, java-format msgid "You are about to delete a poll by user {0}." msgstr "You are about to delete a poll by user {0}." -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:773 +#: Story/Story.js:796 #, java-format -msgid "You are about to delete a story by user {0}." -msgstr "You are about to delete a story by user {0}." +msgid "You are about to delete a story by {0}." +msgstr "You are about to delete a story by {0}." -#: /Users/tobi/Projects/antville/current/code/User/User.js:409 +#: User/User.js:634 #, java-format msgid "You are about to delete the account {0}." msgstr "You are about to delete the account {0}." -#: /Users/tobi/Projects/antville/current/code/File/File.js:354 +#: File/File.js:364 #, java-format msgid "You are about to delete the file {0}." msgstr "You are about to delete the file {0}." -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:565 +#: Image/Image.js:615 #, java-format msgid "You are about to delete the image {0}." msgstr "You are about to delete the image {0}." -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:275 +#: Membership/Membership.js:284 #, java-format -msgid "You are about to delete the membership of user {0}." -msgstr "You are about to delete the membership of user {0}." +msgid "You are about to delete the membership of {0}." +msgstr "You are about to delete the membership of {0}." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:403 +#: Site/Site.js:412 #, java-format msgid "You are about to delete the site {0}." msgstr "You are about to delete the site {0}." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:261 +#: User/$User.skin:171 +#, java-format +msgid "" +"You are about to delete the whole account which currently contains {0}, {1}, " +"{2}, {3}, {4} and {5}." +msgstr "" +"You are about to delete the whole account which currently contains {0}, {1}, " +"{2}, {3}, {4} and {5}." + +#: Site/$Site.skin:309 #, java-format msgid "" "You are about to delete the whole site which currently contains {0}, {1}, " @@ -2383,40 +2200,39 @@ msgstr "" "You are about to delete the whole site which currently contains {0}, {1}, " "{2}, {3} and {4}." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:442 +#: Layout/Layout.js:443 #, java-format msgid "You are about to reset the layout of site {0}." msgstr "You are about to reset the layout of site {0}." -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:427 +#: Skin/Skin.js:427 #, java-format msgid "You are about to reset the skin {0}.{1}." msgstr "You are about to reset the skin {0}.{1}." -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:768 +#: Site/Site.js:734 #, java-format msgid "You are about to unsubscribe from the site {0}." msgstr "You are about to unsubscribe from the site {0}." -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:118 +#: Story/$Story.skin:121 msgid "You are going to discard unsaved content." msgstr "You are going to discard unsaved content." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:140 +#: HopObject/HopObject.js:155 msgid "You are not allowed to access this part of the site." msgstr "You are not allowed to access this part of the site." -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.skin:15 +#: Membership/Membership.skin:15 msgid "You are not logged in" msgstr "You are not logged in" -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:142 -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:131 +#: Membership/$Membership.skin:132 Membership/$Membership.skin:143 #, java-format msgid "You are now {0} of the site." msgstr "You are now {0} of the site." -#: /Users/tobi/Projects/antville/current/code/Membership/$Membership.skin:118 +#: Membership/$Membership.skin:119 msgid "" "You can edit your account profile and change its password any time via the " "following link:" @@ -2424,11 +2240,11 @@ msgstr "" "You can edit your account profile and change its password any time via the " "following link:" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:139 +#: Admin/$Admin.skin:160 msgid "You can filter the results by account. Use the asterisk * as wildcard." msgstr "You can filter the results by account. Use the asterisk * as wildcard." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:232 +#: Admin/$Admin.skin:253 msgid "" "You can filter the results by name or by e-mail address. Use the asterisk * " "as wildcard." @@ -2436,707 +2252,772 @@ msgstr "" "You can filter the results by name or by e-mail address. Use the asterisk * " "as wildcard." -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:186 +#: Admin/$Admin.skin:207 msgid "" "You can filter the results by site name. Use the asterisk * as wildcard." msgstr "" "You can filter the results by site name. Use the asterisk * as wildcard." -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:193 +#: Members/$Members.skin:205 msgid "You can use the asterisk * as wildcard." msgstr "You can use the asterisk * as wildcard." -#: /Users/tobi/Projects/antville/current/code/User/User.js:433 -msgid "You cannot revoke permissions from the only privileged user." -msgstr "You cannot revoke permissions from the only privileged user." +#: User/User.js:686 +msgid "You cannot delete a privileged account." +msgstr "You cannot delete a privileged account." -#: /Users/tobi/Projects/antville/current/claustra/connect/Connect/Connect.js:102 -msgid "You denied the request." -msgstr "You denied the request." +#: User/User.js:683 +msgid "You cannot revoke permissions from the only privileged account." +msgstr "You cannot revoke permissions from the only privileged account." -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:145 +#: Poll/Poll.js:145 msgid "You did not vote, yet. You can vote until the poll is closed." msgstr "You did not vote, yet. You can vote until the poll is closed." -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:390 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:399 +#: Root/Root.js:407 Root/Root.js:416 #, java-format msgid "You need to wait {0} before you are allowed to create a new site." msgstr "You need to wait {0} before you are allowed to create a new site." -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:158 +#: User/$User.skin:202 msgid "You will then be asked to change your password." msgstr "You will then be asked to change your password." -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:112 +#: HopObject/HopObject.js:119 msgid "Your account has been blocked." msgstr "Your account has been blocked." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:33 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:198 +#: Membership/Membership.js:202 msgid "Your message was sent successfully." msgstr "Your message was sent successfully." -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:141 +#: Members/Members.js:160 msgid "Your password was changed." msgstr "Your password was changed." -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:32 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:197 +#: Membership/Membership.js:200 #, java-format -msgid "[{0}] Message from anonymous user" -msgstr "[{0}] Message from anonymous user" +msgid "[{0}] Message from anonymous" +msgstr "[{0}] Message from anonymous" -#: /Users/tobi/Projects/antville/current/claustra/recaptcha/Membership/Membership.js:31 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:196 +#: Membership/Membership.js:199 #, java-format -msgid "[{0}] Message from user {1}" -msgstr "[{0}] Message from user {1}" +msgid "[{0}] Message from {1}" +msgstr "[{0}] Message from {1}" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:87 +#: Membership/Membership.js:87 #, java-format msgid "[{0}] Notification of membership cancellation" msgstr "[{0}] Notification of membership cancellation" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:304 -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:184 +#: Membership/Membership.js:184 Members/Members.js:342 #, java-format msgid "[{0}] Notification of membership change" msgstr "[{0}] Notification of membership change" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:249 +#: HopObject/HopObject.js:267 #, java-format msgid "[{0}] Notification of site changes" msgstr "[{0}] Notification of site changes" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:119 +#: Members/Members.js:138 #, java-format msgid "[{0}] Password reset confirmation" msgstr "[{0}] Password reset confirmation" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:213 +#: Admin/Admin.js:235 #, java-format msgid "[{0}] Warning: Site will be blocked" msgstr "[{0}] Warning: Site will be blocked" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:187 +#: Admin/Admin.js:209 #, java-format msgid "[{0}] Warning: Site will be deleted" msgstr "[{0}] Warning: Site will be deleted" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:90 +#: Members/Members.js:103 #, java-format msgid "[{0}] Welcome to {1}!" msgstr "[{0}] Welcome to {1}!" -#: /Users/tobi/Projects/antville/current/code/User/User.js:24 +#: User/User.js:24 msgid "a account // accusative" msgstr "an account" -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:24 +#: Choice/Choice.js:24 msgid "a choice // accusative" msgstr "a choice" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:24 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 Comment/Comment.js:24 msgid "a comment // accusative" msgstr "a comment" -#: /Users/tobi/Projects/antville/current/code/File/File.js:24 +#: File/File.js:24 msgid "a file // accusative" msgstr "a file" -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:24 +#: Image/Image.js:26 msgid "a image // accusative" msgstr "an image" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:24 +#: Layout/Layout.js:24 msgid "a layout" msgstr "a layout" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:24 +#: Membership/Membership.js:24 msgid "a membership // accusative" msgstr "a membership" -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:24 +#: Poll/Poll.js:24 msgid "a poll // accusative" msgstr "a poll" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:24 +#: Site/Site.js:24 msgid "a site // accusative" msgstr "a site" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:24 +#: Skin/Skin.js:24 msgid "a skin // accusative" msgstr "a skin" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:24 +#: Story/$Story.skin:50 Story/Story.js:24 msgid "a story // accusative" msgstr "a story" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:24 +#: Tag/Tag.js:24 msgid "a tag // accusative" msgstr "a tag" -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:24 +#: Vote/Vote.js:24 msgid "a vote" msgstr "a vote" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/User/User.js:23 +#: User/User.js:23 Admin/$Admin.skin:152 msgid "account" msgstr "account" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:198 Admin/$Admin.skin:244 msgid "all" msgstr "all" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "any" msgstr "any" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: Admin/$Admin.skin:200 Admin/$Admin.skin:246 Admin/$Admin.skin:153 msgid "ascending" msgstr "ascending" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:198 Admin/$Admin.skin:244 msgid "blocked" msgstr "blocked" -#: /Users/tobi/Projects/antville/current/code/Choice/Choice.js:23 +#: Choice/Choice.js:23 msgid "choice" msgstr "choice" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:83 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:78 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:92 +#: Site/Site.js:80 Poll/Poll.js:32 Story/Story.js:78 Story/Story.js:92 +#: Admin/$Admin.skin:198 msgid "closed" msgstr "closed" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:23 +#: Admin/$Admin.skin:152 Comment/Comment.js:23 msgid "comment" msgstr "comment" -#: /Users/tobi/Projects/antville/current/code/Global/i18n.js:59 +#: Global/i18n.js:59 msgid "comment // verb" msgstr "comment" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "content" msgstr "content" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "created" msgstr "created" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:63 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:71 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:90 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:98 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:69 +#: Site/Site.js:67 Admin/$Admin.skin:96 Admin/$Admin.skin:104 +#: Admin/$Admin.skin:123 Admin/$Admin.skin:131 msgid "days" msgstr "days" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:29 +#: Admin/$Admin.skin:198 Admin/$Admin.skin:244 Comment/Comment.js:31 msgid "deleted" msgstr "deleted" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:179 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:225 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:132 +#: Admin/$Admin.skin:200 Admin/$Admin.skin:246 Admin/$Admin.skin:153 msgid "descending" msgstr "descending" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:76 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:98 +#: Site/Site.js:73 Site/Site.js:95 msgid "disabled" msgstr "disabled" -#: /Users/tobi/Projects/antville/current/code/Members/$Members.skin:106 +#: Members/$Members.skin:100 msgid "e-mail" msgstr "e-mail" -#: /Users/tobi/Projects/antville/current/code/Layout/$Layout.skin:18 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:66 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:77 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:146 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:77 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:99 +#: Admin/$Admin.skin:63 Admin/$Admin.skin:74 +#, java-format +msgid "e.g. {0}" +msgstr "e.g. {0}" + +#: Site/Site.js:74 Site/Site.js:96 Site/$Site.skin:81 Site/$Site.skin:94 +#: Site/$Site.skin:178 Layout/$Layout.skin:23 msgid "enabled" msgstr "enabled" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:22 +#: Admin/Admin.js:22 msgid "export" msgstr "export" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:86 +#: Story/Story.js:86 msgid "featured" msgstr "featured" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/File/File.js:23 +#: File/File.js:23 Admin/$Admin.skin:152 msgid "file" msgstr "file" -#: /Users/tobi/Projects/antville/current/code/Files/Files.js:23 +#: Files/Files.js:23 msgid "files" msgstr "files" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: Site/Site.js:936 msgid "free" msgstr "free" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:85 +#: Story/Story.js:85 msgid "hidden" msgstr "hidden" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Image/Image.js:23 +#: Image/Image.js:25 Admin/$Admin.skin:152 msgid "image" msgstr "image" -#: /Users/tobi/Projects/antville/current/code/Images/Images.js:23 +#: Images/Images.js:23 msgid "images" msgstr "images" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:23 +#: Admin/Admin.js:23 msgid "import" msgstr "import" -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:16 +#: Story/Story.skin:16 msgid "in" msgstr "in" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:224 +#: Global/Global.js:1120 +#, java-format +msgid "in {0} day" +msgid_plural "in {0} days" +msgstr[0] "in {0} day" +msgstr[1] "in {0} days" + +#: Global/Global.js:1116 +#, java-format +msgid "in {0} hour" +msgid_plural "in {0} hours" +msgstr[0] "in {0} hour" +msgstr[1] "in {0} hours" + +#: Global/Global.js:1114 +#, java-format +msgid "in {0} minute" +msgid_plural "in {0} minutes" +msgstr[0] "in {0} minute" +msgstr[1] "in {0} minutes" + +#: Global/Global.js:1124 +#, java-format +msgid "in {0} month" +msgid_plural "in {0} months" +msgstr[0] "in {0} month" +msgstr[1] "in {0} months" + +#: Global/Global.js:1122 +#, java-format +msgid "in {0} week" +msgid_plural "in {0} weeks" +msgstr[0] "in {0} week" +msgstr[1] "in {0} weeks" + +#: Global/Global.js:1126 +#, java-format +msgid "in {0} year" +msgid_plural "in {0} years" +msgstr[0] "in {0} year" +msgstr[1] "in {0} years" + +#: Admin/$Admin.skin:245 msgid "last login" msgstr "last login" -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:23 +#: Layout/Layout.js:23 msgid "layout" msgstr "layout" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 +#: Admin/$Admin.skin:152 msgid "link" msgstr "link" -#: /Users/tobi/Projects/antville/current/code/LogEntry/LogEntry.js:23 +#: LogEntry/LogEntry.js:23 msgid "log entry" msgstr "log entry" -#: /Users/tobi/Projects/antville/current/code/Members/Members.js:23 +#: Members/Members.js:23 msgid "members" msgstr "members" -#: /Users/tobi/Projects/antville/current/code/Membership/Membership.js:23 +#: Membership/Membership.js:23 msgid "membership" msgstr "membership" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "modified" msgstr "modified" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:178 +#: Admin/$Admin.skin:199 msgid "name" msgstr "name" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:32 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:94 +#: Poll/Poll.js:32 Story/Story.js:79 Story/Story.js:94 Admin/$Admin.skin:198 msgid "open" msgstr "open" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:5 +#: User/$User.skin:5 msgid "owners" msgstr "owners" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 +#: Comment/Comment.js:32 msgid "pending" msgstr "pending" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Poll/Poll.js:23 +#: Poll/Poll.js:23 Admin/$Admin.skin:152 msgid "poll" msgstr "poll" -#: /Users/tobi/Projects/antville/current/code/Polls/Polls.js:23 +#: Polls/Polls.js:23 msgid "polls" msgstr "polls" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 msgid "posted // has posted" msgstr "posted" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Admin/$Admin.skin:244 msgid "privileged" msgstr "privileged" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:84 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 +#: Site/Site.js:81 Story/Story.js:79 Admin/$Admin.skin:198 +#: Comment/Comment.js:32 msgid "public" msgstr "public" -#: /Users/tobi/Projects/antville/current/code/Comment/Comment.js:30 +#: Comment/Comment.js:32 msgid "readonly" msgstr "readonly" -#: /Users/tobi/Projects/antville/current/code/Admin/Admin.js:24 +#: Admin/Admin.js:24 msgid "remove" msgstr "remove" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 +#: Admin/$Admin.skin:198 msgid "restricted" msgstr "restricted" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1106 +#: Global/Global.js:1165 msgid "right now" msgstr "right now" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:79 +#: Story/Story.js:79 msgid "shared" msgstr "shared" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:131 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:23 +#: Site/Site.js:23 Admin/$Admin.skin:152 msgid "site" msgstr "site" -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:23 +#: Skin/Skin.js:23 msgid "skin" msgstr "skin" -#: /Users/tobi/Projects/antville/current/code/Skins/Skins.js:23 +#: Skins/Skins.js:23 msgid "skins" msgstr "skins" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:70 -#: /Users/tobi/Projects/antville/current/code/Stories/Stories.js:23 +#: Global/Global.js:1112 +msgid "soon" +msgstr "soon" + +#: Site/$Site.skin:68 Stories/Stories.js:23 msgid "stories" msgstr "stories" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:23 +#: Story/Story.js:23 msgid "story" msgstr "story" -#: /Users/tobi/Projects/antville/current/code/Tag/Tag.js:23 +#: Tag/Tag.js:23 msgid "tag" msgstr "tag" -#: /Users/tobi/Projects/antville/current/code/Tags/Tags.js:23 +#: Tags/Tags.js:23 msgid "tags" msgstr "tags" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:177 -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:223 +#: Global/Global.js:1118 +msgid "tomorrow" +msgstr "tomorrow" + +#: Admin/$Admin.skin:198 Admin/$Admin.skin:244 msgid "trusted" msgstr "trusted" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 msgid "updated // has updated" msgstr "updated" -#: /Users/tobi/Projects/antville/current/code/Site/Site.js:988 +#: Site/Site.js:936 msgid "used" msgstr "used" -#: /Users/tobi/Projects/antville/current/code/Vote/Vote.js:23 +#: Vote/Vote.js:23 msgid "vote" msgstr "vote" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1112 +#: Global/Global.js:1171 msgid "yesterday" msgstr "yesterday" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:138 -#, java-format -msgid "{0} 401 Error" -msgstr "{0} 401 Error" - -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:245 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:136 +#: Site/$Site.skin:293 User/$User.skin:125 #, java-format msgid "{0} Comment" msgid_plural "{0} Comments" msgstr[0] "{0} Comment" msgstr[1] "{0} Comments" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:247 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:138 +#: Site/$Site.skin:295 User/$User.skin:127 #, java-format msgid "{0} File" msgid_plural "{0} Files" msgstr[0] "{0} File" msgstr[1] "{0} Files" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:246 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:137 +#: Site/$Site.skin:294 User/$User.skin:126 #, java-format msgid "{0} Image" msgid_plural "{0} Images" msgstr[0] "{0} Image" msgstr[1] "{0} Images" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:105 +#: Root/$Root.skin:107 #, java-format msgid "{0} MB free" msgstr "{0} MB free" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:104 +#: Root/$Root.skin:106 #, java-format msgid "{0} MB total" msgstr "{0} MB total" -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:134 +#: User/$User.skin:123 #, java-format msgid "{0} Site" msgid_plural "{0} Sites" msgstr[0] "{0} Site" msgstr[1] "{0} Sites" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:244 -#: /Users/tobi/Projects/antville/current/code/User/$User.skin:135 +#: Site/$Site.skin:292 User/$User.skin:124 #, java-format msgid "{0} Story" msgid_plural "{0} Stories" msgstr[0] "{0} Story" msgstr[1] "{0} Stories" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:222 +#: Admin/$Admin.skin:243 #, java-format msgid "{0} accounts sorted by {1} in {2} order." msgstr "{0} accounts sorted by {1} in {2} order." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:80 +#: Root/$Root.skin:82 #, java-format msgid "{0} active" msgstr "{0} active" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:130 +#: Admin/$Admin.skin:151 #, java-format msgid "{0} activity sorted by date in {1} order." msgstr "{0} activity sorted by date in {1} order." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:111 +#: Root/$Root.skin:113 #, java-format msgid "{0} callback" msgid_plural "{0} callbacks" msgstr[0] "{0} callback" msgstr[1] "{0} callbacks" -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:531 +#: Story/Story.js:545 #, java-format msgid "{0} character" msgid_plural "{0} characters" msgstr[0] "{0} character" msgstr[1] "{0} characters" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:263 -#: /Users/tobi/Projects/antville/current/code/Story/Story.js:559 +#: Site/$Site.skin:311 User/$User.skin:174 Story/Story.js:574 #, java-format msgid "{0} comment" msgid_plural "{0} comments" msgstr[0] "{0} comment" msgstr[1] "{0} comments" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:77 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:391 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:400 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1181 -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:1191 +#: Site/$Site.skin:1301 Site/$Site.skin:1311 Root/Root.js:408 Root/Root.js:417 +#: Root/$Root.skin:79 #, java-format msgid "{0} day" msgid_plural "{0} days" msgstr[0] "{0} day" msgstr[1] "{0} days" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1114 +#: Global/Global.js:1173 #, java-format msgid "{0} day ago" msgid_plural "{0} days ago" msgstr[0] "{0} day ago" msgstr[1] "{0} days ago" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:265 +#: Site/$Site.skin:313 User/$User.skin:176 #, java-format msgid "{0} file" msgid_plural "{0} files" msgstr[0] "{0} file" msgstr[1] "{0} files" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:81 +#: Root/$Root.skin:83 #, java-format msgid "{0} free" msgstr "{0} free" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:34 +#: HopObject/$HopObject.skin:34 #, java-format msgid "{0} has added {1} to the site {2}:" msgstr "{0} has added {1} to the site {2}:" -#: /Users/tobi/Projects/antville/current/code/HopObject/$HopObject.skin:43 +#: HopObject/$HopObject.skin:43 #, java-format msgid "{0} has modified {1} at the site {2}:" msgstr "{0} has modified {1} at the site {2}:" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1110 +#: Global/Global.js:1169 #, java-format msgid "{0} hour ago" msgid_plural "{0} hours ago" msgstr[0] "{0} hour ago" msgstr[1] "{0} hours ago" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:264 +#: Site/$Site.skin:312 User/$User.skin:175 #, java-format msgid "{0} image" msgid_plural "{0} images" msgstr[0] "{0} image" msgstr[1] "{0} images" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:86 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:91 +#: Root/$Root.skin:88 Root/$Root.skin:93 #, java-format msgid "{0} in the last 5 min." msgstr "{0} in the last 5 min." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:114 +#: Root/$Root.skin:116 #, java-format msgid "{0} log entries" msgstr "{0} log entries" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:110 +#: Root/$Root.skin:112 #, java-format msgid "{0} mail" msgid_plural "{0} mails" msgstr[0] "{0} mail" msgstr[1] "{0} mails" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1108 +#: Global/Global.js:1167 #, java-format msgid "{0} minute ago" msgid_plural "{0} minutes ago" msgstr[0] "{0} minute ago" msgstr[1] "{0} minutes ago" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1118 +#: Global/Global.js:1177 #, java-format msgid "{0} month ago" msgid_plural "{0} months ago" msgstr[0] "{0} month ago" msgstr[1] "{0} months ago" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:101 +#: Root/$Root.skin:103 #, java-format msgid "{0} of {1} objects" msgstr "{0} of {1} objects" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:55 +#: Site/$Site.skin:68 #, java-format msgid "{0} per page" msgstr "{0} per page" -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:266 +#: Site/$Site.skin:314 User/$User.skin:177 #, java-format msgid "{0} poll" msgid_plural "{0} polls" msgstr[0] "{0} poll" msgstr[1] "{0} polls" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:99 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:109 -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:5 -#: /Users/tobi/Projects/antville/current/code/Story/Story.skin:75 +#: Root/$Root.skin:101 Root/$Root.skin:111 Story/Story.skin:75 +#: Story/$Story.skin:5 #, java-format msgid "{0} request" msgid_plural "{0} requests" msgstr[0] "{0} request" msgstr[1] "{0} requests" -#: /Users/tobi/Projects/antville/current/code/Admin/$Admin.skin:176 +#: User/$User.skin:172 +#, java-format +msgid "{0} site" +msgid_plural "{0} sites" +msgstr[0] "{0} site" +msgstr[1] "{0} sites" + +#: Admin/$Admin.skin:197 #, java-format msgid "{0} sites sorted by {1} in {2} order." msgstr "{0} sites sorted by {1} in {2} order." -#: /Users/tobi/Projects/antville/current/code/Site/$Site.skin:262 +#: Site/$Site.skin:310 User/$User.skin:173 #, java-format msgid "{0} story" msgid_plural "{0} stories" msgstr[0] "{0} story" msgstr[1] "{0} stories" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:85 -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:90 +#: Root/$Root.skin:87 Root/$Root.skin:92 #, java-format msgid "{0} total" msgstr "{0} total" -#: /Users/tobi/Projects/antville/current/code/Choice/$Choice.skin:23 -#: /Users/tobi/Projects/antville/current/code/Poll/$Poll.skin:70 +#: Poll/$Poll.skin:70 Choice/$Choice.skin:23 #, java-format msgid "{0} vote" msgid_plural "{0} votes" msgstr[0] "{0} vote" msgstr[1] "{0} votes" -#: /Users/tobi/Projects/antville/current/code/HopObject/HopObject.js:171 +#: HopObject/HopObject.js:189 #, java-format msgid "{0} was successfully deleted." msgstr "{0} was successfully deleted." -#: /Users/tobi/Projects/antville/current/code/Layout/Layout.js:245 -#: /Users/tobi/Projects/antville/current/code/Skin/Skin.js:200 +#: Skin/Skin.js:200 Layout/Layout.js:245 #, java-format msgid "{0} was successfully reset." msgstr "{0} was successfully reset." -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1116 +#: Global/Global.js:1175 #, java-format msgid "{0} week ago" msgid_plural "{0} weeks ago" msgstr[0] "{0} week ago" msgstr[1] "{0} weeks ago" -#: /Users/tobi/Projects/antville/current/code/Global/Global.js:1120 +#: Global/Global.js:1179 #, java-format msgid "{0} year ago" msgid_plural "{0} years ago" msgstr[0] "{0} year ago" msgstr[1] "{0} years ago" -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:129 -#: /Users/tobi/Projects/antville/current/code/Root/Root.js:137 +#: Root/Root.js:141 Root/Root.js:149 #, java-format msgid "{0} {1} Error" msgstr "{0} {1} Error" -#: /Users/tobi/Projects/antville/current/code/Story/$Story.skin:50 +#: Story/$Story.skin:50 #, java-format msgid "" "{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on " "{Antville}”" msgstr "{0} {1} {2} {3} on {4}" -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:96 +#: Root/$Root.skin:98 #, java-format msgid "{0}% in the last 5 min." msgstr "{0}% in the last 5 min." -#: /Users/tobi/Projects/antville/current/code/Root/$Root.skin:95 +#: Root/$Root.skin:97 #, java-format msgid "{0}% total" msgstr "{0}% total" +#: Site/$Site.skin:1265 User/$User.skin:142 +#, java-format +msgid "{0}Download the archive{1} or click “Export” to create a new one." +msgstr "{0}Download the archive{1} or click “Export” to create a new one." + +#~ msgid "Connect with {0}" +#~ msgstr "Connect with {0}" + +#~ msgid "Connecting with {0} failed. {1} Please try again." +#~ msgstr "Connecting with {0} failed. {1} Please try again." + +#~ msgid "Connections" +#~ msgstr "Connections" + +#~ msgid "Could not connect with Facebook. ({0})" +#~ msgstr "Could not connect with Facebook. ({0})" + +#~ msgid "Disconnect from {0}" +#~ msgstr "Disconnect from {0}" + +#~ msgid "Login with {0}" +#~ msgstr "Login with {0}" + +#~ msgid "You denied the request." +#~ msgstr "You denied the request." + +#~ msgid "Browse" +#~ msgstr "Browse" + +#~ msgid "Click to cancel deletion" +#~ msgstr "Click to cancel deletion" + +#~ msgid "Deleted Site" +#~ msgstr "Deleted Site" + +#~ msgid "Scheduled for deletion {0}" +#~ msgstr "Scheduled for deletion {0}" + +#~ msgid "This site is going to be deleted completely and irreversibly {0}." +#~ msgstr "This site is going to be deleted completely and irreversibly {0}." + +#~ msgid "" +#~ "You still can revert the request for deletion in the {0}site settings{1}." +#~ msgstr "" +#~ "You still can revert the request for deletion in the {0}site settings{1}." + +#~ msgid "" +#~ "Currently, it is not possible to delete an account. Please accept our " +#~ "humble apologies." +#~ msgstr "" +#~ "Currently, it is not possible to delete an account. Please accept our " +#~ "humble apologies." + +#~ msgid "Sites created by {0}" +#~ msgstr "Sites created by {0}" + +#~ msgid "{0} 401 Error" +#~ msgstr "{0} 401 Error" + +#~ msgid "now" +#~ msgstr "now" + #~ msgid "ID" #~ msgstr "ID" @@ -3149,9 +3030,6 @@ msgstr "{0}% total" #~ msgid "Source" #~ msgstr "Source" -#~ msgid "User" -#~ msgstr "User" - #~ msgid "Username" #~ msgstr "Username" @@ -3257,9 +3135,6 @@ msgstr "{0}% total" #~ msgid "Current Password" #~ msgstr "Current Password" -#~ msgid "Date" -#~ msgstr "Date" - #~ msgid "Default Callback Url" #~ msgstr "Default Callback Url" @@ -3621,9 +3496,6 @@ msgstr "{0}% total" #~ msgid "edit" #~ msgstr "edit" -#~ msgid "no" -#~ msgstr "no" - #~ msgid "no comments" #~ msgstr "no comments" diff --git a/i18n/messages.de-x-male.js b/i18n/messages.de-x-male.js index 0d56402d..5694020f 100644 --- a/i18n/messages.de-x-male.js +++ b/i18n/messages.de-x-male.js @@ -11,13 +11,14 @@ if (!global.messages) { global.messages['de-x-male'] = { "({0} character)": "({0} Zeichen)", "({0} characters)": "({0} Zeichen)", - "A Blogger export file (.xml) will be created and available for download from here within 24 hours.": "Eine Blogger-Export-Datei (.xml) wird erstellt und steht hier spätestens nach 24 Stunden zum Download bereit.", "A confirmation mail was sent to your e-mail address.": "Eine Bestätigungs-Nachricht wurde an Ihre E-Mail-Adresse geschickt.", "A generic disclaimer will be automatically appended to your message.": "Ein allgemeiner Hinweis wird der Nachricht automatisch hinzugefügt.", "API": "API", "Abandoned": "Verwaist", + "Accept": "Akzeptieren", "Account": "Konto", "Account Image": "Kontobild", + "Account is being deleted": "Konto wird gelöscht", "Accounts": "Konten", "Activity": "Aktivität", "Add Choice": "Antwortmöglichkeit hinzufügen", @@ -51,7 +52,6 @@ global.messages['de-x-male'] = { "Blocked": "Gesperrt", "Bookmarklet": "Bookmarklet", "Both": "Beides", - "Browse": "Blättern", "Build": "Gestalt", "Cache": "Zwischenspeicher", "Callback URL": "Rückruf-Adresse", @@ -97,11 +97,14 @@ global.messages['de-x-male'] = { "Created": "Erstellt", "Created by {0} on {1}": "Erstellt von {0} am {1}", "Created by {0} on {1}.": "Erstellt von {0} am {1}.", + "Created on {0}": "Erstellt am {0}", "Created {0}": "Erstellt {0}", - "Currently, it is not possible to remove an account. Please accept our humble apologies.": "Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis.", + "Data Privacy Statement": "Datenschutzerklärung", + "Date": "Datum", "Date string in Unix timestamp format": "Datum im Unix-Format", "Delete": "Löschen", "Deleted": "Gelöscht", + "Deleted on {0}": "Gelöscht am {0}", "Description": "Beschreibung", "Details": "Einzelheiten", "Development": "Entwicklung", @@ -113,9 +116,8 @@ global.messages['de-x-male'] = { "Disk Space": "Speicherplatz", "Display": "Anzeige", "Do Androids dream of electric sheep?": "Zählen Androiden elektrische Schäfchen?", - "Download the file {0} or klick “Start” to create a new one.": "Laden Sie die Datei {0} herunter oder klicken Sie »Start«, um eine neue zu erstellen.", "Drag to Bookmarks Bar": "In die Lesezeichenleiste ziehen", - "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.", + "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.", "E-mail": "E-Mail", "E.g. if you enter {0} here your site will be reachable via {1}": "Wenn Sie z.B. {0} als Name eingeben, wird die Website unter dieser Adresse erreichbar sein: {1}", "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL – on a server and in a programming language of their choice.": "Jede Antville-Site bietet in den Einstellungen die Möglichkeit, eine Rückruf-Adresse zu definieren, die bei jeder Änderung des Inhalts aufgerufen wird. Auf diese Weise können Benutzer mittels eigenem Programmcode verschiedene Ereignisse individuell behandeln – auf einem Server und in einer Programmiersprache ihrer Wahl.", @@ -134,6 +136,7 @@ global.messages['de-x-male'] = { "Error Ratio": "Fehler-Rate", "Errors": "Fehler", "Export": "Exportieren", + "Export Account Data": "Kontodaten exportieren", "Export Site Data": "Site-Daten exportieren", "File": "Datei", "File size is exceeding the upload limit.": "Die Dateigröße überschreitet die Upload-Grenze.", @@ -151,10 +154,13 @@ global.messages['de-x-male'] = { "Have fun!": "Viele Späße!", "Health": "Statusmonitor", "Hello {0}.": "Hallo {0}.", + "Helma Version": "Helma-Version", "Hide": "Verstecken", + "I understand and accept the {0}data privacy statement{1}": "Ich verstehe und akzeptiere die {0}Datenschutzerklärung{1}", + "I understand and accept the {0}terms and conditions{1}": "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}", "If the user did not include contact information in the message itself, you can send your reply via the user’s contact form [2].": "Falls der Absender der Nachricht keine Kontaktinformationen hinzugefügt hat, können Sie Ihre Antwort über das Kontaktformular senden [2].", "If you do not specify a name Antville will create one based on the filename.": "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des Dateinamens erstellen.", - "If you enter a URL here your user name will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.", + "If you enter a URL here your username will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.", "If you should really have forgotten your password, you can use the password reset option.": "Falls Sie Ihr Kennwort vergessen haben sollten, können Sie es zurücksetzen lassen.", "If you think you have received this e-mail in error please contact the maintainer of the site.": "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte Verbindung mit dem Eigentümer der Website auf.", "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "Sollten Sie die Bildgröße verkleinern wollen, geben Sie bitte die gewünschte Maximalbreite und/oder -höhe in Pixel an. Falls Sie beides angeben, wird versucht beide Angaben zu erfüllen, das Seitenverhältnis wird aber beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, erstellt Antville außerdem automatisch ein Miniaturbild davon.", @@ -174,6 +180,7 @@ global.messages['de-x-male'] = { "Last Login": "Letzte Anmeldung", "Last Update": "Letzte Änderung", "Last modified by {0} on {1}": "Zuletzt geändert von {0} am {1}", + "Last modified on {0}": "Zuletzt geändert am {0}", "Last modified {0}": "Zuletzt geändert {0}", "Layout": "Layout", "Layout Images": "Layout-Bilder", @@ -227,7 +234,7 @@ global.messages['de-x-male'] = { "Pixels": "Pixel", "Please avoid special characters or HTML code in the name field.": "Bitte vermeiden Sie Sonderzeichen oder HTML-Code im Feld für den Namen.", "Please be aware of the fact that there is no “undo”, so if you click “Proceed” below the changes will be applied irreversibly.": "Bitte seien Sie sich bewusst, dass diese Aktion nicht rückgängig gemacht werden kann. Wenn Sie also auf »Fortfahren« klicken, werden die Änderungen unwiderruflich durchgeführt.", - "Please choose a prototype and enter a skin name": "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin.", + "Please choose a prototype and enter a skin name": "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin", "Please choose a role for this member.": "Bitte wählen Sie eine Rolle für dieses Mitglied.", "Please contact an administrator for further information.": "Bitte wenden Sie sich an einen Administrator für weitere Informationen.", "Please enable JavaScript in your browser for improved functionality.": "Bitte aktivieren Sie für optimale Funktionalität JavaScript in Ihrem Browser.", @@ -235,9 +242,9 @@ global.messages['de-x-male'] = { "Please enter a new name for this tag": "Bitte geben Sie einen neuen Namen für dieses Stichwort an", "Please enter a new password.": "Bitte geben Sie ein neues Kennwort ein.", "Please enter a query in the search form.": "Bitte geben Sie eine Suchanfrage in das Suchformular ein.", - "Please enter a user name and e-mail address.": "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein.", + "Please enter a username and e-mail address.": "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein.", "Please enter a username.": "Bitte geben Sie einen Namen ein.", - "Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein.", + "Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein", "Please enter a valid e-mail address": "Bitte geben Sie eine gültige E-Mail-Adresse an", "Please enter at least something into the “title” or “text” field.": "Bitte geben Sie zumindest etwas in eines der beiden Felder »Titel« oder »Text« ein.", "Please enter something into the comment field.": "Bitte geben Sie etwas in das Kommentarfeld ein.", @@ -275,6 +282,7 @@ global.messages['de-x-male'] = { "Register": "Registrieren", "Registered": "Registriert", "Registration": "Registrierung", + "Registration & Login": "Registrierung & Anmeldung", "Regular": "Normal", "Remember Login": "Anmeldung speichern", "Request Password Reset": "Anfrage zum Zurücksetzen des Kennworts", @@ -291,6 +299,8 @@ global.messages['de-x-male'] = { "Save": "Speichern", "Save and Run": "Speichern und starten", "Search": "Suche", + "Search with {0}": "Mit {0} suchen", + "Select": "Auswählen", "Send": "Senden", "Send Request": "Anfrage senden", "Separated by commas": "Durch Komma getrennt", @@ -306,7 +316,6 @@ global.messages['de-x-male'] = { "Site Creation": "Erstellen von Websites", "Site Page": "Basis-Seite", "Site Phase-Out": "Automatisches Löschen von Websites", - "Site is scheduled for export.": "Die Website ist für den Export eingeplant.", "Site is scheduled for import.": "Die Website ist für den Import eingeplant.", "Sites": "Sites", "Size": "Größe", @@ -314,12 +323,13 @@ global.messages['de-x-male'] = { "Skins": "Skins", "Something went wrong.": "Irgendwas ist schiefgelaufen.", "Sorry!": "Hoppla!", + "Sorry, logging in is currently not possible.": "Die Anmeldung ist derzeit leider nicht möglich.", "Sorry, the file exceeds the maximum upload limit of {0} kB.": "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB.", - "Sorry, the user name you entered already exists. Please enter a different one.": "Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie einen anderslautenden Namen ein.", + "Sorry, the username you entered already exists. Please enter a different one.": "Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto registriert. Bitte geben Sie einen anderslautenden Namen ein.", "Sorry, the username you entered is too long. Please choose a shorter one.": "Leider ist der von Ihnen eingegebene Name zu lang. Bitte geben Sie einen kürzeren ein.", "Sorry, there is no disk space left. Please try to delete some files or images first.": "Es ist leider kein Speicherplatz mehr frei. Bitte löschen Sie zuerst einige Dateien oder Bilder.", "Sorry, this layout is not compatible with Antville.": "Leider funktioniert das Layout nicht mit dieser Antville-Installation.", - "Sorry, your input did not match any registered user.": "Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben.", + "Sorry, your input did not match any registered account.": "Leider ist unter diesem Namen kein Konto registriert.", "Source: {0}": "Quelle: {0}", "Start": "Start", "Start Page": "Startseite", @@ -329,6 +339,8 @@ global.messages['de-x-male'] = { "Stories by {0}": "Beiträge von {0}", "Story": "Beitrag", "Story Archive {0} ({1})": "Beitrags-Archiv {0} ({1})", + "Story about Data Privacy Statement": "Beitrag über die Datenschutzerklärung", + "Story about Terms and Conditions": "Beitrag über die Nutzungsbedingungen", "Stylesheet": "Stilvorlagen", "Subscribe // verb": "Abonnieren", "Subscribed": "Abonniert", @@ -345,10 +357,14 @@ global.messages['de-x-male'] = { "Tag": "Stichwort", "Tag: {0}": "Stichwort: {0}", "Tags": "Stichworte", + "Terms and Conditions": "Nutzungsbedingungen", "Text": "Text", "Thanks, your vote was registered. You can change your mind until the poll is closed.": "Danke, Ihre Stimme wurde gezählt. Bis die Umfrage beendet ist, können Sie Ihre Meinung jederzeit ändern.", "The Management": "Die Direktion", "The URL endpoint for each of these APIs is located at": "Die Internet-Adresse für jede dieser Schnittstellen lautet", + "The account data will be available for download from here within the next days.": "Die Kontodaten stehen demnächst hier zum Download bereit.", + "The account is queued for export.": "Der Export der Kontodaten wird vorbereitet.", + "The account {0} is being deleted.": "Das Konto {0} wird gelöscht.", "The callback URL will be invoked as an HTTP POST request with the following parameters:": "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-Methode aufgerufen:", "The changes were saved successfully.": "Die Änderungen wurden erfolgreich gespeichert.", "The chosen name is too long. Please enter a shorter one.": "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein.", @@ -364,11 +380,13 @@ global.messages['de-x-male'] = { "The path you requested was not found.": "Der angeforderte Pfad wurde nicht gefunden.", "The poll was created successfully.": "Die Umfrage wurde erfolgreich erstellt.", "The poll was updated successfully.": "Die Umfrage wurde erfolgreich aktualisiert.", + "The site data will be available for download from here, soon.": "Der Site-Export steht demnächst hier zum Download bereit.", + "The site is queued for export.": "Der Export der Site-Daten wird vorbereitet.", "The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.": "Der Import der Datei {0} ist vorgesehen. Die eingelesenen Daten sind innerhalb von 24 Stunden verfügbar.", "The site you requested has been blocked.": "Die von Ihnen angeforderte Website ist gesperrt.", "The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "Die Website {0} unter {1} wird in {2} gesperrt werden, weil sie schon für zu lange Zeit eingeschränkt ist.", "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "Die Website {0} unter {1} wird in {2} gelöscht werden, weil sie verlassen zu sein scheint.", - "The site {0} is queued for removal.": "Die Website {0} ist zur Löschung vorgesehen.", + "The site {0} is being deleted.": "Die Website {0} wird gelöscht.", "The story is {0} and {1}": "Der Beitrag ist {0} und {1}", "The story was successfully created.": "Der Beitrag wurde erfolgreich erstellt.", "The story was successfully updated.": "Der Beitrag wurde erfolgreich aktualisiert.", @@ -377,6 +395,7 @@ global.messages['de-x-male'] = { "The user {0} has modified your membership of the site {1} at {2}.": "Ihre Mitgliedschaft bei der Website {1} unter {2} wurde von {0} geändert.", "The {0} macro is missing. It is essential for accessing the site and must be present in this skin.": "Das {0}-Makro fehlt. Es ist erforderlich, um die Website korrekt darzustellen und muss unbedingt in diesem Skin enthalten sein.", "There already is a site with this name.": "Es gibt bereits eine Website mit diesem Namen.", + "There is already another job queued for this account: {0}": "Für dieses Konto wird bereits ein anderer Auftrag berarbeitet: {0}", "There is already another job queued for this site: {0}": "Ein anderer Prozess ist für diese Website bereits gereiht: {0}", "There was nothing to upload. Please be sure to choose a file.": "Es gab nichts hochzuladen. Bitte wählen Sie eine Datei zum Hochladen aus.", "This URL is not valid for resetting your password.": "Mit dieser Internet-Adresse können Sie Ihr Kennwort leider nicht zurückzusetzen.", @@ -391,7 +410,6 @@ global.messages['de-x-male'] = { "This message was sent to you by the user {0} of the site {1} [1].": "Diese Nachricht wurde Ihnen von {0} über die Website {1} gesendet [1].", "This poll was closed {0} by {1}": "Diese Umfrage wurde {0} von {1} beendet", "This site is currently {0}.": "Die Website ist derzeit {0}.", - "This site is going to be deleted completely and irreversibly after {0}.": "Diese Website wird nach {0} vollständig und unwiderruflich gelöscht.", "This skin contains additional JavaScript code that will be included in every page.": "Dieser Skin enthält zusätzlichen JavaScript-Code, der in jeder Seite eingebettet wird.", "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "Dieser Skin enthält Stilvorlagen, z.B. für Schriftarten und -größen oder Farben. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.", "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "Dieser Skin bestimmt die grundlegende Struktur Ihrer Website. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.", @@ -402,6 +420,7 @@ global.messages['de-x-male'] = { "Thus, it is publicly accessible for every visitor.": "Daher ist sie für jeden Besucher öffentlich zugänglich.", "Thus, you will be notified whenever the site has undergone changes as specified in the site preferences.": "Daher werden Sie benachrichtigt, wenn die Website – wie in deren Einstellungen angegeben – geändert wird.", "Time Zone": "Zeitzone", + "Timeline": "Zeitleiste", "Title": "Titel", "Title or name of the site": "Titel oder Name der Website", "To confirm the request please click the link below.": "Bitte klicken Sie den folgenden Link, um die Anfrage zu bestätigen.", @@ -417,15 +436,18 @@ global.messages['de-x-male'] = { "URL string of the site": "Internet-Adresse der Website", "Unfortunately, your login failed. Maybe a typo?": "Leider ist Ihre Anmeldung fehlgeschlagen. Haben Sie sich vielleicht vertippt?", "Update": "Aktualisieren", + "Updated Terms & Conditions": "Geänderte Nutzungsbedingungen", "Updates": "Letzte Änderungen", "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Laden Sie ein mit Antville 1.1 erstelltes Layout-Archiv (ZIP-Datei) hoch, um es in ein mit Antville 1.2 kompatibles Archiv umzuwandeln.", "Uptime": "Betriebszeit", - "User name and e-mail address do not match.": "Es existiert kein Konto für die angegebene Kombination aus Name und E-Mail-Adresse.", + "User": "Konto", + "Username and e-mail address do not match.": "Für die angegebene Kombination aus Name und E-Mail-Adresse ist kein Konto registriert.", "Version": "Version", "Via": "Via", "Vote": "Abstimmen", "Warning!": "Warnung!", "We are sorry to inform you that the user {0} has cancelled your membership of the site {1} at {2}.": "Wir bedauern Ihnen mitzuteilen, dass Ihre Mitgliedschaft bei der Website {1} unter {2} von {0} beendet wurde.", + "We have updated our terms and conditions. Please reaffirm you understand and accept the following:": "Wir haben unsere Nutzungsbedingungen geändert. Bitte bestätigen Sie im folgenden, dass Sie diese verstehen und akzeptieren:", "Welcome": "Willkommen", "Welcome to {0}, {1}!": "Willkommen bei {0}, {1}!", "Welcome to {0}, {1}. Have fun!": "Willkommen bei {0}, {1}. Viel Spaß!", @@ -435,15 +457,16 @@ global.messages['de-x-male'] = { "Yes, really erase {0} comment": "Ja, {0} Kommentar soll wirklich gelöscht werden", "Yes, really erase {0} comments": "Ja, {0} Kommentare sollen wirklich gelöscht werden", "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "Sie (oder jemand, der sich für Sie ausgibt) hat beantragt, Ihr Kennwort für die Website {0} unter {1} zurückzusetzen.", - "You are about to delete a comment by user {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.", + "You are about to delete a comment by {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.", "You are about to delete a comment thread consisting of {0} postings.": "Sie sind im Begriff, einen Diskussionsstrang von {0} Kommentaren zu löschen.", "You are about to delete a poll by user {0}.": "Sie sind im Begriff, eine Umfrage von {0} zu löschen.", - "You are about to delete a story by user {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.", + "You are about to delete a story by {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.", "You are about to delete the account {0}.": "Sie sind im Begriff, das Konto {0} zu löschen.", "You are about to delete the file {0}.": "Sie sind im Begriff, die Datei {0} zu löschen.", "You are about to delete the image {0}.": "Sie sind im Begriff, das Bild {0} zu löschen.", - "You are about to delete the membership of user {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.", + "You are about to delete the membership of {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.", "You are about to delete the site {0}.": "Sie sind im Begriff, die Website {0} zu löschen.", + "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "Sie sind im Begriff, das komplette Konto zu löschen, das zur Zeit {0}, {1}, {2}, {3}, {4} und {5} umfasst.", "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "Sie sind im Begriff, die komplette Website zu löschen, die zur Zeit {0}, {1}, {2}, {3} und {4} umfasst.", "You are about to reset the layout of site {0}.": "Sie sind im Begriff, das Layout der Website {0} zurückzusetzen.", "You are about to reset the skin {0}.{1}.": "Sie sind im Begriff, den Skin {0}.{1} zurückzusetzen.", @@ -457,7 +480,8 @@ global.messages['de-x-male'] = { "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Name oder E-Mail-Adresse bearbeiten. Benutzen Sie den Asterisk * als Platzhalter.", "You can filter the results by site name. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Website-Namen filtern. Verwenden sie den Asterisk * als Platzhalter.", "You can use the asterisk * as wildcard.": "Sie können den Asterisk * als Platzhalter verwenden.", - "You cannot revoke permissions from the only privileged user.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.", + "You cannot delete a privileged account.": "Ein privilegiertes Konto kann nicht gelöscht werden.", + "You cannot revoke permissions from the only privileged account.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.", "You denied the request.": "Sie haben die Anfrage abgelehnt.", "You did not vote, yet. You can vote until the poll is closed.": "Sie haben noch nicht abgestimmt. Sie können abstimmen, bis die Umfrage beendet ist.", "You need to wait {0} before you are allowed to create a new site.": "Sie müssen {0} warten, bevor Sie eine neue Website erstellen können.", @@ -465,8 +489,8 @@ global.messages['de-x-male'] = { "Your account has been blocked.": "Ihr Konto wurde gesperrt.", "Your message was sent successfully.": "Ihre Nachricht wurde erfolgreich gesendet.", "Your password was changed.": "Ihr Kennwort wurde geändert.", - "[{0}] Message from anonymous user": "[{0}] Nachricht von unbekanntem Absender", - "[{0}] Message from user {1}": "[{0}] Nachricht von {1}", + "[{0}] Message from anonymous": "[{0}] Nachricht von unbekanntem Absender", + "[{0}] Message from {1}": "[{0}] Nachricht von {1}", "[{0}] Notification of membership cancellation": "[{0}] Benachrichtigung über Beendigung der Mitgliedschaft", "[{0}] Notification of membership change": "[{0}] Benachrichtigung über Änderung der Mitgliedschaft", "[{0}] Notification of site changes": "[{0}] Benachrichtigung über Änderung der Website", @@ -503,6 +527,7 @@ global.messages['de-x-male'] = { "descending": "absteigend", "disabled": "deaktiviert", "e-mail": "E-Mail", + "e.g. {0}": "z.B. {0}", "enabled": "aktiviert", "export": "Exportieren", "featured": "sichtbar", @@ -514,6 +539,18 @@ global.messages['de-x-male'] = { "images": "Bilder", "import": "Importieren", "in": "in", + "in {0} day": "in {0} Tag", + "in {0} days": "in {0} Tagen", + "in {0} hour": "in {0} Stunde", + "in {0} hours": "in {0} Stunden", + "in {0} minute": "in {0} Minute", + "in {0} minutes": "in {0} Minuten", + "in {0} month": "in {0} Monat", + "in {0} months": "in {0} Monaten", + "in {0} week": "in {0} Woche", + "in {0} weeks": "in {0} Wochen", + "in {0} year": "in {0} Jahr", + "in {0} years": "in {0} Jahren", "last login": "letzte Anmeldung", "layout": "Layout", "link": "Verknüpfung", @@ -531,23 +568,24 @@ global.messages['de-x-male'] = { "privileged": "privilegiert", "public": "öffentlich", "readonly": "schreibgeschützt", - "remove": "Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis.", + "remove": "löschen", "restricted": "eingeschränkt", "right now": "vor kurzem", "shared": "geteilt", "site": "Website", "skin": "Skin", "skins": "Skins", + "soon": "in Kürze", "stories": "Beiträge", "story": "Beitrag", "tag": "Stichwort", "tags": "Stichworte", + "tomorrow": "morgen", "trusted": "vertrauenswürdig", "updated // has updated": "aktualisierte", "used": "benutzt", "vote": "Stimme", "yesterday": "gestern", - "{0} 401 Error": "{0} Fehler 401", "{0} Comment": "{0} Kommentar", "{0} Comments": "{0} Kommentare", "{0} File": "{0} Datei", @@ -596,6 +634,8 @@ global.messages['de-x-male'] = { "{0} polls": "{0} Umfragen", "{0} request": "{0} Aufruf", "{0} requests": "{0} Aufrufe", + "{0} site": "{0} Website", + "{0} sites": "{0} Websites", "{0} sites sorted by {1} in {2} order.": "Typ: {0} Sortierung: {1} {2}", "{0} story": "{0} Beitrag", "{0} stories": "{0} Beiträge", @@ -612,4 +652,5 @@ global.messages['de-x-male'] = { "{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”": "{0} {2} {1} {3} in {4}", "{0}% in the last 5 min.": "{0}% in den letzten 5 Min.", "{0}% total": "{0}% gesamt", + "{0}Download the archive{1} or click “Export” to create a new one.": "{0}Laden Sie das Archiv herunter{1} oder klicken Sie »Exportieren«, um ein neues zu erstellen.", }; diff --git a/i18n/messages.de.js b/i18n/messages.de.js index c19b05de..ec2c12eb 100644 --- a/i18n/messages.de.js +++ b/i18n/messages.de.js @@ -11,13 +11,14 @@ if (!global.messages) { global.messages['de'] = { "({0} character)": "({0} Zeichen)", "({0} characters)": "({0} Zeichen)", - "A Blogger export file (.xml) will be created and available for download from here within 24 hours.": "Eine Blogger-Export-Datei (.xml) wird erstellt und steht hier spätestens nach 24 Stunden zum Download bereit.", "A confirmation mail was sent to your e-mail address.": "Eine Bestätigungs-Nachricht wurde an Ihre E-Mail-Adresse geschickt.", "A generic disclaimer will be automatically appended to your message.": "Ein allgemeiner Hinweis wird der Nachricht automatisch hinzugefügt.", "API": "API", "Abandoned": "Verwaist", + "Accept": "Akzeptieren", "Account": "Konto", "Account Image": "Kontobild", + "Account is being deleted": "Konto wird gelöscht", "Accounts": "Konten", "Activity": "Aktivität", "Add Choice": "Antwortmöglichkeit hinzufügen", @@ -51,7 +52,6 @@ global.messages['de'] = { "Blocked": "Gesperrt", "Bookmarklet": "Bookmarklet", "Both": "Beides", - "Browse": "Blättern", "Build": "Gestalt", "Cache": "Zwischenspeicher", "Callback URL": "Rückruf-Adresse", @@ -73,9 +73,6 @@ global.messages['de'] = { "Confirm Deletion": "Löschen bestätigen", "Confirm Reset": "Zurücksetzen bestätigen", "Confirm Unsubscribe": "Stornierung bestätigen", - "Connect with {0}": "Mit {0} verbinden", - "Connecting with {0} failed. {1} Please try again.": "Die Verbindung mit {0} ist fehlgeschlagen. {1} Bitte versuchen Sie es erneut.", - "Connections": "Verbindungen", "Contact": "Kontakt", "Contact {0}": "{0} kontaktieren", "Content": "Inhalt", @@ -84,7 +81,6 @@ global.messages['de'] = { "Contributors": "Autorinnen", "Convert": "Umwandeln", "Convert Layout": "Layout umwandeln", - "Could not connect with Facebook. ({0})": "Die Verbindung mit Facebook ist fehlgeschlagen. ({0})", "Could not fetch the file from the given URL.": "Die Datei konnte nicht von der angegebenen Adresse gelesen werden.", "Could not remove the image file from disk.": "Die Bild-Datei konnte nicht von der Festplatte entfernt werden.", "Could not resize the image.": "Die Bildgröße konnte nicht angepasst werden.", @@ -97,25 +93,26 @@ global.messages['de'] = { "Created": "Erstellt", "Created by {0} on {1}": "Erstellt von {0} am {1}", "Created by {0} on {1}.": "Erstellt von {0} am {1}.", + "Created on {0}": "Erstellt am {0}", "Created {0}": "Erstellt {0}", - "Currently, it is not possible to remove an account. Please accept our humble apologies.": "Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis.", + "Data Privacy Statement": "Datenschutzerklärung", + "Date": "Datum", "Date string in Unix timestamp format": "Datum im Unix-Format", "Delete": "Löschen", "Deleted": "Gelöscht", + "Deleted on {0}": "Gelöscht am {0}", "Description": "Beschreibung", "Details": "Einzelheiten", "Development": "Entwicklung", "Dimensions": "Abmessungen", "Disable filter": "Filter aufheben", "Disabled": "Deaktiviert", - "Disconnect from {0}": "Verbindung mit {0} trennen", "Disk Quota": "Speicherplatzanteil", "Disk Space": "Speicherplatz", "Display": "Anzeige", "Do Androids dream of electric sheep?": "Zählen Androiden elektrische Schäfchen?", - "Download the file {0} or klick “Start” to create a new one.": "Laden Sie die Datei {0} herunter oder klicken Sie »Start«, um eine neue zu erstellen.", "Drag to Bookmarks Bar": "In die Lesezeichenleiste ziehen", - "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.", + "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.", "E-mail": "E-Mail", "E.g. if you enter {0} here your site will be reachable via {1}": "Wenn Sie z.B. {0} als Name eingeben, wird die Website unter dieser Adresse erreichbar sein: {1}", "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL – on a server and in a programming language of their choice.": "Jede Antville-Site bietet in den Einstellungen die Möglichkeit, eine Rückruf-Adresse zu definieren, die bei jeder Änderung des Inhalts aufgerufen wird. Auf diese Weise können Benutzerinnen mittels eigenem Programmcode verschiedene Ereignisse individuell behandeln – auf einem Server und in einer Programmiersprache ihrer Wahl.", @@ -134,6 +131,7 @@ global.messages['de'] = { "Error Ratio": "Fehler-Rate", "Errors": "Fehler", "Export": "Exportieren", + "Export Account Data": "Kontodaten exportieren", "Export Site Data": "Site-Daten exportieren", "File": "Datei", "File size is exceeding the upload limit.": "Die Dateigröße überschreitet die Upload-Grenze.", @@ -151,10 +149,13 @@ global.messages['de'] = { "Have fun!": "Viele Späße!", "Health": "Statusmonitor", "Hello {0}.": "Hallo {0}.", + "Helma Version": "Helma-Version", "Hide": "Verstecken", + "I understand and accept the {0}data privacy statement{1}": "Ich verstehe und akzeptiere die {0}Datenschutzerklärung{1}", + "I understand and accept the {0}terms and conditions{1}": "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}", "If the user did not include contact information in the message itself, you can send your reply via the user’s contact form [2].": "Falls die Absenderin der Nachricht keine Kontaktinformationen hinzugefügt hat, können Sie Ihre Antwort über das Kontaktformular senden [2].", "If you do not specify a name Antville will create one based on the filename.": "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des Dateinamens erstellen.", - "If you enter a URL here your user name will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.", + "If you enter a URL here your username will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.", "If you should really have forgotten your password, you can use the password reset option.": "Falls Sie Ihr Kennwort vergessen haben sollten, können Sie es zurücksetzen lassen.", "If you think you have received this e-mail in error please contact the maintainer of the site.": "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte Verbindung mit der Eigentümerin der Website auf.", "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "Sollten Sie die Bildgröße verkleinern wollen, geben Sie bitte die gewünschte Maximalbreite und/oder -höhe in Pixel an. Falls Sie beides angeben, wird versucht beide Angaben zu erfüllen, das Seitenverhältnis wird aber beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, erstellt Antville außerdem automatisch ein Miniaturbild davon.", @@ -174,6 +175,7 @@ global.messages['de'] = { "Last Login": "Letzte Anmeldung", "Last Update": "Letzte Änderung", "Last modified by {0} on {1}": "Zuletzt geändert von {0} am {1}", + "Last modified on {0}": "Zuletzt geändert am {0}", "Last modified {0}": "Zuletzt geändert {0}", "Layout": "Layout", "Layout Images": "Layout-Bilder", @@ -181,7 +183,6 @@ global.messages['de'] = { "Logged in as {0}": "Angemeldet als {0}", "Login": "Anmeldung", "Login // verb": "Anmelden", - "Login with {0}": "Anmeldung mit {0}", "Logout // verb": "Abmelden", "Manager": "Redakteurin", "Managers": "Redakteurinnen", @@ -225,9 +226,11 @@ global.messages['de'] = { "Password forgotten?": "Kennwort vergessen?", "Personal URL": "Internet-Adresse", "Pixels": "Pixel", + "Please accept the data privacy statement.": "Bitte akzeptieren Sie die Datenschutzerklärung.", + "Please accept the terms and conditions.": "Bitte akzeptieren Sie die Nutzungsbedingungen.", "Please avoid special characters or HTML code in the name field.": "Bitte vermeiden Sie Sonderzeichen oder HTML-Code im Feld für den Namen.", "Please be aware of the fact that there is no “undo”, so if you click “Proceed” below the changes will be applied irreversibly.": "Bitte seien Sie sich bewusst, dass diese Aktion nicht rückgängig gemacht werden kann. Wenn Sie also auf »Fortfahren« klicken, werden die Änderungen unwiderruflich durchgeführt.", - "Please choose a prototype and enter a skin name": "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin.", + "Please choose a prototype and enter a skin name": "Bitte wählen Sie einen Prototypen und einen Namen für diesen Skin", "Please choose a role for this member.": "Bitte wählen Sie eine Rolle für dieses Mitglied.", "Please contact an administrator for further information.": "Bitte wenden Sie sich an eine Administratorin für weitere Informationen.", "Please enable JavaScript in your browser for improved functionality.": "Bitte aktivieren Sie für optimale Funktionalität JavaScript in Ihrem Browser.", @@ -235,9 +238,9 @@ global.messages['de'] = { "Please enter a new name for this tag": "Bitte geben Sie einen neuen Namen für dieses Stichwort an", "Please enter a new password.": "Bitte geben Sie ein neues Kennwort ein.", "Please enter a query in the search form.": "Bitte geben Sie eine Suchanfrage in das Suchformular ein.", - "Please enter a user name and e-mail address.": "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein.", + "Please enter a username and e-mail address.": "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein.", "Please enter a username.": "Bitte geben Sie einen Namen ein.", - "Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein.", + "Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein", "Please enter a valid e-mail address": "Bitte geben Sie eine gültige E-Mail-Adresse an", "Please enter at least something into the “title” or “text” field.": "Bitte geben Sie zumindest etwas in eines der beiden Felder »Titel« oder »Text« ein.", "Please enter something into the comment field.": "Bitte geben Sie etwas in das Kommentarfeld ein.", @@ -275,6 +278,7 @@ global.messages['de'] = { "Register": "Registrieren", "Registered": "Registriert", "Registration": "Registrierung", + "Registration & Login": "Registrierung & Anmeldung", "Regular": "Normal", "Remember Login": "Anmeldung speichern", "Request Password Reset": "Anfrage zum Zurücksetzen des Kennworts", @@ -291,6 +295,8 @@ global.messages['de'] = { "Save": "Speichern", "Save and Run": "Speichern und starten", "Search": "Suche", + "Search with {0}": "Mit {0} suchen", + "Select": "Auswählen", "Send": "Senden", "Send Request": "Anfrage senden", "Separated by commas": "Durch Komma getrennt", @@ -306,7 +312,6 @@ global.messages['de'] = { "Site Creation": "Erstellen von Websites", "Site Page": "Basis-Seite", "Site Phase-Out": "Automatisches Löschen von Websites", - "Site is scheduled for export.": "Die Website ist für den Export eingeplant.", "Site is scheduled for import.": "Die Website ist für den Import eingeplant.", "Sites": "Sites", "Size": "Größe", @@ -314,12 +319,13 @@ global.messages['de'] = { "Skins": "Skins", "Something went wrong.": "Irgendwas ist schiefgelaufen.", "Sorry!": "Hoppla!", + "Sorry, logging in is currently not possible.": "Die Anmeldung ist derzeit leider nicht möglich.", "Sorry, the file exceeds the maximum upload limit of {0} kB.": "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB.", - "Sorry, the user name you entered already exists. Please enter a different one.": "Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie einen anderslautenden Namen ein.", + "Sorry, the username you entered already exists. Please enter a different one.": "Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto registriert. Bitte geben Sie einen anderslautenden Namen ein.", "Sorry, the username you entered is too long. Please choose a shorter one.": "Leider ist der von Ihnen eingegebene Name zu lang. Bitte geben Sie einen kürzeren ein.", "Sorry, there is no disk space left. Please try to delete some files or images first.": "Es ist leider kein Speicherplatz mehr frei. Bitte löschen Sie zuerst einige Dateien oder Bilder.", "Sorry, this layout is not compatible with Antville.": "Leider funktioniert das Layout nicht mit dieser Antville-Installation.", - "Sorry, your input did not match any registered user.": "Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben.", + "Sorry, your input did not match any registered account.": "Leider ist unter diesem Namen kein Konto registriert.", "Source: {0}": "Quelle: {0}", "Start": "Start", "Start Page": "Startseite", @@ -329,6 +335,8 @@ global.messages['de'] = { "Stories by {0}": "Beiträge von {0}", "Story": "Beitrag", "Story Archive {0} ({1})": "Beitrags-Archiv {0} ({1})", + "Story about Data Privacy Statement": "Beitrag über die Datenschutzerklärung", + "Story about Terms and Conditions": "Beitrag über die Nutzungsbedingungen", "Stylesheet": "Stilvorlagen", "Subscribe // verb": "Abonnieren", "Subscribed": "Abonniert", @@ -345,10 +353,14 @@ global.messages['de'] = { "Tag": "Stichwort", "Tag: {0}": "Stichwort: {0}", "Tags": "Stichworte", + "Terms and Conditions": "Nutzungsbedingungen", "Text": "Text", "Thanks, your vote was registered. You can change your mind until the poll is closed.": "Danke, Ihre Stimme wurde gezählt. Bis die Umfrage beendet ist, können Sie Ihre Meinung jederzeit ändern.", "The Management": "Die Direktion", "The URL endpoint for each of these APIs is located at": "Die Internet-Adresse für jede dieser Schnittstellen lautet", + "The account data will be available for download from here within the next days.": "Die Kontodaten stehen demnächst hier zum Download bereit.", + "The account is queued for export.": "Der Export der Kontodaten wird vorbereitet.", + "The account {0} was deleted.": "Das Konto {0} wurde gelöscht.", "The callback URL will be invoked as an HTTP POST request with the following parameters:": "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-Methode aufgerufen:", "The changes were saved successfully.": "Die Änderungen wurden erfolgreich gespeichert.", "The chosen name is too long. Please enter a shorter one.": "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein.", @@ -364,11 +376,13 @@ global.messages['de'] = { "The path you requested was not found.": "Der angeforderte Pfad wurde nicht gefunden.", "The poll was created successfully.": "Die Umfrage wurde erfolgreich erstellt.", "The poll was updated successfully.": "Die Umfrage wurde erfolgreich aktualisiert.", + "The site data will be available for download from here, soon.": "Der Site-Export steht demnächst hier zum Download bereit.", + "The site is queued for export.": "Der Export der Site-Daten wird vorbereitet.", "The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.": "Der Import der Datei {0} ist vorgesehen. Die eingelesenen Daten sind innerhalb von 24 Stunden verfügbar.", "The site you requested has been blocked.": "Die von Ihnen angeforderte Website ist gesperrt.", "The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "Die Website {0} unter {1} wird in {2} gesperrt werden, weil sie schon für zu lange Zeit eingeschränkt ist.", "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "Die Website {0} unter {1} wird in {2} gelöscht werden, weil sie verlassen zu sein scheint.", - "The site {0} is queued for removal.": "Die Website {0} ist zur Löschung vorgesehen.", + "The site {0} is being deleted.": "Die Website {0} wird gelöscht.", "The story is {0} and {1}": "Der Beitrag ist {0} und {1}", "The story was successfully created.": "Der Beitrag wurde erfolgreich erstellt.", "The story was successfully updated.": "Der Beitrag wurde erfolgreich aktualisiert.", @@ -377,6 +391,7 @@ global.messages['de'] = { "The user {0} has modified your membership of the site {1} at {2}.": "Ihre Mitgliedschaft bei der Website {1} unter {2} wurde von {0} geändert.", "The {0} macro is missing. It is essential for accessing the site and must be present in this skin.": "Das {0}-Makro fehlt. Es ist erforderlich, um die Website korrekt darzustellen und muss unbedingt in diesem Skin enthalten sein.", "There already is a site with this name.": "Es gibt bereits eine Website mit diesem Namen.", + "There is already another job queued for this account: {0}": "Für dieses Konto wird bereits ein anderer Auftrag berarbeitet: {0}", "There is already another job queued for this site: {0}": "Ein anderer Prozess ist für diese Website bereits gereiht: {0}", "There was nothing to upload. Please be sure to choose a file.": "Es gab nichts hochzuladen. Bitte wählen Sie eine Datei zum Hochladen aus.", "This URL is not valid for resetting your password.": "Mit dieser Internet-Adresse können Sie Ihr Kennwort leider nicht zurückzusetzen.", @@ -391,7 +406,6 @@ global.messages['de'] = { "This message was sent to you by the user {0} of the site {1} [1].": "Diese Nachricht wurde Ihnen von {0} über die Website {1} gesendet [1].", "This poll was closed {0} by {1}": "Diese Umfrage wurde {0} von {1} beendet", "This site is currently {0}.": "Die Website ist derzeit {0}.", - "This site is going to be deleted completely and irreversibly after {0}.": "Diese Website wird nach {0} vollständig und unwiderruflich gelöscht.", "This skin contains additional JavaScript code that will be included in every page.": "Dieser Skin enthält zusätzlichen JavaScript-Code, der in jeder Seite eingebettet wird.", "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "Dieser Skin enthält Stilvorlagen, z.B. für Schriftarten und -größen oder Farben. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.", "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "Dieser Skin bestimmt die grundlegende Struktur Ihrer Website. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.", @@ -402,6 +416,7 @@ global.messages['de'] = { "Thus, it is publicly accessible for every visitor.": "Daher ist sie für jede Besucherin öffentlich zugänglich.", "Thus, you will be notified whenever the site has undergone changes as specified in the site preferences.": "Daher werden Sie benachrichtigt, wenn die Website – wie in deren Einstellungen angegeben – geändert wird.", "Time Zone": "Zeitzone", + "Timeline": "Zeitleiste", "Title": "Titel", "Title or name of the site": "Titel oder Name der Website", "To confirm the request please click the link below.": "Bitte klicken Sie den folgenden Link, um die Anfrage zu bestätigen.", @@ -417,15 +432,18 @@ global.messages['de'] = { "URL string of the site": "Internet-Adresse der Website", "Unfortunately, your login failed. Maybe a typo?": "Leider ist Ihre Anmeldung fehlgeschlagen. Haben Sie sich vielleicht vertippt?", "Update": "Aktualisieren", + "Updated Terms & Conditions": "Geänderte Nutzungsbedingungen", "Updates": "Letzte Änderungen", "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Laden Sie ein mit Antville 1.1 erstelltes Layout-Archiv (ZIP-Datei) hoch, um es in ein mit Antville 1.2 kompatibles Archiv umzuwandeln.", "Uptime": "Betriebszeit", - "User name and e-mail address do not match.": "Es existiert kein Konto für die angegebene Kombination aus Name und E-Mail-Adresse.", + "User": "Konto", + "Username and e-mail address do not match.": "Für die angegebene Kombination aus Name und E-Mail-Adresse ist kein Konto registriert.", "Version": "Version", "Via": "Via", "Vote": "Abstimmen", "Warning!": "Warnung!", "We are sorry to inform you that the user {0} has cancelled your membership of the site {1} at {2}.": "Wir bedauern Ihnen mitzuteilen, dass Ihre Mitgliedschaft bei der Website {1} unter {2} von {0} beendet wurde.", + "We have updated our terms and conditions. Please reaffirm you understand and accept the following:": "Wir haben unsere Nutzungsbedingungen geändert. Bitte bestätigen Sie im folgenden, dass Sie diese verstehen und akzeptieren:", "Welcome": "Willkommen", "Welcome to {0}, {1}!": "Willkommen bei {0}, {1}!", "Welcome to {0}, {1}. Have fun!": "Willkommen bei {0}, {1}. Viel Spaß!", @@ -435,15 +453,16 @@ global.messages['de'] = { "Yes, really erase {0} comment": "Ja, {0} Kommentar soll wirklich gelöscht werden", "Yes, really erase {0} comments": "Ja, {0} Kommentare sollen wirklich gelöscht werden", "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "Sie (oder jemand, der sich für Sie ausgibt) hat beantragt, Ihr Kennwort für die Website {0} unter {1} zurückzusetzen.", - "You are about to delete a comment by user {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.", + "You are about to delete a comment by {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.", "You are about to delete a comment thread consisting of {0} postings.": "Sie sind im Begriff, einen Diskussionsstrang von {0} Kommentaren zu löschen.", "You are about to delete a poll by user {0}.": "Sie sind im Begriff, eine Umfrage von {0} zu löschen.", - "You are about to delete a story by user {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.", + "You are about to delete a story by {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.", "You are about to delete the account {0}.": "Sie sind im Begriff, das Konto {0} zu löschen.", "You are about to delete the file {0}.": "Sie sind im Begriff, die Datei {0} zu löschen.", "You are about to delete the image {0}.": "Sie sind im Begriff, das Bild {0} zu löschen.", - "You are about to delete the membership of user {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.", + "You are about to delete the membership of {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.", "You are about to delete the site {0}.": "Sie sind im Begriff, die Website {0} zu löschen.", + "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "Sie sind im Begriff, das komplette Konto zu löschen, das zur Zeit {0}, {1}, {2}, {3}, {4} und {5} umfasst.", "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "Sie sind im Begriff, die komplette Website zu löschen, die zur Zeit {0}, {1}, {2}, {3} und {4} umfasst.", "You are about to reset the layout of site {0}.": "Sie sind im Begriff, das Layout der Website {0} zurückzusetzen.", "You are about to reset the skin {0}.{1}.": "Sie sind im Begriff, den Skin {0}.{1} zurückzusetzen.", @@ -457,16 +476,16 @@ global.messages['de'] = { "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Name oder E-Mail-Adresse bearbeiten. Benutzen Sie den Asterisk * als Platzhalter.", "You can filter the results by site name. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Website-Namen filtern. Verwenden sie den Asterisk * als Platzhalter.", "You can use the asterisk * as wildcard.": "Sie können den Asterisk * als Platzhalter verwenden.", - "You cannot revoke permissions from the only privileged user.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.", - "You denied the request.": "Sie haben die Anfrage abgelehnt.", + "You cannot delete a privileged account.": "Ein privilegiertes Konto kann nicht gelöscht werden.", + "You cannot revoke permissions from the only privileged account.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.", "You did not vote, yet. You can vote until the poll is closed.": "Sie haben noch nicht abgestimmt. Sie können abstimmen, bis die Umfrage beendet ist.", "You need to wait {0} before you are allowed to create a new site.": "Sie müssen {0} warten, bevor Sie eine neue Website erstellen können.", "You will then be asked to change your password.": "Sie werden dann gebeten, Ihr Kennwort zu ändern.", "Your account has been blocked.": "Ihr Konto wurde gesperrt.", "Your message was sent successfully.": "Ihre Nachricht wurde erfolgreich gesendet.", "Your password was changed.": "Ihr Kennwort wurde geändert.", - "[{0}] Message from anonymous user": "[{0}] Nachricht von unbekannter Absenderin", - "[{0}] Message from user {1}": "[{0}] Nachricht von {1}", + "[{0}] Message from anonymous": "[{0}] Nachricht von unbekannter Absenderin", + "[{0}] Message from {1}": "[{0}] Nachricht von {1}", "[{0}] Notification of membership cancellation": "[{0}] Benachrichtigung über Beendigung der Mitgliedschaft", "[{0}] Notification of membership change": "[{0}] Benachrichtigung über Änderung der Mitgliedschaft", "[{0}] Notification of site changes": "[{0}] Benachrichtigung über Änderung der Website", @@ -503,6 +522,7 @@ global.messages['de'] = { "descending": "absteigend", "disabled": "deaktiviert", "e-mail": "E-Mail", + "e.g. {0}": "z.B. {0}", "enabled": "aktiviert", "export": "Exportieren", "featured": "sichtbar", @@ -514,6 +534,18 @@ global.messages['de'] = { "images": "Bilder", "import": "Importieren", "in": "in", + "in {0} day": "in {0} Tag", + "in {0} days": "in {0} Tagen", + "in {0} hour": "in {0} Stunde", + "in {0} hours": "in {0} Stunden", + "in {0} minute": "in {0} Minute", + "in {0} minutes": "in {0} Minuten", + "in {0} month": "in {0} Monat", + "in {0} months": "in {0} Monaten", + "in {0} week": "in {0} Woche", + "in {0} weeks": "in {0} Wochen", + "in {0} year": "in {0} Jahr", + "in {0} years": "in {0} Jahren", "last login": "letzte Anmeldung", "layout": "Layout", "link": "Verknüpfung", @@ -531,23 +563,24 @@ global.messages['de'] = { "privileged": "privilegiert", "public": "öffentlich", "readonly": "schreibgeschützt", - "remove": "Derzeit ist das Löschen von Konten nicht möglich. Wir bitten um Verständnis.", + "remove": "löschen", "restricted": "eingeschränkt", "right now": "vor kurzem", "shared": "geteilt", "site": "Website", "skin": "Skin", "skins": "Skins", + "soon": "in Kürze", "stories": "Beiträge", "story": "Beitrag", "tag": "Stichwort", "tags": "Stichworte", + "tomorrow": "morgen", "trusted": "vertrauenswürdig", "updated // has updated": "aktualisierte", "used": "benutzt", "vote": "Stimme", "yesterday": "gestern", - "{0} 401 Error": "{0} Fehler 401", "{0} Comment": "{0} Kommentar", "{0} Comments": "{0} Kommentare", "{0} File": "{0} Datei", @@ -596,6 +629,8 @@ global.messages['de'] = { "{0} polls": "{0} Umfragen", "{0} request": "{0} Aufruf", "{0} requests": "{0} Aufrufe", + "{0} site": "{0} Website", + "{0} sites": "{0} Websites", "{0} sites sorted by {1} in {2} order.": "Typ: {0} Sortierung: {1} {2}", "{0} story": "{0} Beitrag", "{0} stories": "{0} Beiträge", @@ -612,4 +647,5 @@ global.messages['de'] = { "{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”": "{0} {2} {1} {3} in {4}", "{0}% in the last 5 min.": "{0}% in den letzten 5 Min.", "{0}% total": "{0}% gesamt", + "{0}Download the archive{1} or click “Export” to create a new one.": "{0}Laden Sie das Archiv herunter{1} oder klicken Sie »Exportieren«, um ein neues zu erstellen.", }; diff --git a/i18n/messages.en.js b/i18n/messages.en.js index 297feb0b..ed62a541 100644 --- a/i18n/messages.en.js +++ b/i18n/messages.en.js @@ -11,13 +11,14 @@ if (!global.messages) { global.messages['en'] = { "({0} character)": "({0} character)", "({0} characters)": "({0} characters)", - "A Blogger export file (.xml) will be created and available for download from here within 24 hours.": "A Blogger export file (.xml) will be created and available for download from here within 24 hours.", "A confirmation mail was sent to your e-mail address.": "A confirmation mail was sent to your e-mail address.", "A generic disclaimer will be automatically appended to your message.": "A generic disclaimer will be automatically appended to your message.", "API": "API", "Abandoned": "Abandoned", + "Accept": "Accept", "Account": "Account", "Account Image": "Account Image", + "Account is being deleted": "Account is being deleted", "Accounts": "Accounts", "Activity": "Activity", "Add Choice": "Add Choice", @@ -51,7 +52,6 @@ global.messages['en'] = { "Blocked": "Blocked", "Bookmarklet": "Bookmarklet", "Both": "Both", - "Browse": "Browse", "Build": "Build", "Cache": "Cache", "Callback URL": "Callback URL", @@ -73,9 +73,6 @@ global.messages['en'] = { "Confirm Deletion": "Confirm Deletion", "Confirm Reset": "Confirm Reset", "Confirm Unsubscribe": "Confirm Unsubscribe", - "Connect with {0}": "Connect with {0}", - "Connecting with {0} failed. {1} Please try again.": "Connecting with {0} failed. {1} Please try again.", - "Connections": "Connections", "Contact": "Contact", "Contact {0}": "Contact {0}", "Content": "Content", @@ -84,7 +81,6 @@ global.messages['en'] = { "Contributors": "Contributors", "Convert": "Convert", "Convert Layout": "Convert Layout", - "Could not connect with Facebook. ({0})": "Could not connect with Facebook. ({0})", "Could not fetch the file from the given URL.": "Could not fetch the file from the given URL.", "Could not remove the image file from disk.": "Could not remove the image file from disk.", "Could not resize the image.": "Could not resize the image.", @@ -97,25 +93,26 @@ global.messages['en'] = { "Created": "Created", "Created by {0} on {1}": "Created by {0} on {1}", "Created by {0} on {1}.": "Created by {0} on {1}.", + "Created on {0}": "Created on {0}", "Created {0}": "Created {0}", - "Currently, it is not possible to remove an account. Please accept our humble apologies.": "Currently, it is not possible to remove an account. Please accept our humble apologies.", + "Data Privacy Statement": "Data Privacy Statement", + "Date": "Date", "Date string in Unix timestamp format": "Date string in Unix timestamp format", "Delete": "Delete", "Deleted": "Deleted", + "Deleted on {0}": "Deleted on {0}", "Description": "Description", "Details": "Details", "Development": "Development", "Dimensions": "Dimensions", "Disable filter": "Disable filter", "Disabled": "Disabled", - "Disconnect from {0}": "Disconnect from {0}", "Disk Quota": "Disk Quota", "Disk Space": "Disk Space", "Display": "Display", "Do Androids dream of electric sheep?": "Do Androids dream of electric sheep?", - "Download the file {0} or klick “Start” to create a new one.": "Download the file {0} or klick “Start” to create a new one.", "Drag to Bookmarks Bar": "Drag to Bookmarks Bar", - "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.", + "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.", "E-mail": "E-mail", "E.g. if you enter {0} here your site will be reachable via {1}": "E.g. if you enter {0} here your site will be reachable via {1}", "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL – on a server and in a programming language of their choice.": "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL – on a server and in a programming language of their choice.", @@ -134,6 +131,7 @@ global.messages['en'] = { "Error Ratio": "Error Ratio", "Errors": "Errors", "Export": "Export", + "Export Account Data": "Export Account Data", "Export Site Data": "Export Site Data", "File": "File", "File size is exceeding the upload limit.": "File size is exceeding the upload limit.", @@ -151,10 +149,13 @@ global.messages['en'] = { "Have fun!": "Have fun!", "Health": "Health", "Hello {0}.": "Hello {0}.", + "Helma Version": "Helma Version", "Hide": "Hide", + "I understand and accept the {0}data privacy statement{1}": "I understand and accept the {0}data privacy statement{1}", + "I understand and accept the {0}terms and conditions{1}": "I understand and accept the {0}terms and conditions{1}", "If the user did not include contact information in the message itself, you can send your reply via the user’s contact form [2].": "If the user did not include contact information in the message itself, you can send your reply via the user’s contact form [2].", "If you do not specify a name Antville will create one based on the filename.": "If you do not specify a name Antville will create one based on the filename.", - "If you enter a URL here your user name will appear as link next to your posted items.": "If you enter a URL here your user name will appear as link next to your posted items.", + "If you enter a URL here your username will appear as link next to your posted items.": "If you enter a URL here your username will appear as link next to your posted items.", "If you should really have forgotten your password, you can use the password reset option.": "If you should really have forgotten your password, you can use the password reset option.", "If you think you have received this e-mail in error please contact the maintainer of the site.": "If you think you have received this e-mail in error please contact the maintainer of the site.", "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.", @@ -174,6 +175,7 @@ global.messages['en'] = { "Last Login": "Last Login", "Last Update": "Last Update", "Last modified by {0} on {1}": "Last modified by {0} on {1}", + "Last modified on {0}": "Last modified on {0}", "Last modified {0}": "Last modified {0}", "Layout": "Layout", "Layout Images": "Layout Images", @@ -181,7 +183,6 @@ global.messages['en'] = { "Logged in as {0}": "Logged in as {0}", "Login": "Login", "Login // verb": "Login", - "Login with {0}": "Login with {0}", "Logout // verb": "Logout", "Manager": "Manager", "Managers": "Managers", @@ -225,6 +226,8 @@ global.messages['en'] = { "Password forgotten?": "Password forgotten?", "Personal URL": "Personal URL", "Pixels": "Pixels", + "Please accept the data privacy statement.": "Please accept the data privacy statement.", + "Please accept the terms and conditions.": "Please accept the terms and conditions.", "Please avoid special characters or HTML code in the name field.": "Please avoid special characters or HTML code in the name field.", "Please be aware of the fact that there is no “undo”, so if you click “Proceed” below the changes will be applied irreversibly.": "Please be aware of the fact that there is no “undo”, so if you click “Proceed” below the changes will be applied irreversibly.", "Please choose a prototype and enter a skin name": "Please choose a prototype and enter a skin name", @@ -235,7 +238,7 @@ global.messages['en'] = { "Please enter a new name for this tag": "Please enter a new name for this tag", "Please enter a new password.": "Please enter a new password.", "Please enter a query in the search form.": "Please enter a query in the search form.", - "Please enter a user name and e-mail address.": "Please enter a user name and e-mail address.", + "Please enter a username and e-mail address.": "Please enter a username and e-mail address.", "Please enter a username.": "Please enter a username.", "Please enter a valid URL": "Please enter a valid URL", "Please enter a valid e-mail address": "Please enter a valid e-mail address", @@ -275,6 +278,7 @@ global.messages['en'] = { "Register": "Register", "Registered": "Registered", "Registration": "Registration", + "Registration & Login": "Registration & Login", "Regular": "Regular", "Remember Login": "Remember Login", "Request Password Reset": "Request Password Reset", @@ -291,6 +295,8 @@ global.messages['en'] = { "Save": "Save", "Save and Run": "Save and Run", "Search": "Search", + "Search with {0}": "Search with {0}", + "Select": "Select", "Send": "Send", "Send Request": "Send Request", "Separated by commas": "Separated by commas", @@ -306,7 +312,6 @@ global.messages['en'] = { "Site Creation": "Site Creation", "Site Page": "Site Page", "Site Phase-Out": "Site Phase-Out", - "Site is scheduled for export.": "Site is scheduled for export.", "Site is scheduled for import.": "Site is scheduled for import.", "Sites": "Sites", "Size": "Size", @@ -314,12 +319,13 @@ global.messages['en'] = { "Skins": "Skins", "Something went wrong.": "Something went wrong.", "Sorry!": "Sorry!", + "Sorry, logging in is currently not possible.": "Sorry, logging in is currently not possible.", "Sorry, the file exceeds the maximum upload limit of {0} kB.": "Sorry, the file exceeds the maximum upload limit of {0} kB.", - "Sorry, the user name you entered already exists. Please enter a different one.": "Sorry, the user name you entered already exists. Please enter a different one.", + "Sorry, the username you entered already exists. Please enter a different one.": "Sorry, the username you entered already exists. Please enter a different one.", "Sorry, the username you entered is too long. Please choose a shorter one.": "Sorry, the username you entered is too long. Please choose a shorter one.", "Sorry, there is no disk space left. Please try to delete some files or images first.": "Sorry, there is no disk space left. Please try to delete some files or images first.", "Sorry, this layout is not compatible with Antville.": "Sorry, this layout is not compatible with Antville.", - "Sorry, your input did not match any registered user.": "Sorry, your input did not match any registered user.", + "Sorry, your input did not match any registered account.": "Sorry, your input did not match any registered account.", "Source: {0}": "Source: {0}", "Start": "Start", "Start Page": "Start Page", @@ -329,6 +335,8 @@ global.messages['en'] = { "Stories by {0}": "Stories by {0}", "Story": "Story", "Story Archive {0} ({1})": "Story Archive {0} ({1})", + "Story about Data Privacy Statement": "Story about Data Privacy Statement", + "Story about Terms and Conditions": "Story about Terms and Conditions", "Stylesheet": "Stylesheet", "Subscribe // verb": "Subscribe", "Subscribed": "Subscribed", @@ -345,10 +353,14 @@ global.messages['en'] = { "Tag": "Tag", "Tag: {0}": "Tag: {0}", "Tags": "Tags", + "Terms and Conditions": "Terms and Conditions", "Text": "Text", "Thanks, your vote was registered. You can change your mind until the poll is closed.": "Thanks, your vote was registered. You can change your mind until the poll is closed.", "The Management": "The Management", "The URL endpoint for each of these APIs is located at": "The URL endpoint for each of these APIs is located at", + "The account data will be available for download from here within the next days.": "The account data will be available for download from here within the next days.", + "The account is queued for export.": "The account is queued for export.", + "The account {0} was deleted.": "The account {0} was deleted.", "The callback URL will be invoked as an HTTP POST request with the following parameters:": "The callback URL will be invoked as an HTTP POST request with the following parameters:", "The changes were saved successfully.": "The changes were saved successfully.", "The chosen name is too long. Please enter a shorter one.": "The chosen name is too long. Please enter a shorter one.", @@ -364,11 +376,13 @@ global.messages['en'] = { "The path you requested was not found.": "The path you requested was not found.", "The poll was created successfully.": "The poll was created successfully.", "The poll was updated successfully.": "The poll was updated successfully.", + "The site data will be available for download from here, soon.": "The site data will be available for download from here, soon.", + "The site is queued for export.": "The site is queued for export.", "The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.": "The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.", "The site you requested has been blocked.": "The site you requested has been blocked.", "The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "The site {0} at {1} will be blocked in {2} because it is being restricted for too long.", "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.", - "The site {0} is queued for removal.": "The site {0} is queued for removal.", + "The site {0} is being deleted.": "The site {0} is being deleted.", "The story is {0} and {1}": "The story is {0} and {1}", "The story was successfully created.": "The story was successfully created.", "The story was successfully updated.": "The story was successfully updated.", @@ -377,6 +391,7 @@ global.messages['en'] = { "The user {0} has modified your membership of the site {1} at {2}.": "The user {0} has modified your membership of the site {1} at {2}.", "The {0} macro is missing. It is essential for accessing the site and must be present in this skin.": "The {0} macro is missing. It is essential for accessing the site and must be present in this skin.", "There already is a site with this name.": "There already is a site with this name.", + "There is already another job queued for this account: {0}": "There is already another job queued for this account: {0}", "There is already another job queued for this site: {0}": "There is already another job queued for this site: {0}", "There was nothing to upload. Please be sure to choose a file.": "There was nothing to upload. Please be sure to choose a file.", "This URL is not valid for resetting your password.": "This URL is not valid for resetting your password.", @@ -391,7 +406,6 @@ global.messages['en'] = { "This message was sent to you by the user {0} of the site {1} [1].": "This message was sent to you by the user {0} of the site {1} [1].", "This poll was closed {0} by {1}": "This poll was closed {0} by {1}", "This site is currently {0}.": "This site is currently {0}.", - "This site is going to be deleted completely and irreversibly after {0}.": "This site is going to be deleted completely and irreversibly after {0}.", "This skin contains additional JavaScript code that will be included in every page.": "This skin contains additional JavaScript code that will be included in every page.", "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.", "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.", @@ -402,6 +416,7 @@ global.messages['en'] = { "Thus, it is publicly accessible for every visitor.": "Thus, it is publicly accessible for every visitor.", "Thus, you will be notified whenever the site has undergone changes as specified in the site preferences.": "Thus, you will be notified whenever the site has undergone changes as specified in the site preferences.", "Time Zone": "Time Zone", + "Timeline": "Timeline", "Title": "Title", "Title or name of the site": "Title or name of the site", "To confirm the request please click the link below.": "To confirm the request please click the link below.", @@ -417,15 +432,18 @@ global.messages['en'] = { "URL string of the site": "URL string of the site", "Unfortunately, your login failed. Maybe a typo?": "Unfortunately, your login failed. Maybe a typo?", "Update": "Update", + "Updated Terms & Conditions": "Updated Terms & Conditions", "Updates": "Updates", "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.", "Uptime": "Uptime", - "User name and e-mail address do not match.": "User name and e-mail address do not match.", + "User": "Account", + "Username and e-mail address do not match.": "Username and e-mail address do not match.", "Version": "Version", "Via": "Via", "Vote": "Vote", "Warning!": "Warning!", "We are sorry to inform you that the user {0} has cancelled your membership of the site {1} at {2}.": "We are sorry to inform you that the user {0} has cancelled your membership of the site {1} at {2}.", + "We have updated our terms and conditions. Please reaffirm you understand and accept the following:": "We have updated our terms and conditions. Please reaffirm you understand and accept the following:", "Welcome": "Welcome", "Welcome to {0}, {1}!": "Welcome to {0}, {1}!", "Welcome to {0}, {1}. Have fun!": "Welcome to {0}, {1}. Have fun!", @@ -435,15 +453,16 @@ global.messages['en'] = { "Yes, really erase {0} comment": "Yes, really erase {0} comment", "Yes, really erase {0} comments": "Yes, really erase {0} comments", "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.", - "You are about to delete a comment by user {0}.": "You are about to delete a comment by user {0}.", + "You are about to delete a comment by {0}.": "You are about to delete a comment by {0}.", "You are about to delete a comment thread consisting of {0} postings.": "You are about to delete a comment thread consisting of {0} postings.", "You are about to delete a poll by user {0}.": "You are about to delete a poll by user {0}.", - "You are about to delete a story by user {0}.": "You are about to delete a story by user {0}.", + "You are about to delete a story by {0}.": "You are about to delete a story by {0}.", "You are about to delete the account {0}.": "You are about to delete the account {0}.", "You are about to delete the file {0}.": "You are about to delete the file {0}.", "You are about to delete the image {0}.": "You are about to delete the image {0}.", - "You are about to delete the membership of user {0}.": "You are about to delete the membership of user {0}.", + "You are about to delete the membership of {0}.": "You are about to delete the membership of {0}.", "You are about to delete the site {0}.": "You are about to delete the site {0}.", + "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.", "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.", "You are about to reset the layout of site {0}.": "You are about to reset the layout of site {0}.", "You are about to reset the skin {0}.{1}.": "You are about to reset the skin {0}.{1}.", @@ -457,16 +476,16 @@ global.messages['en'] = { "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.", "You can filter the results by site name. Use the asterisk * as wildcard.": "You can filter the results by site name. Use the asterisk * as wildcard.", "You can use the asterisk * as wildcard.": "You can use the asterisk * as wildcard.", - "You cannot revoke permissions from the only privileged user.": "You cannot revoke permissions from the only privileged user.", - "You denied the request.": "You denied the request.", + "You cannot delete a privileged account.": "You cannot delete a privileged account.", + "You cannot revoke permissions from the only privileged account.": "You cannot revoke permissions from the only privileged account.", "You did not vote, yet. You can vote until the poll is closed.": "You did not vote, yet. You can vote until the poll is closed.", "You need to wait {0} before you are allowed to create a new site.": "You need to wait {0} before you are allowed to create a new site.", "You will then be asked to change your password.": "You will then be asked to change your password.", "Your account has been blocked.": "Your account has been blocked.", "Your message was sent successfully.": "Your message was sent successfully.", "Your password was changed.": "Your password was changed.", - "[{0}] Message from anonymous user": "[{0}] Message from anonymous user", - "[{0}] Message from user {1}": "[{0}] Message from user {1}", + "[{0}] Message from anonymous": "[{0}] Message from anonymous", + "[{0}] Message from {1}": "[{0}] Message from {1}", "[{0}] Notification of membership cancellation": "[{0}] Notification of membership cancellation", "[{0}] Notification of membership change": "[{0}] Notification of membership change", "[{0}] Notification of site changes": "[{0}] Notification of site changes", @@ -503,6 +522,7 @@ global.messages['en'] = { "descending": "descending", "disabled": "disabled", "e-mail": "e-mail", + "e.g. {0}": "e.g. {0}", "enabled": "enabled", "export": "export", "featured": "featured", @@ -514,6 +534,18 @@ global.messages['en'] = { "images": "images", "import": "import", "in": "in", + "in {0} day": "in {0} day", + "in {0} days": "in {0} days", + "in {0} hour": "in {0} hour", + "in {0} hours": "in {0} hours", + "in {0} minute": "in {0} minute", + "in {0} minutes": "in {0} minutes", + "in {0} month": "in {0} month", + "in {0} months": "in {0} months", + "in {0} week": "in {0} week", + "in {0} weeks": "in {0} weeks", + "in {0} year": "in {0} year", + "in {0} years": "in {0} years", "last login": "last login", "layout": "layout", "link": "link", @@ -538,16 +570,17 @@ global.messages['en'] = { "site": "site", "skin": "skin", "skins": "skins", + "soon": "soon", "stories": "stories", "story": "story", "tag": "tag", "tags": "tags", + "tomorrow": "tomorrow", "trusted": "trusted", "updated // has updated": "updated", "used": "used", "vote": "vote", "yesterday": "yesterday", - "{0} 401 Error": "{0} 401 Error", "{0} Comment": "{0} Comment", "{0} Comments": "{0} Comments", "{0} File": "{0} File", @@ -596,6 +629,8 @@ global.messages['en'] = { "{0} polls": "{0} polls", "{0} request": "{0} request", "{0} requests": "{0} requests", + "{0} site": "{0} site", + "{0} sites": "{0} sites", "{0} sites sorted by {1} in {2} order.": "{0} sites sorted by {1} in {2} order.", "{0} story": "{0} story", "{0} stories": "{0} stories", @@ -612,4 +647,5 @@ global.messages['en'] = { "{0} {1} {2} {3} on {4} // e.g. “{3 days ago} {admin} {posted} {a story} on {Antville}”": "{0} {1} {2} {3} on {4}", "{0}% in the last 5 min.": "{0}% in the last 5 min.", "{0}% total": "{0}% total", + "{0}Download the archive{1} or click “Export” to create a new one.": "{0}Download the archive{1} or click “Export” to create a new one.", }; diff --git a/legal/jdom.txt b/legal/jdom.txt deleted file mode 100644 index a0333d0a..00000000 --- a/legal/jdom.txt +++ /dev/null @@ -1,49 +0,0 @@ -Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions, and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions, and the disclaimer that follows - these conditions in the documentation and/or other materials - provided with the distribution. - - 3. The name "JDOM" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact . - - 4. Products derived from this software may not be called "JDOM", nor - may "JDOM" appear in their name, without prior written permission - from the JDOM Project Management . - - In addition, we request (but do not require) that you include in the - end-user documentation provided with the redistribution and/or in the - software itself an acknowledgement equivalent to the following: - "This product includes software developed by the - JDOM Project (http://www.jdom.org/)." - Alternatively, the acknowledgment may be graphical using the logos - available at http://www.jdom.org/images/logos. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - This software consists of voluntary contributions made by many - individuals on behalf of the JDOM Project and was originally - created by Jason Hunter and - Brett McLaughlin . For more information - on the JDOM Project, please see . diff --git a/legal/medialoot.txt b/legal/medialoot.txt deleted file mode 100644 index 46a79104..00000000 --- a/legal/medialoot.txt +++ /dev/null @@ -1,3 +0,0 @@ -Round Social Media Icons by MediaLoot. - -http://medialoot.com/item/round-social-media-icons/ diff --git a/legal/rome.txt b/legal/rome.txt deleted file mode 100644 index b4b30c1c..00000000 --- a/legal/rome.txt +++ /dev/null @@ -1,13 +0,0 @@ - Copyright 2004 Sun Microsystems, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/legal/scribe.txt b/legal/scribe.txt deleted file mode 100644 index 8e8ed591..00000000 --- a/legal/scribe.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2010 Pablo Fenandez - -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. diff --git a/lib/itunes-0.4.jar b/lib/itunes-0.4.jar deleted file mode 100644 index 87728dc9..00000000 Binary files a/lib/itunes-0.4.jar and /dev/null differ diff --git a/lib/jdom.jar b/lib/jdom.jar deleted file mode 100644 index 288e64cb..00000000 Binary files a/lib/jdom.jar and /dev/null differ diff --git a/lib/opml-0.1.jar b/lib/opml-0.1.jar deleted file mode 100644 index f29ea9d6..00000000 Binary files a/lib/opml-0.1.jar and /dev/null differ diff --git a/lib/rome-1.0.jar b/lib/rome-1.0.jar deleted file mode 100644 index 7138baac..00000000 Binary files a/lib/rome-1.0.jar and /dev/null differ diff --git a/package.json b/package.json index 3eb063c2..a7c88154 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "Antville", - "version": "1.5.0", + "name": "antville", + "version": "1.618.0", "description": "Antville is an open source project aimed at the development of a high performance, feature rich weblog hosting software. It can easily host up to several thousands of sites (the number of weblogs is rather limited by the installation owner’s choice and server power than by software limitations).", "main": "main.js", "directories": { @@ -8,32 +8,42 @@ "test": "tests" }, "scripts": { - "install": "napa", - "test": "echo \"Error: no test specified\" && exit 1" + "add-claustra": "tools/claustra/add-claustra.js", + "add-patch": "tools/updater/add-patch.js", + "patch": "tools/updater/run-patch.js", + "build:main.js": "browserify tools/client/main.js -o static/scripts/main.min.js", + "build:editor.js": "browserify tools/client/editor.js -o static/scripts/editor.min.js", + "build:gallery.js": "browserify tools/client/gallery.js -o static/scripts/gallery.min.js", + "build:main.css": "lessc --clean-css tools/client/main.less static/styles/main.min.css", + "build:editor.css": "lessc --clean-css tools/client/editor.less static/styles/editor.min.css", + "dev": "run-p -cl dev:*.js dev:*.css", + "dev:main.js": "onchange tools/client/main.js -- yarn build:main.js", + "dev:main.css": "onchange tools/client/main.less -- yarn build:main.css", + "dev:editor.js": "onchange tools/client/editor.js -- yarn build:editor.js", + "dev:editor.css": "onchange tools/client/editor.less -- yarn build:editor.css", + "dev:gallery.js": "onchange tools/client/gallery.js -- yarn build:gallery.js" }, "repository": { "type": "git", - "url": "https://code.google.com/p/antville" + "url": "https://github.com/antville/antville" }, - "author": "The Ant Queens", - "license": "Apache 2", - "napa": { - "uikit-bower": "uikit/bower-uikit#2.18.0", - "jquery-collagePlus": "ed-lea/jquery-collageplus#0.3.3" - }, - "browserify-css": { - "minify": true + "author": "The Antville People", + "license": "Apache-2.0", + "dependencies": { + "alpinejs": "=2.3.3", + "codemirror": "^5.53.2", + "jquery": "^3.5.0", + "jquery-collagePlus": "github:antville/jquery-collagePlus#0.3.4", + "js-md5": "^0.7.3", + "uikit": "^2.27.4" }, "devDependencies": { - "JSON": "^1.0.0", - "browserify": "^8.0.2", - "codemirror": "^5.1.0", - "jquery": "^2.1.3", - "js-md5": "^0.3.0", - "less": "=1.7.5", - "marked": "^0.3.3", - "minifyify": "^6.1.0", - "napa": "^1.1.0", - "sanitize-html": "^1.6.1" + "browserify": "^16.5.1", + "jsdoc": "^3.6.4", + "less": "^3.11.1", + "less-plugin-clean-css": "^1.5.1", + "npm-run-all": "^4.1.5", + "onchange": "^7.0.2", + "uglifyify": "^5.0.2" } } diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..4322485c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +rootProject.name = 'antville' + +// Copy task ignores multiple files per default +// See https://github.com/gradle/gradle/issues/11176 +org.apache.tools.ant.DirectoryScanner.removeDefaultExclude('**/.git') +org.apache.tools.ant.DirectoryScanner.removeDefaultExclude('**/.git/**') +org.apache.tools.ant.DirectoryScanner.removeDefaultExclude('**/.gitattributes') +org.apache.tools.ant.DirectoryScanner.removeDefaultExclude('**/.gitignore') + +include 'antclick' +project(':antclick').projectDir = file('tools/antclick') + +startParameter.excludedTaskNames = ['jar', 'javadoc'] diff --git a/static/fonts/FontAwesome.otf b/static/fonts/FontAwesome.otf deleted file mode 100644 index f7936cc1..00000000 Binary files a/static/fonts/FontAwesome.otf and /dev/null differ diff --git a/static/fonts/fontawesome-webfont.eot b/static/fonts/fontawesome-webfont.eot deleted file mode 100644 index 33b2bb80..00000000 Binary files a/static/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/static/fonts/fontawesome-webfont.ttf b/static/fonts/fontawesome-webfont.ttf deleted file mode 100644 index ed9372f8..00000000 Binary files a/static/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/static/fonts/fontawesome-webfont.woff b/static/fonts/fontawesome-webfont.woff deleted file mode 100644 index 8b280b98..00000000 Binary files a/static/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/static/fonts/fontawesome-webfont.woff2 b/static/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 3311d585..00000000 Binary files a/static/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/static/formica.html b/static/formica.html old mode 100755 new mode 100644 index 30e78abc..5ad9c481 --- a/static/formica.html +++ b/static/formica.html @@ -1,384 +1,451 @@ - - - - Antville’s Formica Bookmarklet - - - +Antville’s Formica Bookmarklet -
-
- -
-
-
+ + -
-
- -
-
- -
-
-
- - -
- - - -
-
+ + + - + - - + + +
+
+
+
+
0×0
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ Loading… +
+ +
+
+
+ + diff --git a/static/img/ant.svg b/static/img/ant.svg index e5e4c759..dc1c3df6 100644 --- a/static/img/ant.svg +++ b/static/img/ant.svg @@ -2,161 +2,63 @@ - - - - - - - - image/svg+xml - - - - - Openclipart - - - Ant Icon - 2006-08-29T21:35:51 - This is a lame flat version of Andy's ant ready for use as a solid element in a logo or on a poster. - https://openclipart.org/detail/69/ant-icon-by-rejon - - - rejon - - - - - animal - ant - black - bug - flat - insect - monochrome - no contour - poster - silhouette - solid - - - - - - - - - - - + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Ant Icon + 2006-08-29T21:35:51 + + This is a lame flat version of Andy's ant ready for use as a solid element in a logo or on a poster. + + https://openclipart.org/detail/69/ant-icon-by-rejon + + + rejon + + + + + animal + ant + black + bug + flat + insect + monochrome + no contour + poster + silhouette + solid + + + + + + + + + + + diff --git a/static/scripts/editor.min.js b/static/scripts/editor.min.js deleted file mode 100644 index 7cb2b791..00000000 --- a/static/scripts/editor.min.js +++ /dev/null @@ -1,39 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o/i,c={startState:function(){return{}},token:function(t,e){t.next();return"helma-macro"}};return{startState:function(){return o=o||CodeMirror.getMode(t,"htmlmixed"),{token:e.startOpen?r:n,htmlState:o.startState(),macroState:c.startState()}},token:function(t,e){return e.token(t,e)},indent:function(t,e){return t.token==n?o.indent(t.htmlState,e):c.indent(t.macroState,e)},copyState:function(t){return{token:t.token,htmlState:CodeMirror.copyState(o,t.htmlState),macroState:CodeMirror.copyState(c,t.macroState)}},electricChars:"/{}:"}},"htmlmixed"),CodeMirror.defineMIME("application/x-helma-skin",{name:"helma-skin"}); -},{}],2:[function(require,module,exports){ -window.CodeMirror=require("codemirror/lib/codemirror"),require("codemirror/mode/css/css"),require("codemirror/mode/gfm/gfm"),require("codemirror/mode/htmlmixed/htmlmixed"),require("codemirror/mode/javascript/javascript"),require("codemirror/mode/markdown/markdown"),require("codemirror/mode/xml/xml"),require("./cm-skin-mode"),window.marked=require("marked/lib/marked"),require("uikit-bower/js/components/htmleditor"); -},{"./cm-skin-mode":1,"codemirror/lib/codemirror":4,"codemirror/mode/css/css":5,"codemirror/mode/gfm/gfm":6,"codemirror/mode/htmlmixed/htmlmixed":7,"codemirror/mode/javascript/javascript":8,"codemirror/mode/markdown/markdown":9,"codemirror/mode/xml/xml":11,"marked/lib/marked":12,"uikit-bower/js/components/htmleditor":13}],3:[function(require,module,exports){ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.overlayMode=function(o,r,a){return{startState:function(){return{base:e.startState(o),overlay:e.startState(r),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(a){return{base:e.copyState(o,a.base),overlay:e.copyState(r,a.overlay),basePos:a.basePos,baseCur:null,overlayPos:a.overlayPos,overlayCur:null}},token:function(e,n){return(e!=n.streamSeen||Math.min(n.basePos,n.overlayPos)po&&setTimeout(function(){a.display.input.reset(!0)},20),Bt(this),ji(),yt(this),this.curOp.forceUpdate=!0,Xn(this,i),n.autofocus&&!So||a.hasFocus()?setTimeout(Ii(hr,this),20):dr(this);for(var c in Yo)Yo.hasOwnProperty(c)&&Yo[c](this,n[c],$o);C(this),n.finishInit&&n.finishInit(this);for(var f=0;fpo&&(n.gutters.style.zIndex=-1,n.scroller.style.paddingRight=0),go||uo&&So||(n.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(n.wrapper):e(n.wrapper)),n.viewFrom=n.viewTo=t.first,n.reportedViewFrom=n.reportedViewTo=t.first,n.view=[],n.renderedView=null,n.externalMeasured=null,n.viewOffset=0,n.lastWrapHeight=n.lastWrapWidth=0,n.updateLineNumbers=null,n.nativeBarWidth=n.barHeight=n.barWidth=0,n.scrollbarsClipped=!1,n.lineNumWidth=n.lineNumInnerWidth=n.lineNumChars=null,n.alignWidgets=!1,n.cachedCharWidth=n.cachedTextHeight=n.cachedPaddingH=null,n.maxLine=null,n.maxLineLength=0,n.maxLineChanged=!1,n.wheelDX=n.wheelDY=n.wheelStartX=n.wheelStartY=null,n.shift=!1,n.selForContextMenu=null,n.activeTouch=null,r.init(n)}function r(t){t.doc.mode=e.getMode(t.options,t.doc.modeOption),n(t)}function n(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.frontier=e.doc.first,ze(e,100),e.state.modeGen++,e.curOp&&Ht(e)}function i(e){e.options.lineWrapping?(Vl(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(Ul(e.display.wrapper,"CodeMirror-wrap"),h(e)),l(e),Ht(e),ot(e),setTimeout(function(){y(e)},100)}function o(e){var t=vt(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/mt(e.display)-3);return function(i){if(yn(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;lt.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}function d(e){var t=Ni(e.gutters,"CodeMirror-linenumbers");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function p(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+Ue(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Ke(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}function g(e,t,r){this.cm=r;var n=this.vert=Fi("div",[Fi("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=Fi("div",[Fi("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e(n),e(i),Sl(n,"scroll",function(){n.clientHeight&&t(n.scrollTop,"vertical")}),Sl(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedOverlay=!1,ho&&8>po&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function v(){}function m(t){t.display.scrollbars&&(t.display.scrollbars.clear(),t.display.scrollbars.addClass&&Ul(t.display.wrapper,t.display.scrollbars.addClass)),t.display.scrollbars=new e.scrollbarModel[t.options.scrollbarStyle](function(e){t.display.wrapper.insertBefore(e,t.display.scrollbarFiller),Sl(e,"mousedown",function(){t.state.focused&&setTimeout(function(){t.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,r){"horizontal"==r?er(t,e):Jt(t,e)},t),t.display.scrollbars.addClass&&Vl(t.display.wrapper,t.display.scrollbars.addClass)}function y(e,t){t||(t=p(e));var r=e.display.barWidth,n=e.display.barHeight;b(e,t);for(var i=0;4>i&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&O(e),b(e,p(e)),r=e.display.barWidth,n=e.display.barHeight}function b(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}function w(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-Ge(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=Qn(t,n),l=Qn(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;o>s?(o=s,l=Qn(t,Jn(_n(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=Qn(t,Jn(_n(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function x(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=L(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;l=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==Rt(e))return!1;C(e)&&(Pt(e),t.dims=H(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFroml&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),Wo&&(o=vn(e.doc,o),l=mn(e.doc,l));var s=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;Ft(e,o,l),r.viewOffset=Jn(_n(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var a=Rt(e);if(!s&&0==a&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var u=Gi();return a>4&&(r.lineDiv.style.display="none"),I(e,r.updateLineNumbers,t.dims),a>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,u&&Gi()!=u&&u.offsetHeight&&u.focus(),Ri(r.cursorDiv),Ri(r.selectionDiv),r.gutters.style.height=0,s&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,ze(e,400)),r.updateLineNumbers=null,!0}function A(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=je(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+Ue(e.display)-Xe(e),r.top)}),t.visible=w(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&M(e,t);n=!1){O(e);var i=p(e);De(e),W(e,i),y(e,i)}t.signal(e,"update",e),(e.display.viewFrom!=e.display.reportedViewFrom||e.display.viewTo!=e.display.reportedViewTo)&&(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function N(e,t){var r=new k(e,t);if(M(e,r)){O(e),A(e,r);var n=p(e);De(e),W(e,n),y(e,n),r.finish()}}function W(e,t){e.display.sizer.style.minHeight=t.docHeight+"px";var r=t.docHeight+e.display.barHeight;e.display.heightForcer.style.top=r+"px",e.display.gutters.style.height=Math.max(r+Ke(e),t.clientHeight)+"px"}function O(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;npo){var l=o.node.offsetTop+o.node.offsetHeight;i=l-r,r=l}else{var s=o.node.getBoundingClientRect();i=s.bottom-s.top}var a=o.line.height-i;if(2>i&&(i=vt(t)),(a>.001||-.001>a)&&(qn(o.line,i),D(o.line),o.rest))for(var u=0;u=t&&f.lineNumber;f.changes&&(Ni(f.changes,"gutter")>-1&&(h=!1),P(e,f,u,r)),h&&(Ri(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(S(e.options,u)))),s=f.node.nextSibling}else{var d=V(e,f,u,r);l.insertBefore(d,s)}u+=f.size}for(;s;)s=n(s)}function P(e,t,r,n){for(var i=0;ipo&&(e.node.style.zIndex=2)),e.node}function z(e){var t=e.bgClass?e.bgClass+" "+(e.line.bgClass||""):e.line.bgClass;if(t&&(t+=" CodeMirror-linebackground"),e.background)t?e.background.className=t:(e.background.parentNode.removeChild(e.background),e.background=null);else if(t){var r=E(e);e.background=r.insertBefore(Fi("div",null,t),r.firstChild)}}function F(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):In(e,t)}function R(e,t){var r=t.text.className,n=F(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,B(t)):r&&(t.text.className=r)}function B(e){z(e),e.line.wrapClass?E(e).className=e.line.wrapClass:e.node!=e.text&&(e.node.className="");var t=e.textClass?e.textClass+" "+(e.line.textClass||""):e.line.textClass;e.text.className=t||""}function G(e,t,r,n){t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null);var i=t.line.gutterMarkers;if(e.options.lineNumbers||i){var o=E(t),l=t.gutter=Fi("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+"px; width: "+n.gutterTotalWidth+"px");if(e.display.input.setUneditable(l),o.insertBefore(l,t.text),t.line.gutterClass&&(l.className+=" "+t.line.gutterClass),!e.options.lineNumbers||i&&i["CodeMirror-linenumbers"]||(t.lineNumber=l.appendChild(Fi("div",S(e.options,r),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+n.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),i)for(var s=0;s1&&(Ho&&Ho.join("\n")==t?s=n.ranges.length%Ho.length==0&&Wi(Ho,Xl):l.length==n.ranges.length&&(s=Wi(l,function(e){return[e]})));for(var a=n.ranges.length-1;a>=0;a--){var u=n.ranges[a],c=u.from(),f=u.to();u.empty()&&(r&&r>0?c=Oo(c.line,c.ch-r):e.state.overwrite&&!e.state.pasteIncoming&&(f=Oo(f.line,Math.min(_n(o,f.line).text.length,f.ch+Ai(l).length))));var h=e.curOp.updateInput,d={from:c,to:f,text:s?s[a%s.length]:l,origin:i||(e.state.pasteIncoming?"paste":e.state.cutIncoming?"cut":"+input")};xr(e.doc,d),bi(e,"inputRead",e,d)}t&&!e.state.pasteIncoming&&J(e,t),Hr(e),e.curOp.updateInput=h,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function J(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s-1){l=Pr(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(_n(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Pr(e,i.head.line,"smart"));l&&bi(e,"electricInput",e,i.head.line)}}}function ee(e){for(var t=[],r=[],n=0;ni?u.map:c[i],l=0;li?e.line:e.rest[i]),f=o[l]+n;return(0>n||s!=t)&&(f=o[l+(n?1:0)]),Oo(a,f)}}}var i=e.text.firstChild,o=!1;if(!t||!Rl(i,t))return le(Oo(Zn(e.line),0),!0);if(t==i&&(o=!0,t=i.childNodes[r],r=0,!t)){var l=e.rest?Ai(e.rest):e.line;return le(Oo(Zn(l),l.text.length),o)}var s=3==t.nodeType?t:null,a=t;for(s||1!=t.childNodes.length||3!=t.firstChild.nodeType||(s=t.firstChild,r&&(r=s.nodeValue.length));a.parentNode!=i;)a=a.parentNode;var u=e.measure,c=u.maps,f=n(s,a,r);if(f)return le(f,o);for(var h=a.nextSibling,d=s?s.nodeValue.length-r:0;h;h=h.nextSibling){if(f=n(h,h.firstChild,0))return le(Oo(f.line,f.ch-d),o);d+=h.textContent.length}for(var p=a.previousSibling,d=r;p;p=p.previousSibling){if(f=n(p,p.firstChild,-1))return le(Oo(f.line,f.ch+d),o);d+=h.textContent.length}}function ue(e,t,r,n,i){function o(e){return function(t){return t.id==e}}function l(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(null!=r)return""==r&&(r=t.textContent.replace(/\u200b/g,"")),void(s+=r);var u,c=t.getAttribute("cm-marker");if(c){var f=e.findMarks(Oo(n,0),Oo(i+1,0),o(+c));return void(f.length&&(u=f[0].find())&&(s+=Yn(e.doc,u.from,u.to).join("\n")))}if("false"==t.getAttribute("contenteditable"))return;for(var h=0;h=0){var l=$(o.from(),i.from()),s=Y(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;t>=n&&--t,e.splice(--n,2,new fe(a?s:l,a?l:s))}}return new ce(e,t)}function de(e,t){return new ce([new fe(e,t||e)],0)}function pe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ge(e,t){if(t.liner?Oo(r,_n(e,r).text.length):ve(t,_n(e,t.line).text.length)}function ve(e,t){var r=e.ch;return null==r||r>t?Oo(e.line,t):0>r?Oo(e.line,0):e}function me(e,t){return t>=e.first&&t=o.ch:u.to>o.ch))){if(n&&(kl(c,"beforeCursorEnter"),c.explicitlyCleared)){if(s.markedSpans){--a;continue}break}if(!c.atomic)continue;var f=c.find(0>l?-1:1);if(0==Do(f,o)&&(f.ch+=l,f.ch<0?f=f.line>e.first?ge(e,Oo(f.line-1)):null:f.ch>s.text.length&&(f=f.linet&&(t=0),t=Math.round(t),n=Math.round(n),s.appendChild(Fi("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px; top: "+t+"px; width: "+(null==r?c-e:r)+"px; height: "+(n-t)+"px"))}function i(t,r,i){function o(r,n){return ct(e,Oo(t,r),"div",f,n)}var s,a,f=_n(l,t),h=f.text.length;return qi(ei(f),r||0,null==i?h:i,function(e,t,l){var f,d,p,g=o(e,"left");if(e==t)f=g,d=p=g.left;else{if(f=o(t-1,"right"),"rtl"==l){var v=g;g=f,f=v}d=g.left,p=f.right}null==r&&0==e&&(d=u),f.top-g.top>3&&(n(d,g.top,null,g.bottom),d=u,g.bottoma.bottom||f.bottom==a.bottom&&f.right>a.right)&&(a=f),u+1>d&&(d=u),n(d,f.top,p-d,f.bottom)}),{start:s,end:a}}var o=e.display,l=e.doc,s=document.createDocumentFragment(),a=Ve(e.display),u=a.left,c=Math.max(o.sizerWidth,je(e)-o.sizer.offsetLeft)-a.right,f=t.from(),h=t.to();if(f.line==h.line)i(f.line,f.ch,h.ch);else{var d=_n(l,f.line),p=_n(l,h.line),g=pn(d)==pn(p),v=i(f.line,f.ch,g?d.text.length+1:null).end,m=i(h.line,g?0:null,h.ch).start;g&&(v.top0?t.blinker=setInterval(function(){t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function ze(e,t){e.doc.mode.startState&&e.doc.frontier=e.display.viewTo)){var r=+new Date+e.options.workTime,n=tl(t.mode,Be(e,t.frontier)),i=[];t.iter(t.frontier,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(t.frontier>=e.display.viewFrom){var l=o.styles,s=Wn(e,o,n,!0);o.styles=s.styles;var a=o.styleClasses,u=s.classes;u?o.styleClasses=u:a&&(o.styleClasses=null);for(var c=!l||l.length!=o.styles.length||a!=u&&(!a||!u||a.bgClass!=u.bgClass||a.textClass!=u.textClass),f=0;!c&&fr?(ze(e,e.options.workDelay),!0):void 0}),i.length&&Mt(e,function(){for(var t=0;tl;--s){if(s<=o.first)return o.first;var a=_n(o,s-1);if(a.stateAfter&&(!r||s<=o.frontier))return s;var u=Dl(a.text,null,e.options.tabSize);(null==i||n>u)&&(i=s-1,n=u)}return i}function Be(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return!0;var o=Re(e,t,r),l=o>n.first&&_n(n,o-1).stateAfter;return l=l?tl(n.mode,l):rl(n.mode),n.iter(o,t,function(r){Dn(e,r.text,l);var s=o==t-1||o%5==0||o>=i.viewFrom&&o2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}function Ye(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;nr)return{map:e.measure.maps[n],cache:e.measure.caches[n],before:!0}}function $e(e,t){t=pn(t);var r=Zn(t),n=e.display.externalMeasured=new Ot(e.doc,t,r);n.lineN=r;var i=n.built=In(e,n);return n.text=i.pre,Bi(e.display.lineMeasure,i.pre),n}function qe(e,t,r,n){return Je(e,Qe(e,t),r,n)}function Ze(e,t){if(t>=e.display.viewFrom&&t=r.lineN&&tt?(i=0,o=1,l="left"):u>t?(i=t-a,o=i+1):(s==e.length-3||t==u&&e[s+3]>t)&&(o=u-a,i=o-1,t>=u&&(l="right")),null!=i){if(n=e[s+2],a==u&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;s&&e[s-2]==e[s-3]&&e[s-1].insertLeft;)n=e[(s-=3)+2],l="left";if("right"==r&&i==u-a)for(;sc;c++){for(;s&&zi(t.line.text.charAt(o.coverStart+s));)--s;for(;o.coverStart+apo&&0==s&&a==o.coverEnd-o.coverStart)i=l.parentNode.getBoundingClientRect();else if(ho&&e.options.lineWrapping){var f=Pl(l,s,a).getClientRects();i=f.length?f["right"==n?f.length-1:0]:zo}else i=Pl(l,s,a).getBoundingClientRect()||zo;if(i.left||i.right||0==s)break;a=s,s-=1,u="right"}ho&&11>po&&(i=rt(e.display.measure,i))}else{s>0&&(u=n="right");var f;i=e.options.lineWrapping&&(f=l.getClientRects()).length>1?f["right"==n?f.length-1:0]:l.getBoundingClientRect()}if(ho&&9>po&&!s&&(!i||!i.left&&!i.right)){var h=l.parentNode.getClientRects()[0];i=h?{left:h.left,right:h.left+mt(e.display),top:h.top,bottom:h.bottom}:zo}for(var d=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(d+p)/2,v=t.view.measure.heights,c=0;cr.from?l(e-1):l(e,n)}n=n||_n(e.doc,t.line),i||(i=Qe(e,n));var a=ei(n),u=t.ch;if(!a)return l(u);var c=oo(a,u),f=s(u,c);return null!=Zl&&(f.other=s(u,Zl)),f}function ht(e,t){var r=0,t=ge(e.doc,t);e.options.lineWrapping||(r=mt(e.display)*t.ch);var n=_n(e.doc,t.line),i=Jn(n)+Ge(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function dt(e,t,r,n){var i=Oo(e,t);return i.xRel=n,r&&(i.outside=!0),i}function pt(e,t,r){var n=e.doc;if(r+=e.display.viewOffset,0>r)return dt(n.first,0,!0,-1);var i=Qn(n,r),o=n.first+n.size-1;if(i>o)return dt(n.first+n.size-1,_n(n,o).text.length,!0,1);0>t&&(t=0);for(var l=_n(n,i);;){var s=gt(e,l,i,t,r),a=hn(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=Zn(l=u.to.line)}}function gt(e,t,r,n,i){function o(n){var i=ft(e,Oo(r,n),"line",t,u);return s=!0,l>i.bottom?i.left-a:lv)return dt(r,d,m,1);for(;;){if(c?d==h||d==so(t,h,1):1>=d-h){for(var y=p>n||v-n>=n-p?h:d,b=n-(y==h?p:v);zi(t.text.charAt(y));)++y;var w=dt(r,y,y==h?g:m,-1>b?-1:b>1?1:0);return w}var x=Math.ceil(f/2),C=h+x;if(c){C=h;for(var S=0;x>S;++S)C=so(t,C,1)}var L=o(C);L>n?(d=C,v=L,(m=s)&&(v+=1e3),f=x):(h=C,p=L,g=s,f-=x)}}function vt(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Io){Io=Fi("pre");for(var t=0;49>t;++t)Io.appendChild(document.createTextNode("x")),Io.appendChild(Fi("br"));Io.appendChild(document.createTextNode("x"))}Bi(e.measure,Io);var r=Io.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),Ri(e.measure),r||1}function mt(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=Fi("span","xxxxxxxxxx"),r=Fi("pre",[t]);Bi(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function yt(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ro},Fo?Fo.ops.push(e.curOp):e.curOp.ownsGroup=Fo={ops:[e.curOp],delayedCallbacks:[]}}function bt(e){var t=e.delayedCallbacks,r=0;do{for(;r=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new k(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function St(e){e.updatedDisplay=e.mustUpdate&&M(e.cm,e.update)}function Lt(e){var t=e.cm,r=t.display;e.updatedDisplay&&O(t),e.barMeasure=p(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=qe(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Ke(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-je(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function kt(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLefto;o=n){var l=new Ot(e.doc,_n(e.doc,o),o);n=o+l.size,i.push(l)}return i}function Ht(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&rt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Wo&&vn(e.doc,t)i.viewFrom?Pt(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)Pt(e);else if(t<=i.viewFrom){var o=zt(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):Pt(e)}else if(r>=i.viewTo){var o=zt(e,t,t,-1);o?(i.view=i.view.slice(0,o.index),i.viewTo=o.lineN):Pt(e)}else{var l=zt(e,t,t,-1),s=zt(e,r,r+n,1);l&&s?(i.view=i.view.slice(0,l.index).concat(Dt(e,l.lineN,s.lineN)).concat(i.view.slice(s.index)),i.viewTo+=n):Pt(e)}var a=i.externalMeasured;a&&(r=i.lineN&&t=n.viewTo)){var o=n.view[Et(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==Ni(l,r)&&l.push(r)}}}function Pt(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Et(e,t){if(t>=e.display.viewTo)return null;if(t-=e.display.viewFrom,0>t)return null;for(var r=e.display.view,n=0;nt)return n}function zt(e,t,r,n){var i,o=Et(e,t),l=e.display.view;if(!Wo||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=0,a=e.display.viewFrom;o>s;s++)a+=l[s].size;if(a!=t){if(n>0){if(o==l.length-1)return null;i=a+l[o].size-t,o++}else i=a-t;t+=i,r+=i}for(;vn(e.doc,r)!=r;){if(o==(0>n?0:l.length-1))return null;r+=n*l[o-(0>n?1:0)].size,o+=n}return{index:o,lineN:r}}function Ft(e,t,r){var n=e.display,i=n.view;0==i.length||t>=n.viewTo||r<=n.viewFrom?(n.view=Dt(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=Dt(e,t,n.viewFrom).concat(n.view):n.viewFromr&&(n.view=n.view.slice(0,Et(e,r)))),n.viewTo=r}function Rt(e){for(var t=e.display.view,r=0,n=0;n400}var i=e.display;Sl(i.scroller,"mousedown",At(e,jt)),ho&&11>po?Sl(i.scroller,"dblclick",At(e,function(t){if(!xi(e,t)){var r=Kt(e,t);if(r&&!qt(e,t)&&!Vt(e.display,t)){wl(t);var n=e.findWordAt(r);we(e.doc,n.anchor,n.head)}}})):Sl(i.scroller,"dblclick",function(t){xi(e,t)||wl(t)}),Ao||Sl(i.scroller,"contextmenu",function(t){pr(e,t)});var o,l={end:0};Sl(i.scroller,"touchstart",function(e){if(!r(e)){clearTimeout(o);var t=+new Date;i.activeTouch={start:t,moved:!1,prev:t-l.end<=300?l:null},1==e.touches.length&&(i.activeTouch.left=e.touches[0].pageX,i.activeTouch.top=e.touches[0].pageY)}}),Sl(i.scroller,"touchmove",function(){i.activeTouch&&(i.activeTouch.moved=!0)}),Sl(i.scroller,"touchend",function(r){var o=i.activeTouch;if(o&&!Vt(i,r)&&null!=o.left&&!o.moved&&new Date-o.start<300){var l,s=e.coordsChar(i.activeTouch,"page");l=!o.prev||n(o,o.prev)?new fe(s,s):!o.prev.prev||n(o,o.prev.prev)?e.findWordAt(s):new fe(Oo(s.line,0),ge(e.doc,Oo(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),wl(r)}t()}),Sl(i.scroller,"touchcancel",t),Sl(i.scroller,"scroll",function(){i.scroller.clientHeight&&(Jt(e,i.scroller.scrollTop),er(e,i.scroller.scrollLeft,!0),kl(e,"scroll",e))}),Sl(i.scroller,"mousewheel",function(t){tr(e,t)}),Sl(i.scroller,"DOMMouseScroll",function(t){tr(e,t)}),Sl(i.wrapper,"scroll",function(){i.wrapper.scrollTop=i.wrapper.scrollLeft=0}),i.dragFunctions={simple:function(t){xi(e,t)||Cl(t)},start:function(t){Qt(e,t)},drop:At(e,Zt)};var s=i.input.getField();Sl(s,"keyup",function(t){ur.call(e,t)}),Sl(s,"keydown",At(e,sr)),Sl(s,"keypress",At(e,cr)),Sl(s,"focus",Ii(hr,e)),Sl(s,"blur",Ii(dr,e))}function Gt(t,r,n){var i=n&&n!=e.Init;if(!r!=!i){var o=t.display.dragFunctions,l=r?Sl:Ll;l(t.display.scroller,"dragstart",o.start),l(t.display.scroller,"dragenter",o.simple),l(t.display.scroller,"dragover",o.simple),l(t.display.scroller,"drop",o.drop)}}function Ut(e){var t=e.display;(t.lastWrapHeight!=t.wrapper.clientHeight||t.lastWrapWidth!=t.wrapper.clientWidth)&&(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}function Vt(e,t){for(var r=mi(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&"true"==r.getAttribute("cm-ignore-events")||r.parentNode==e.sizer&&r!=e.mover)return!0}function Kt(e,t,r,n){var i=e.display;if(!r&&"true"==mi(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=pt(e,o,l);if(n&&1==u.xRel&&(a=_n(e.doc,u.line).text).length==u.ch){var c=Dl(a,a.length,e.options.tabSize)-a.length;u=Oo(u.line,Math.max(0,Math.round((o-Ve(e.display).left)/mt(e.display))-c))}return u}function jt(e){var t=this,r=t.display;if(!(r.activeTouch&&r.input.supportsTouch()||xi(t,e))){if(r.shift=e.shiftKey,Vt(r,e))return void(go||(r.scroller.draggable=!1,setTimeout(function(){r.scroller.draggable=!0},100)));if(!qt(t,e)){var n=Kt(t,e);switch(window.focus(),yi(e)){case 1:n?Xt(t,e,n):mi(e)==r.scroller&&wl(e);break;case 2:go&&(t.state.lastMiddleDown=+new Date),n&&we(t.doc,n),setTimeout(function(){r.input.focus()},20),wl(e);break;case 3:Ao?pr(t,e):fr(t)}}}}function Xt(e,t,r){ho?setTimeout(Ii(q,e),0):e.curOp.focus=Gi();var n,i=+new Date;Eo&&Eo.time>i-400&&0==Do(Eo.pos,r)?n="triple":Po&&Po.time>i-400&&0==Do(Po.pos,r)?(n="double",Eo={time:i,pos:r}):(n="single",Po={time:i,pos:r});var o,l=e.doc.sel,s=Lo?t.metaKey:t.ctrlKey;e.options.dragDrop&&jl&&!Z(e)&&"single"==n&&(o=l.contains(r))>-1&&!l.ranges[o].empty()?_t(e,t,r,s):Yt(e,t,r,n,s)}function _t(e,t,r,n){var i=e.display,o=+new Date,l=At(e,function(s){go&&(i.scroller.draggable=!1),e.state.draggingText=!1,Ll(document,"mouseup",l),Ll(i.scroller,"drop",l),Math.abs(t.clientX-s.clientX)+Math.abs(t.clientY-s.clientY)<10&&(wl(s),!n&&+new Date-200=p;p++){var m=_n(u,p).text,y=Ti(m,a,o);a==d?i.push(new fe(Oo(p,y),Oo(p,y))):m.length>y&&i.push(new fe(Oo(p,y),Oo(p,Ti(m,d,o))))}i.length||i.push(new fe(r,r)),Te(u,he(h.ranges.slice(0,f).concat(i),f),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b=c,w=b.anchor,x=t;if("single"!=n){if("double"==n)var C=e.findWordAt(t);else var C=new fe(Oo(t.line,0),ge(u,Oo(t.line+1,0)));Do(C.anchor,w)>0?(x=C.head,w=$(b.from(),C.anchor)):(x=C.anchor,w=Y(b.to(),C.head))}var i=h.ranges.slice(0);i[f]=new fe(ge(u,w),x),Te(u,he(i,f),Wl)}}function l(t){var r=++y,i=Kt(e,t,!0,"rect"==n);if(i)if(0!=Do(i,v)){e.curOp.focus=Gi(),o(i);var s=w(a,u);(i.line>=s.to||i.linem.bottom?20:0;c&&setTimeout(At(e,function(){y==r&&(a.scroller.scrollTop+=c,l(t))}),50)}}function s(e){y=1/0,wl(e),a.input.focus(),Ll(document,"mousemove",b),Ll(document,"mouseup",x),u.history.lastSelOrigin=null}var a=e.display,u=e.doc;wl(t);var c,f,h=u.sel,d=h.ranges;if(i&&!t.shiftKey?(f=u.sel.contains(r),c=f>-1?d[f]:new fe(r,r)):(c=u.sel.primary(),f=u.sel.primIndex),t.altKey)n="rect",i||(c=new fe(r,r)),r=Kt(e,t,!0,!0),f=-1;else if("double"==n){var p=e.findWordAt(r);c=e.display.shift||u.extend?be(u,c,p.anchor,p.head):p}else if("triple"==n){var g=new fe(Oo(r.line,0),ge(u,Oo(r.line+1,0)));c=e.display.shift||u.extend?be(u,c,g.anchor,g.head):g}else c=be(u,c,r);i?-1==f?(f=d.length,Te(u,he(d.concat([c]),f),{scroll:!1,origin:"*mouse"})):d.length>1&&d[f].empty()&&"single"==n&&!t.shiftKey?(Te(u,he(d.slice(0,f).concat(d.slice(f+1)),0)),h=u.sel):Ce(u,f,c,Wl):(f=0,Te(u,new ce([c],0),Wl),h=u.sel);var v=r,m=a.wrapper.getBoundingClientRect(),y=0,b=At(e,function(e){yi(e)?l(e):s(e)}),x=At(e,s);Sl(document,"mousemove",b),Sl(document,"mouseup",x)}function $t(e,t,r,n,i){try{var o=t.clientX,l=t.clientY}catch(t){return!1}if(o>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&wl(t);var s=e.display,a=s.lineDiv.getBoundingClientRect();if(l>a.bottom||!Si(e,r))return vi(t);l-=a.top-s.viewOffset;for(var u=0;u=o){var f=Qn(e.doc,l),h=e.options.gutters[u];return i(e,r,e,f,h,t),vi(t)}}}function qt(e,t){return $t(e,t,"gutterClick",!0,bi)}function Zt(e){var t=this;if(!xi(t,e)&&!Vt(t.display,e)){wl(e),ho&&(Bo=+new Date);var r=Kt(t,e,!0),n=e.dataTransfer.files;if(r&&!Z(t))if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(e,n){var s=new FileReader;s.onload=At(t,function(){if(o[n]=s.result,++l==i){r=ge(t.doc,r);var e={from:r,to:r,text:Xl(o.join("\n")),origin:"paste"};xr(t.doc,e),ke(t.doc,de(r,Xo(e)))}}),s.readAsText(e)},a=0;i>a;++a)s(n[a],a);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){t.display.input.focus()},20);try{var o=e.dataTransfer.getData("Text");if(o){if(t.state.draggingText&&!(Lo?e.altKey:e.ctrlKey))var u=t.listSelections();if(Me(t.doc,de(r,r)),u)for(var a=0;al.clientWidth||i&&l.scrollHeight>l.clientHeight){if(i&&Lo&&go)e:for(var s=t.target,a=o.view;s!=l;s=s.parentNode)for(var u=0;uc?f=Math.max(0,f+c-50):h=Math.min(e.doc.height,h+c+50),N(e,{top:f,bottom:h})}20>Go&&(null==o.wheelStartX?(o.wheelStartX=l.scrollLeft,o.wheelStartY=l.scrollTop,o.wheelDX=n,o.wheelDY=i,setTimeout(function(){if(null!=o.wheelStartX){var e=l.scrollLeft-o.wheelStartX,t=l.scrollTop-o.wheelStartY,r=t&&o.wheelDY&&t/o.wheelDY||e&&o.wheelDX&&e/o.wheelDX;o.wheelStartX=o.wheelStartY=null,r&&(Uo=(Uo*Go+r)/(Go+1),++Go)}},200)):(o.wheelDX+=n,o.wheelDY+=i))}}function rr(e,t,r){if("string"==typeof t&&(t=nl[t],!t))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{Z(e)&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=Al}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}function nr(e,t,r){for(var n=0;npo&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=or(t,e);yo&&(jo=n?r:null,!n&&88==r&&!Yl&&(Lo?e.metaKey:e.ctrlKey)&&t.replaceSelection("",null,"cut")),18!=r||/\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className)||ar(t)}}function ar(e){function t(e){18!=e.keyCode&&e.altKey||(Ul(r,"CodeMirror-crosshair"),Ll(document,"keyup",t),Ll(document,"mouseover",t))}var r=e.display.lineDiv;Vl(r,"CodeMirror-crosshair"),Sl(document,"keyup",t),Sl(document,"mouseover",t)}function ur(e){16==e.keyCode&&(this.doc.sel.shift=!1),xi(this,e)}function cr(e){var t=this;if(!(Vt(t.display,e)||xi(t,e)||e.ctrlKey&&!e.altKey||Lo&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(yo&&r==jo)return jo=null,void wl(e);if(!yo||e.which&&!(e.which<10)||!or(t,e)){var i=String.fromCharCode(null==n?r:n);lr(t,e,i)||t.display.input.onKeyPress(e)}}}function fr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,dr(e))},100)}function hr(e){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(kl(e,"focus",e),e.state.focused=!0,Vl(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),go&&setTimeout(function(){e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),Ee(e))}function dr(e){e.state.delayingBlurEvent||(e.state.focused&&(kl(e,"blur",e),e.state.focused=!1,Ul(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function pr(e,t){Vt(e.display,t)||gr(e,t)||e.display.input.onContextMenu(t)}function gr(e,t){return Si(e,"gutterContextMenu")?$t(e,t,"gutterContextMenu",!1,kl):!1}function vr(e,t){if(Do(e,t.from)<0)return e;if(Do(e,t.to)<=0)return Xo(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Xo(t).ch-t.to.ch),Oo(r,n)}function mr(e,t){for(var r=[],n=0;n=0;--i)Cr(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text});else Cr(e,t)}}function Cr(e,t){if(1!=t.text.length||""!=t.text[0]||0!=Do(t.from,t.to)){var r=mr(e,t);oi(e,t,r,e.cm?e.cm.curOp.id:0/0),kr(e,t,r,en(e,t));var n=[];jn(e,function(e,r){r||-1!=Ni(n,e.history)||(gi(e.history,t),n.push(e.history)),kr(e,t,null,en(e,t))})}}function Sr(e,t,r){if(!e.cm||!e.cm.state.suppressEdits){for(var n,i=e.history,o=e.sel,l="undo"==t?i.done:i.undone,s="undo"==t?i.undone:i.done,a=0;a=0;--a){var f=n.changes[a];if(f.origin=t,c&&!wr(e,f,!1))return void(l.length=0);u.push(ri(e,f));var h=a?mr(e,f):Ai(l);kr(e,f,h,rn(e,f)),!a&&e.cm&&e.cm.scrollIntoView({from:f.from,to:Xo(f)});var d=[];jn(e,function(e,t){t||-1!=Ni(d,e.history)||(gi(e.history,f),d.push(e.history)),kr(e,f,null,rn(e,f))})}}}}function Lr(e,t){if(0!=t&&(e.first+=t,e.sel=new ce(Wi(e.sel.ranges,function(e){return new fe(Oo(e.anchor.line+t,e.anchor.ch),Oo(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){Ht(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;ne.lastLine())){if(t.from.lineo&&(t={from:t.from,to:Oo(o,_n(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Yn(e,t.from,t.to),r||(r=mr(e,t)),e.cm?Tr(e.cm,t,n):Un(e,t,n),Me(e,r,Nl)}}function Tr(e,t,r){var n=e.doc,i=e.display,l=t.from,s=t.to,a=!1,u=l.line;e.options.lineWrapping||(u=Zn(pn(_n(n,l.line))),n.iter(u,s.line+1,function(e){return e==i.maxLine?(a=!0,!0):void 0})),n.sel.contains(t.from,t.to)>-1&&Ci(e),Un(n,t,r,o(e)),e.options.lineWrapping||(n.iter(u,l.line+t.text.length,function(e){var t=f(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,a=!1)}),a&&(e.curOp.updateMaxLine=!0)),n.frontier=Math.min(n.frontier,l.line),ze(e,400);var c=t.text.length-(s.line-l.line)-1;t.full?Ht(e):l.line!=s.line||1!=t.text.length||Gn(e.doc,t)?Ht(e,l.line,s.line+1,c):It(e,l.line,"text");var h=Si(e,"changes"),d=Si(e,"change");if(d||h){var p={from:l,to:s,text:t.text,removed:t.removed,origin:t.origin};d&&bi(e,"change",e,p),h&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(p)}e.display.selForContextMenu=null}function Mr(e,t,r,n,i){if(n||(n=r),Do(n,r)<0){var o=n;n=r,r=o}"string"==typeof t&&(t=Xl(t)),xr(e,{from:r,to:n,text:t,origin:i})}function Ar(e,t){if(!xi(e,"scrollCursorIntoView")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!xo){var o=Fi("div","​",null,"position: absolute; top: "+(t.top-r.viewOffset-Ge(e.display))+"px; height: "+(t.bottom-t.top+Ke(e)+r.barHeight)+"px; left: "+t.left+"px; width: 2px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}function Nr(e,t,r,n){null==n&&(n=0);for(var i=0;5>i;i++){var o=!1,l=ft(e,t),s=r&&r!=t?ft(e,r):l,a=Or(e,Math.min(l.left,s.left),Math.min(l.top,s.top)-n,Math.max(l.left,s.left),Math.max(l.bottom,s.bottom)+n),u=e.doc.scrollTop,c=e.doc.scrollLeft;if(null!=a.scrollTop&&(Jt(e,a.scrollTop),Math.abs(e.doc.scrollTop-u)>1&&(o=!0)),null!=a.scrollLeft&&(er(e,a.scrollLeft),Math.abs(e.doc.scrollLeft-c)>1&&(o=!0)),!o)break}return l}function Wr(e,t,r,n,i){var o=Or(e,t,r,n,i);null!=o.scrollTop&&Jt(e,o.scrollTop),null!=o.scrollLeft&&er(e,o.scrollLeft)}function Or(e,t,r,n,i){var o=e.display,l=vt(e.display);0>r&&(r=0);var s=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:o.scroller.scrollTop,a=Xe(e),u={};i-r>a&&(i=r+a);var c=e.doc.height+Ue(o),f=l>r,h=i>c-l;if(s>r)u.scrollTop=f?0:r;else if(i>s+a){var d=Math.min(r,(h?c:i)-a);d!=s&&(u.scrollTop=d)}var p=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:o.scroller.scrollLeft,g=je(e)-(e.options.fixedGutter?o.gutters.offsetWidth:0),v=n-t>g;return v&&(n=t+g),10>t?u.scrollLeft=0:p>t?u.scrollLeft=Math.max(0,t-(v?0:10)):n>g+p-3&&(u.scrollLeft=n+(v?0:10)-g),u}function Dr(e,t,r){(null!=t||null!=r)&&Ir(e),null!=t&&(e.curOp.scrollLeft=(null==e.curOp.scrollLeft?e.doc.scrollLeft:e.curOp.scrollLeft)+t),null!=r&&(e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+r)}function Hr(e){Ir(e);var t=e.getCursor(),r=t,n=t;e.options.lineWrapping||(r=t.ch?Oo(t.line,t.ch-1):t,n=Oo(t.line,t.ch+1)),e.curOp.scrollToPos={from:r,to:n,margin:e.options.cursorScrollMargin,isCursor:!0}}function Ir(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var r=ht(e,t.from),n=ht(e,t.to),i=Or(e,Math.min(r.left,n.left),Math.min(r.top,n.top)-t.margin,Math.max(r.right,n.right),Math.max(r.bottom,n.bottom)+t.margin);e.scrollTo(i.scrollLeft,i.scrollTop)}}function Pr(e,t,r,n){var i,o=e.doc;null==r&&(r="add"),"smart"==r&&(o.mode.indent?i=Be(e,t):r="prev");var l=e.options.tabSize,s=_n(o,t),a=Dl(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(n||/\S/.test(s.text)){if("smart"==r&&(u=o.mode.indent(i,s.text.slice(c.length),s.text),u==Al||u>150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?Dl(_n(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var f="",h=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)h+=l,f+=" ";if(u>h&&(f+=Mi(u-h)),f!=c)return Mr(o,f,Oo(t,0),Oo(t,c.length),"+input"),s.stateAfter=null,!0;for(var d=0;d=0;t--)Mr(e.doc,"",n[t].from,n[t].to,"+delete");Hr(e)})}function Fr(e,t,r,n,i){function o(){var t=s+r;return t=e.first+e.size?f=!1:(s=t,c=_n(e,t))}function l(e){var t=(i?so:ao)(c,a,r,!0);if(null==t){if(e||!o())return f=!1;a=i?(0>r?eo:Ji)(c):0>r?c.text.length:0}else a=t;return!0}var s=t.line,a=t.ch,u=r,c=_n(e,s),f=!0;if("char"==n)l();else if("column"==n)l(!0);else if("word"==n||"group"==n)for(var h=null,d="group"==n,p=e.cm&&e.cm.getHelper(t,"wordChars"),g=!0;!(0>r)||l(!g);g=!1){var v=c.text.charAt(a)||"\n",m=Pi(v,p)?"w":d&&"\n"==v?"n":!d||/\s/.test(v)?null:"p";if(!d||g||m||(m="s"),h&&h!=m){0>r&&(r=1,l());break}if(m&&(h=m),r>0&&!l(!g))break}var y=Oe(e,Oo(s,a),u,!0);return f||(y.hitSide=!0),y}function Rr(e,t,r,n){var i,o=e.doc,l=t.left;if("page"==n){var s=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight); - -i=t.top+r*(s-(0>r?1.5:.5)*vt(e.display))}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(;;){var a=pt(e,l,i);if(!a.outside)break;if(0>r?0>=i:i>=o.height){a.hitSide=!0;break}i+=5*r}return a}function Br(t,r,n,i){e.defaults[t]=r,n&&(Yo[t]=i?function(e,t,r){r!=$o&&n(e,t,r)}:n)}function Gr(e){for(var t,r,n,i,o=e.split(/-(?!$)/),e=o[o.length-1],l=0;l0||0==l&&o.clearWhenEmpty!==!1)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=Fi("span",[o.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(dn(e,t.line,t,r,o)||t.line!=r.line&&dn(e,r.line,t,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Wo=!0}o.addToHistory&&oi(e,{from:t,to:r,origin:"markText"},e.sel,0/0);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){u&&o.collapsed&&!u.options.lineWrapping&&pn(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&qn(e,0),Zr(e,new Yr(o,a==t.line?t.ch:null,a==r.line?r.ch:null)),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){yn(e,t)&&qn(t,0)}),o.clearOnEnter&&Sl(o,"beforeCursorEnter",function(){o.clear()}),o.readOnly&&(No=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++ul,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)Ht(u,t.line,r.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var c=t.line;c<=r.line;c++)It(u,c,"text");o.atomic&&Ne(u.doc),bi(u,"markerAdded",u,o)}return o}function Kr(e,t,r,n,i){n=Hi(n),n.shared=!1;var o=[Vr(e,t,r,n,i)],l=o[0],s=n.widgetNode;return jn(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(Vr(e,ge(e,t),ge(e,r),n,i));for(var a=0;a=t:o.to>t);(n||(n=[])).push(new Yr(l,o.from,a?null:o.to))}}return n}function Jr(e,t,r){if(e)for(var n,i=0;i=t:o.to>t);if(s||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var a=null==o.from||(l.inclusiveLeft?o.from<=t:o.from0&&s)for(var f=0;ff;++f)p.push(g);p.push(a)}return p}function tn(e){for(var t=0;t0)){var c=[a,1],f=Do(u.from,s.from),h=Do(u.to,s.to);(0>f||!l.inclusiveLeft&&!f)&&c.push({from:u.from,to:s.from}),(h>0||!l.inclusiveRight&&!h)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-1}}return i}function on(e){var t=e.markedSpans;if(t){for(var r=0;r=0&&0>=f||0>=c&&f>=0)&&(0>=c&&(Do(u.to,r)>0||a.marker.inclusiveRight&&i.inclusiveLeft)||c>=0&&(Do(u.from,n)<0||a.marker.inclusiveLeft&&i.inclusiveRight)))return!0}}}function pn(e){for(var t;t=fn(e);)e=t.find(-1,!0).line;return e}function gn(e){for(var t,r;t=hn(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}function vn(e,t){var r=_n(e,t),n=pn(r);return r==n?t:Zn(n)}function mn(e,t){if(t>e.lastLine())return t;var r,n=_n(e,t);if(!yn(e,n))return t;for(;r=hn(n);)n=r.find(1,!0).line;return Zn(n)+1}function yn(e,t){var r=Wo&&t.markedSpans;if(r)for(var n,i=0;io;o++){i&&(i[0]=e.innerMode(t,n).mode);var l=t.token(r,n);if(r.pos>r.start)return l}throw new Error("Mode "+t.name+" failed to advance stream.")}function An(e,t,r,n){function i(e){return{start:f.start,end:f.pos,string:f.current(),type:o||null,state:e?tl(l.mode,c):c}}var o,l=e.doc,s=l.mode;t=ge(l,t);var a,u=_n(l,t.line),c=Be(e,t.line,r),f=new al(u.text,e.options.tabSize);for(n&&(a=[]);(n||f.pose.options.maxHighlightLength?(s=!1,l&&Dn(e,t,n,f.pos),f.pos=t.length,a=null):a=kn(Mn(r,f,n,h),o),h){var d=h[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;uu;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"cm-overlay "+t),a=r+2;else for(;a>r;r+=2){var o=i[r+1];i[r+1]=(o?o+" ":"")+"cm-overlay "+t}},o)}return{styles:i,classes:o.bgClass||o.textClass?o:null}}function On(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=Wn(e,t,t.stateAfter=Be(e,Zn(t)));t.styles=n.styles,n.classes?t.styleClasses=n.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.frontier&&e.doc.frontier++}return t.styles}function Dn(e,t,r,n){var i=e.doc.mode,o=new al(t,e.options.tabSize);for(o.start=o.pos=n||0,""==t&&Tn(i,r);!o.eol()&&o.pos<=e.options.maxHighlightLength;)Mn(i,o,r),o.start=o.pos}function Hn(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?gl:pl;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function In(e,t){var r=Fi("span",null,null,go?"padding-right: .1px":null),n={pre:Fi("pre",[r]),content:r,col:0,pos:0,cm:e,splitSpaces:(ho||go)&&e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o,l=i?t.rest[i-1]:t.line;n.pos=0,n.addToken=En,Yi(e.display.measure)&&(o=ei(l))&&(n.addToken=Fn(n.addToken,o)),n.map=[];var s=t!=e.display.externalMeasured&&Zn(l);Bn(l,n,On(e,l,s)),l.styleClasses&&(l.styleClasses.bgClass&&(n.bgClass=Vi(l.styleClasses.bgClass,n.bgClass||"")),l.styleClasses.textClass&&(n.textClass=Vi(l.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(_i(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return go&&/\bcm-tab\b/.test(n.content.lastChild.className)&&(n.content.className="cm-tab-wrap-hack"),kl(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=Vi(n.pre.className,n.textClass||"")),n}function Pn(e){var t=Fi("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function En(e,t,r,n,i,o,l){if(t){var s=e.splitSpaces?t.replace(/ {3,}/g,zn):t,a=e.cm.state.specialChars,u=!1;if(a.test(t))for(var c=document.createDocumentFragment(),f=0;;){a.lastIndex=f;var h=a.exec(t),d=h?h.index-f:t.length-f;if(d){var p=document.createTextNode(s.slice(f,f+d));c.appendChild(ho&&9>po?Fi("span",[p]):p),e.map.push(e.pos,e.pos+d,p),e.col+=d,e.pos+=d}if(!h)break;if(f+=d+1," "==h[0]){var g=e.cm.options.tabSize,v=g-e.col%g,p=c.appendChild(Fi("span",Mi(v),"cm-tab"));p.setAttribute("role","presentation"),p.setAttribute("cm-text"," "),e.col+=v}else{var p=e.cm.options.specialCharPlaceholder(h[0]);p.setAttribute("cm-text",h[0]),c.appendChild(ho&&9>po?Fi("span",[p]):p),e.col+=1}e.map.push(e.pos,e.pos+1,p),e.pos++}else{e.col+=t.length;var c=document.createTextNode(s);e.map.push(e.pos,e.pos+t.length,c),ho&&9>po&&(u=!0),e.pos+=t.length}if(r||n||i||u||l){var m=r||"";n&&(m+=n),i&&(m+=i);var y=Fi("span",[c],m,l);return o&&(y.title=o),e.content.appendChild(y)}e.content.appendChild(c)}}function zn(e){for(var t=" ",r=0;ru&&h.from<=u)break}if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function Rn(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t}function Bn(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,f,h,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=f=s="",h=null,m=1/0;for(var y=[],b=0;bp||x.collapsed&&w.to==p&&w.from==p)?(null!=w.to&&w.to!=p&&m>w.to&&(m=w.to,u=""),x.className&&(a+=" "+x.className),x.css&&(s=x.css),x.startStyle&&w.from==p&&(c+=" "+x.startStyle),x.endStyle&&w.to==m&&(u+=" "+x.endStyle),x.title&&!f&&(f=x.title),x.collapsed&&(!h||un(h.marker,x)<0)&&(h=w)):w.from>p&&m>w.from&&(m=w.from)}if(h&&(h.from||0)==p){if(Rn(t,(null==h.to?d+1:h.to)-p,h.marker,null==h.from),null==h.to)return;h.to==p&&(h=!1)}if(!h&&y.length)for(var b=0;b=d)break;for(var C=Math.min(d,m);;){if(v){var S=p+v.length;if(!h){var L=S>C?v.slice(0,C-p):v;t.addToken(t,L,l?l+a:a,c,p+L.length==m?u:"",f,s)}if(S>=C){v=v.slice(C-p),p=C;break}p=S,c=""}v=i.slice(o,o=r[g++]),l=Hn(r[g++],t.cm.options)}}else for(var g=1;gr;++r)o.push(new dl(u[r],i(r),n));return o}var s=t.from,a=t.to,u=t.text,c=_n(e,s.line),f=_n(e,a.line),h=Ai(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Gn(e,t)){var g=l(0,u.length-1);o(f,f.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==f)if(1==u.length)o(c,c.text.slice(0,s.ch)+h+c.text.slice(a.ch),d);else{var g=l(1,u.length-1);g.push(new dl(h+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,g)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+f.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(f,h+f.text.slice(a.ch),d);var g=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,g)}bi(e,"change",e,t)}function Vn(e){this.lines=e,this.parent=null;for(var t=0,r=0;tt||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(o>t){r=i;break}t-=o}return r.lines[t]}function Yn(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function $n(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function qn(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function Zn(e){if(null==e.parent)return null;for(var t=e.parent,r=Ni(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function Qn(e,t){var r=e.first;e:do{for(var n=0;nt){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var n=0;nt)break;t-=s}return r+n}function Jn(e){e=pn(e);for(var t=0,r=e.parent,n=0;n1&&!e.done[e.done.length-2].ranges?(e.done.pop(),Ai(e.done)):void 0}function oi(e,t,r,n){var i=e.history;i.undone.length=0;var o,l=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&e.cm&&i.lastModTime>l-e.cm.options.historyEventDelay||"*"==t.origin.charAt(0)))&&(o=ii(i,i.lastOp==n))){var s=Ai(o.changes);0==Do(t.from,t.to)&&0==Do(t.from,s.to)?s.to=Xo(t):o.changes.push(ri(e,t))}else{var a=Ai(i.done);for(a&&a.ranges||ai(e.sel,i.done),o={changes:[ri(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=l,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,s||kl(e,"historyAdded")}function li(e,t,r,n){var i=t.charAt(0);return"*"==i||"+"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function si(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||li(e,o,Ai(i.done),t))?i.done[i.done.length-1]=t:ai(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&n.clearRedo!==!1&&ni(i.undone)}function ai(e,t){var r=Ai(t);r&&r.ranges&&r.equals(e)||t.push(e)}function ui(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function ci(e){if(!e)return null;for(var t,r=0;r-1&&(Ai(s)[f]=c[f],delete c[f])}}}return i}function di(e,t,r,n){r0}function Li(e){e.prototype.on=function(e,t){Sl(this,e,t)},e.prototype.off=function(e,t){Ll(this,e,t)}}function ki(){this.id=null}function Ti(e,t,r){for(var n=0,i=0;;){var o=e.indexOf(" ",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,i+=r-i%r,n=o+1,i>=t)return n}}function Mi(e){for(;Hl.length<=e;)Hl.push(Ai(Hl)+" ");return Hl[e]}function Ai(e){return e[e.length-1]}function Ni(e,t){for(var r=0;r-1&&zl(e)?!0:t.test(e):zl(e)}function Ei(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function zi(e){return e.charCodeAt(0)>=768&&Fl.test(e)}function Fi(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o0;--t)e.removeChild(e.firstChild);return e}function Bi(e,t){return Ri(e).appendChild(t)}function Gi(){return document.activeElement}function Ui(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}function Vi(e,t){for(var r=e.split(" "),n=0;n2&&!(ho&&8>po))}var r=Bl?Fi("span","​"):Fi("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return r.setAttribute("cm-text",""),r}function Yi(e){if(null!=Gl)return Gl;var t=Bi(e,document.createTextNode("AخA")),r=Pl(t,0,1).getBoundingClientRect();if(!r||r.left==r.right)return!1;var n=Pl(t,1,2).getBoundingClientRect();return Gl=n.right-r.right<3}function $i(e){if(null!=$l)return $l;var t=Bi(e,Fi("span","x")),r=t.getBoundingClientRect(),n=Pl(t,0,1).getBoundingClientRect();return $l=Math.abs(r.left-n.left)>1}function qi(e,t,r,n){if(!e)return n(t,r,"ltr");for(var i=!1,o=0;ot||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr"),i=!0)}i||n(t,r,"ltr")}function Zi(e){return e.level%2?e.to:e.from}function Qi(e){return e.level%2?e.from:e.to}function Ji(e){var t=ei(e);return t?Zi(t[0]):0}function eo(e){var t=ei(e);return t?Qi(Ai(t)):e.text.length}function to(e,t){var r=_n(e.doc,t),n=pn(r);n!=r&&(t=Zn(n));var i=ei(n),o=i?i[0].level%2?eo(n):Ji(n):0;return Oo(t,o)}function ro(e,t){for(var r,n=_n(e.doc,t);r=hn(n);)n=r.find(1,!0).line,t=null;var i=ei(n),o=i?i[0].level%2?Ji(n):eo(n):n.text.length;return Oo(null==t?Zn(n):t,o)}function no(e,t){var r=to(e,t.line),n=_n(e.doc,r.line),i=ei(n);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return Oo(r.line,l?0:o)}return r}function io(e,t,r){var n=e[0].level;return t==n?!0:r==n?!1:r>t}function oo(e,t){Zl=null;for(var r,n=0;nt)return n;if(i.from==t||i.to==t){if(null!=r)return io(e,i.level,e[r].level)?(i.from!=i.to&&(Zl=r),n):(i.from!=i.to&&(Zl=n),r);r=n}}return r}function lo(e,t,r,n){if(!n)return t+r;do t+=r;while(t>0&&zi(e.text.charAt(t)));return t}function so(e,t,r,n){var i=ei(e);if(!i)return ao(e,t,r,n);for(var o=oo(i,t),l=i[o],s=lo(e,t,l.level%2?-r:r,n);;){if(s>l.from&&s0==l.level%2?l.to:l.from);if(l=i[o+=r],!l)return null;s=r>0==l.level%2?lo(e,l.to,-1,n):lo(e,l.from,1,n)}}function ao(e,t,r,n){var i=t+r;if(n)for(;i>0&&zi(e.text.charAt(i));)i+=r;return 0>i||i>e.text.length?null:i}var uo=/gecko\/\d/i.test(navigator.userAgent),co=/MSIE \d/.test(navigator.userAgent),fo=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),ho=co||fo,po=ho&&(co?document.documentMode||6:fo[1]),go=/WebKit\//.test(navigator.userAgent),vo=go&&/Qt\/\d+\.\d+/.test(navigator.userAgent),mo=/Chrome\//.test(navigator.userAgent),yo=/Opera\//.test(navigator.userAgent),bo=/Apple Computer/.test(navigator.vendor),wo=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),xo=/PhantomJS/.test(navigator.userAgent),Co=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),So=Co||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),Lo=Co||/Mac/.test(navigator.platform),ko=/win/i.test(navigator.platform),To=yo&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);To&&(To=Number(To[1])),To&&To>=15&&(yo=!1,go=!0);var Mo=Lo&&(vo||yo&&(null==To||12.11>To)),Ao=uo||ho&&po>=9,No=!1,Wo=!1;g.prototype=Hi({update:function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=e.scrollWidth-e.clientWidth+o+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&e.clientHeight>0&&(0==n&&this.overlayHack(),this.checkedOverlay=!0),{right:r?n:0,bottom:t?n:0}},setScrollLeft:function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e)},setScrollTop:function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e)},overlayHack:function(){var e=Lo&&!wo?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=e;var t=this,r=function(e){mi(e)!=t.vert&&mi(e)!=t.horiz&&At(t.cm,jt)(e)};Sl(this.vert,"mousedown",r),Sl(this.horiz,"mousedown",r)},clear:function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)}},g.prototype),v.prototype=Hi({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},v.prototype),e.scrollbarModel={"native":g,"null":v},k.prototype.signal=function(e,t){Si(e,t)&&this.events.push(arguments)},k.prototype.finish=function(){for(var e=0;e=9&&r.hasSelection&&(r.hasSelection=null),r.poll()}),Sl(o,"paste",function(){if(go&&!n.state.fakedLastChar&&!(new Date-n.state.lastMiddleDown<200)){var e=o.selectionStart,t=o.selectionEnd;o.value+="$",o.selectionEnd=t,o.selectionStart=e,n.state.fakedLastChar=!0}n.state.pasteIncoming=!0,r.fastPoll()}),Sl(o,"cut",t),Sl(o,"copy",t),Sl(e.scroller,"paste",function(t){Vt(e,t)||(n.state.pasteIncoming=!0,r.focus())}),Sl(e.lineSpace,"selectstart",function(t){Vt(e,t)||wl(t)}),Sl(o,"compositionstart",function(){var e=n.getCursor("from");r.composing={start:e,range:n.markText(e,n.getCursor("to"),{className:"CodeMirror-composing"})}}),Sl(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},prepareSelection:function(){var e=this.cm,t=e.display,r=e.doc,n=He(e);if(e.options.moveInputWithCursor){var i=ft(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},showSelection:function(e){var t=this.cm,r=t.display;Bi(r.cursorDiv,e.cursors),Bi(r.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},reset:function(e){if(!this.contextMenuPending){var t,r,n=this.cm,i=n.doc;if(n.somethingSelected()){this.prevInput="";var o=i.sel.primary();t=Yl&&(o.to().line-o.from().line>100||(r=n.getSelection()).length>1e3);var l=t?"-":r||n.getSelection();this.textarea.value=l,n.state.focused&&Il(this.textarea),ho&&po>=9&&(this.hasSelection=l)}else e||(this.prevInput=this.textarea.value="",ho&&po>=9&&(this.hasSelection=null));this.inaccurateSelection=t}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!So||Gi()!=this.textarea))try{this.textarea.focus()}catch(e){}},blur:function(){this.textarea.blur()},resetPosition:function(){ -this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var e=this;e.pollingFast||e.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},fastPoll:function(){function e(){var n=r.poll();n||t?(r.pollingFast=!1,r.slowPoll()):(t=!0,r.polling.set(60,e))}var t=!1,r=this;r.pollingFast=!0,r.polling.set(20,e)},poll:function(){var e=this.cm,t=this.textarea,r=this.prevInput;if(!e.state.focused||_l(t)&&!r||Z(e)||e.options.disableInput||e.state.keySeq)return!1;e.state.pasteIncoming&&e.state.fakedLastChar&&(t.value=t.value.substring(0,t.value.length-1),e.state.fakedLastChar=!1);var n=t.value;if(n==r&&!e.somethingSelected())return!1;if(ho&&po>=9&&this.hasSelection===n||Lo&&/[\uf700-\uf7ff]/.test(n))return e.display.input.reset(),!1;if(e.doc.sel==e.display.selForContextMenu){var i=n.charCodeAt(0);if(8203!=i||r||(r="​"),8666==i)return this.reset(),this.cm.execCommand("undo")}for(var o=0,l=Math.min(r.length,n.length);l>o&&r.charCodeAt(o)==n.charCodeAt(o);)++o;var s=this;return Mt(e,function(){Q(e,n.slice(o),r.length-o,null,s.composing?"*compose":null),n.length>1e3||n.indexOf("\n")>-1?t.value=s.prevInput="":s.prevInput=n,s.composing&&(s.composing.range.clear(),s.composing.range=e.markText(s.composing.start,e.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){ho&&po>=9&&(this.hasSelection=null),this.fastPoll()},onContextMenu:function(e){function t(){if(null!=l.selectionStart){var e=i.somethingSelected(),t="​"+(e?l.value:"");l.value="⇚",l.value=t,n.prevInput=e?"":"​",l.selectionStart=1,l.selectionEnd=t.length,o.selForContextMenu=i.doc.sel}}function r(){if(n.contextMenuPending=!1,n.wrapper.style.position="relative",l.style.cssText=c,ho&&9>po&&o.scrollbars.setScrollTop(o.scroller.scrollTop=a),null!=l.selectionStart){(!ho||ho&&9>po)&&t();var e=0,r=function(){o.selForContextMenu==i.doc.sel&&0==l.selectionStart&&l.selectionEnd>0&&"​"==n.prevInput?At(i,nl.selectAll)(i):e++<10?o.detectingSelectAll=setTimeout(r,500):o.input.reset()};o.detectingSelectAll=setTimeout(r,200)}}var n=this,i=n.cm,o=i.display,l=n.textarea,s=Kt(i,e),a=o.scroller.scrollTop;if(s&&!yo){var u=i.options.resetSelectionOnContextMenu;u&&-1==i.doc.sel.contains(s)&&At(i,Te)(i.doc,de(s),Nl);var c=l.style.cssText;if(n.wrapper.style.position="absolute",l.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(e.clientY-5)+"px; left: "+(e.clientX-5)+"px; z-index: 1000; background: "+(ho?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",go)var f=window.scrollY;if(o.input.focus(),go&&window.scrollTo(null,f),o.input.reset(),i.somethingSelected()||(l.value=n.prevInput=" "),n.contextMenuPending=!0,o.selForContextMenu=i.doc.sel,clearTimeout(o.detectingSelectAll),ho&&po>=9&&t(),Ao){Cl(e);var h=function(){Ll(window,"mouseup",h),setTimeout(r,20)};Sl(window,"mouseup",h)}else setTimeout(r,50)}},setUneditable:Oi,needsContentAttribute:!1},re.prototype),ie.prototype=Hi({init:function(e){function t(e){if(n.somethingSelected())Ho=n.getSelections(),"cut"==e.type&&n.replaceSelection("",null,"cut");else{if(!n.options.lineWiseCopyCut)return;var t=ee(n);Ho=t.text,"cut"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,Nl),n.replaceSelection("",null,"cut")})}if(e.clipboardData&&!Co)e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/plain",Ho.join("\n"));else{var r=ne(),i=r.firstChild;n.display.lineSpace.insertBefore(r,n.display.lineSpace.firstChild),i.value=Ho.join("\n");var o=document.activeElement;Il(i),setTimeout(function(){n.display.lineSpace.removeChild(r),o.focus()},50)}}var r=this,n=r.cm,i=r.div=e.lineDiv;i.contentEditable="true",te(i),Sl(i,"paste",function(e){var t=e.clipboardData&&e.clipboardData.getData("text/plain");t&&(e.preventDefault(),n.replaceSelection(t,null,"paste"))}),Sl(i,"compositionstart",function(e){var t=e.data;if(r.composing={sel:n.doc.sel,data:t,startData:t},t){var i=n.doc.sel.primary(),o=n.getLine(i.head.line),l=o.indexOf(t,Math.max(0,i.head.ch-t.length));l>-1&&l<=i.head.ch&&(r.composing.sel=de(Oo(i.head.line,l),Oo(i.head.line,l+t.length)))}}),Sl(i,"compositionupdate",function(e){r.composing.data=e.data}),Sl(i,"compositionend",function(e){var t=r.composing;t&&(e.data==t.startData||/\u200b/.test(e.data)||(t.data=e.data),setTimeout(function(){t.handled||r.applyComposition(t),r.composing==t&&(r.composing=null)},50))}),Sl(i,"touchstart",function(){r.forceCompositionEnd()}),Sl(i,"input",function(){r.composing||r.pollContent()||Mt(r.cm,function(){Ht(n)})}),Sl(i,"copy",t),Sl(i,"cut",t)},prepareSelection:function(){var e=He(this.cm,!1);return e.focus=this.cm.state.focused,e},showSelection:function(e){e&&this.cm.display.view.length&&(e.focus&&this.showPrimarySelection(),this.showMultipleSelections(e))},showPrimarySelection:function(){var e=window.getSelection(),t=this.cm.doc.sel.primary(),r=se(this.cm,e.anchorNode,e.anchorOffset),n=se(this.cm,e.focusNode,e.focusOffset);if(!r||r.bad||!n||n.bad||0!=Do($(r,n),t.from())||0!=Do(Y(r,n),t.to())){var i=oe(this.cm,t.from()),o=oe(this.cm,t.to());if(i||o){var l=this.cm.display.view,s=e.rangeCount&&e.getRangeAt(0);if(i){if(!o){var a=l[l.length-1].measure,u=a.maps?a.maps[a.maps.length-1]:a.map;o={node:u[u.length-1],offset:u[u.length-2]-u[u.length-3]}}}else i={node:l[0].measure.map[2],offset:0};try{var c=Pl(i.node,i.offset,o.offset,o.node)}catch(f){}c&&(e.removeAllRanges(),e.addRange(c),s&&null==e.anchorNode?e.addRange(s):uo&&this.startGracePeriod()),this.rememberSelection()}}},startGracePeriod:function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){e.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(e){Bi(this.cm.display.cursorDiv,e.cursors),Bi(this.cm.display.selectionDiv,e.selection)},rememberSelection:function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},selectionInEditor:function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return Rl(this.div,t)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))}var t=this;this.selectionInEditor()?this.pollSelection():Mt(this.cm,function(){t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,e)},selectionChanged:function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;this.rememberSelection();var r=se(t,e.anchorNode,e.anchorOffset),n=se(t,e.focusNode,e.focusOffset);r&&n&&Mt(t,function(){Te(t.doc,de(r,n),Nl),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}},pollContent:function(){var e=this.cm,t=e.display,r=e.doc.sel.primary(),n=r.from(),i=r.to();if(n.linet.viewTo-1)return!1;var o;if(n.line==t.viewFrom||0==(o=Et(e,n.line)))var l=Zn(t.view[0].line),s=t.view[0].node;else var l=Zn(t.view[o].line),s=t.view[o-1].node.nextSibling;var a=Et(e,i.line);if(a==t.view.length-1)var u=t.viewTo-1,c=t.view[a].node;else var u=Zn(t.view[a+1].line)-1,c=t.view[a+1].node.previousSibling;for(var f=Xl(ue(e,s,c,l,u)),h=Yn(e.doc,Oo(l,0),Oo(u,_n(e.doc,u).text.length));f.length>1&&h.length>1;)if(Ai(f)==Ai(h))f.pop(),h.pop(),u--;else{if(f[0]!=h[0])break;f.shift(),h.shift(),l++}for(var d=0,p=0,g=f[0],v=h[0],m=Math.min(g.length,v.length);m>d&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=Ai(f),b=Ai(h),w=Math.min(y.length-(1==f.length?d:0),b.length-(1==h.length?d:0));w>p&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;f[f.length-1]=y.slice(0,y.length-p),f[0]=f[0].slice(d);var x=Oo(l,d),C=Oo(u,h.length?Ai(h).length-p:0);return f.length>1||f[0]||Do(x,C)?(Mr(e.doc,f,x,C,"+input"),!0):void 0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(e){e.data&&e.data!=e.startData&&At(this.cm,Q)(this.cm,e.data,0,e.sel)},setUneditable:function(e){e.setAttribute("contenteditable","false")},onKeyPress:function(e){e.preventDefault(),At(this.cm,Q)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0)},onContextMenu:Oi,resetPosition:Oi,needsContentAttribute:!0},ie.prototype),e.inputStyles={textarea:re,contenteditable:ie},ce.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t=0&&Do(e,n.to())<=0)return r}return-1}},fe.prototype={from:function(){return $(this.anchor,this.head)},to:function(){return Y(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Io,Po,Eo,zo={left:0,right:0,top:0,bottom:0},Fo=null,Ro=0,Bo=0,Go=0,Uo=null;ho?Uo=-.53:uo?Uo=15:mo?Uo=-.7:bo&&(Uo=-1/3);var Vo=function(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}};e.wheelEventPixels=function(e){var t=Vo(e);return t.x*=Uo,t.y*=Uo,t};var Ko=new ki,jo=null,Xo=e.changeEnd=function(e){return e.text?Oo(e.from.line+e.text.length-1,Ai(e.text).length+(1==e.text.length?e.from.ch:0)):e.to};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var r=this.options,n=r[e];(r[e]!=t||"mode"==e)&&(r[e]=t,Yo.hasOwnProperty(e)&&At(this,Yo[e])(this,t,n))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Ur(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;rr&&(Pr(this,i.head.line,e,!0),r=i.head.line,n==this.doc.sel.primIndex&&Hr(this));else{var o=i.from(),l=i.to(),s=Math.max(r,o.line);r=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var a=s;r>a;++a)Pr(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&u[n].from().ch>0&&Ce(this.doc,n,new fe(o,u[n].to()),Nl)}}}),getTokenAt:function(e,t){return An(this,e,t)},getLineTokens:function(e,t){return An(this,Oo(e),t,!0)},getTokenTypeAt:function(e){e=ge(this.doc,e);var t,r=On(this,_n(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]s?t:0==s?null:t.slice(0,s-1)},getModeAt:function(t){var r=this.doc.mode;return r.innerMode?e.innerMode(r,this.getTokenAt(t).state).mode:r},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!el.hasOwnProperty(t))return r;var n=el[t],i=this.getModeAt(e);if("string"==typeof i[t])n[i[t]]&&r.push(n[i[t]]);else if(i[t])for(var o=0;oi&&(e=i,n=!0),r=_n(this.doc,e)}else r=e;return at(this,r,{top:0,left:0},t||"page").top+(n?this.doc.height-Jn(r):0)},defaultTextHeight:function(){return vt(this.display)},defaultCharWidth:function(){return mt(this.display)},setGutterMarker:Nt(function(e,t,r){return Er(this.doc,e,"gutter",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&Ei(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Nt(function(e){var t=this,r=t.doc,n=r.first;r.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&(r.gutterMarkers[e]=null,It(t,n,"gutter"),Ei(r.gutterMarkers)&&(r.gutterMarkers=null)),++n})}),lineInfo:function(e){if("number"==typeof e){if(!me(this.doc,e))return null;var t=e;if(e=_n(this.doc,e),!e)return null}else{var t=Zn(e);if(null==t)return null}return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o=this.display;e=ft(this,ge(this.doc,e));var l=e.bottom,s=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),o.sizer.appendChild(t),"over"==n)l=e.top;else if("above"==n||"near"==n){var a=Math.max(o.wrapper.clientHeight,this.doc.height),u=Math.max(o.sizer.clientWidth,o.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>a)&&e.top>t.offsetHeight?l=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=a&&(l=e.bottom),s+t.offsetWidth>u&&(s=u-t.offsetWidth)}t.style.top=l+"px",t.style.left=t.style.right="","right"==i?(s=o.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?s=0:"middle"==i&&(s=(o.sizer.clientWidth-t.offsetWidth)/2),t.style.left=s+"px"),r&&Wr(this,s,l,s+t.offsetWidth,l+t.offsetHeight)},triggerOnKeyDown:Nt(sr),triggerOnKeyPress:Nt(cr),triggerOnKeyUp:ur,execCommand:function(e){return nl.hasOwnProperty(e)?nl[e](this):void 0},triggerElectric:Nt(function(e){J(this,e)}),findPosH:function(e,t,r,n){var i=1;0>t&&(i=-1,t=-t);for(var o=0,l=ge(this.doc,e);t>o&&(l=Fr(this.doc,l,i,r,n),!l.hitSide);++o);return l},moveH:Nt(function(e,t){var r=this;r.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Fr(r.doc,n.head,e,t,r.options.rtlMoveVisually):0>e?n.from():n.to()},Ol)}),deleteH:Nt(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection("",null,"+delete"):zr(this,function(r){var i=Fr(n,r.head,e,t,!1);return 0>e?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;0>t&&(i=-1,t=-t);for(var l=0,s=ge(this.doc,e);t>l;++l){var a=ft(this,s,"div");if(null==o?o=a.left:a.left=o,s=Rr(this,a,i,r),s.hitSide)break}return s},moveV:Nt(function(e,t){var r=this,n=this.doc,i=[],o=!r.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return 0>e?l.from():l.to();var s=ft(r,l.head,"div");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Rr(r,s,e,t);return"page"==t&&l==n.sel.primary()&&Dr(r,null,ct(r,a,"div").top-s.top),a},Ol),i.length)for(var l=0;l0&&s(r.charAt(n-1));)--n;for(;i.5)&&l(this),kl(this,"refresh",this)}),swapDoc:Nt(function(e){var t=this.doc;return t.cm=null,Xn(this,e),ot(this),this.display.input.reset(),this.scrollTo(e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,bi(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Li(e);var _o=e.defaults={},Yo=e.optionHandlers={},$o=e.Init={toString:function(){return"CodeMirror.Init"}};Br("value","",function(e,t){e.setValue(t)},!0),Br("mode",null,function(e,t){e.doc.modeOption=t,r(e)},!0),Br("indentUnit",2,r,!0),Br("indentWithTabs",!1),Br("smartIndent",!0),Br("tabSize",4,function(e){n(e),ot(e),Ht(e)},!0),Br("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(t,r,n){t.state.specialChars=new RegExp(r.source+(r.test(" ")?"":"| "),"g"),n!=e.Init&&t.refresh()}),Br("specialCharPlaceholder",Pn,function(e){e.refresh()},!0),Br("electricChars",!0),Br("inputStyle",So?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Br("rtlMoveVisually",!ko),Br("wholeLineUpdateBefore",!0),Br("theme","default",function(e){s(e),a(e)},!0),Br("keyMap","default",function(t,r,n){var i=Ur(r),o=n!=e.Init&&Ur(n);o&&o.detach&&o.detach(t,i),i.attach&&i.attach(t,o||null)}),Br("extraKeys",null),Br("lineWrapping",!1,i,!0),Br("gutters",[],function(e){d(e.options),a(e)},!0),Br("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?L(e.display)+"px":"0",e.refresh()},!0),Br("coverGutterNextToScrollbar",!1,function(e){y(e)},!0),Br("scrollbarStyle","native",function(e){m(e),y(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Br("lineNumbers",!1,function(e){d(e.options),a(e)},!0),Br("firstLineNumber",1,a,!0),Br("lineNumberFormatter",function(e){return e},a,!0),Br("showCursorWhenSelecting",!1,De,!0),Br("resetSelectionOnContextMenu",!0),Br("lineWiseCopyCut",!0),Br("readOnly",!1,function(e,t){"nocursor"==t?(dr(e),e.display.input.blur(),e.display.disabled=!0):(e.display.disabled=!1,t||e.display.input.reset())}),Br("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Br("dragDrop",!0,Gt),Br("cursorBlinkRate",530),Br("cursorScrollMargin",0),Br("cursorHeight",1,De,!0),Br("singleCursorHeightPerLine",!0,De,!0),Br("workTime",100),Br("workDelay",100),Br("flattenSpans",!0,n,!0),Br("addModeClass",!1,n,!0),Br("pollInterval",100),Br("undoDepth",200,function(e,t){e.doc.history.undoDepth=t}),Br("historyEventDelay",1250),Br("viewportMargin",10,function(e){e.refresh()},!0),Br("maxHighlightLength",1e4,n,!0),Br("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Br("tabindex",null,function(e,t){e.display.input.getField().tabIndex=t||""}),Br("autofocus",null);var qo=e.modes={},Zo=e.mimeModes={};e.defineMode=function(t,r){e.defaults.mode||"null"==t||(e.defaults.mode=t),arguments.length>2&&(r.dependencies=Array.prototype.slice.call(arguments,2)),qo[t]=r},e.defineMIME=function(e,t){Zo[e]=t},e.resolveMode=function(t){if("string"==typeof t&&Zo.hasOwnProperty(t))t=Zo[t];else if(t&&"string"==typeof t.name&&Zo.hasOwnProperty(t.name)){var r=Zo[t.name];"string"==typeof r&&(r={name:r}),t=Di(r,t),t.name=r.name}else if("string"==typeof t&&/^[\w\-]+\/[\w\-]+\+xml$/.test(t))return e.resolveMode("application/xml");return"string"==typeof t?{name:t}:t||{name:"null"}},e.getMode=function(t,r){var r=e.resolveMode(r),n=qo[r.name];if(!n)return e.getMode(t,"text/plain");var i=n(t,r);if(Qo.hasOwnProperty(r.name)){var o=Qo[r.name];for(var l in o)o.hasOwnProperty(l)&&(i.hasOwnProperty(l)&&(i["_"+l]=i[l]),i[l]=o[l])}if(i.name=r.name,r.helperType&&(i.helperType=r.helperType),r.modeProps)for(var l in r.modeProps)i[l]=r.modeProps[l];return i},e.defineMode("null",function(){return{token:function(e){e.skipToEnd()}}}),e.defineMIME("text/plain","null");var Qo=e.modeExtensions={};e.extendMode=function(e,t){var r=Qo.hasOwnProperty(e)?Qo[e]:Qo[e]={};Hi(t,r)},e.defineExtension=function(t,r){e.prototype[t]=r},e.defineDocExtension=function(e,t){ml.prototype[e]=t},e.defineOption=Br;var Jo=[];e.defineInitHook=function(e){Jo.push(e)};var el=e.helpers={};e.registerHelper=function(t,r,n){el.hasOwnProperty(t)||(el[t]=e[t]={_global:[]}),el[t][r]=n},e.registerGlobalHelper=function(t,r,n,i){e.registerHelper(t,r,i),el[t]._global.push({pred:n,val:i})};var tl=e.copyState=function(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r},rl=e.startState=function(e,t,r){return e.startState?e.startState(t,r):!0};e.innerMode=function(e,t){for(;e.innerMode;){var r=e.innerMode(t);if(!r||r.mode==e)break;t=r.state,e=r.mode}return r||{mode:e,state:t}};var nl=e.commands={selectAll:function(e){e.setSelection(Oo(e.firstLine(),0),Oo(e.lastLine()),Nl)},singleSelection:function(e){e.setSelection(e.getCursor("anchor"),e.getCursor("head"),Nl)},killLine:function(e){zr(e,function(t){if(t.empty()){var r=_n(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line0)i=new Oo(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),Oo(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=_n(e.doc,i.line-1).text;l&&e.replaceRange(o.charAt(0)+"\n"+l.charAt(l.length-1),Oo(i.line-1,l.length-1),Oo(i.line,1),"+transpose")}r.push(new fe(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){Mt(e,function(){for(var t=e.listSelections().length,r=0;t>r;r++){var n=e.listSelections()[r];e.replaceRange("\n",n.anchor,n.head,"+input"),e.indentLine(n.from().line+1,null,!0),Hr(e)}})},toggleOverwrite:function(e){e.toggleOverwrite()}},il=e.keyMap={};il.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},il.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},il.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},il.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},il["default"]=Lo?il.macDefault:il.pcDefault,e.normalizeKeyMap=function(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if("..."==n){delete e[r];continue}for(var i=Wi(r.split(" "),Gr),o=0;o=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.post},eatSpace:function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);return t>-1?(this.pos=t,!0):void 0},backUp:function(e){this.pos-=e},column:function(){return this.lastColumnPos0?null:(n&&t!==!1&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e},o=this.string.substr(this.pos,e.length);return i(o)==i(e)?(t!==!1&&(this.pos+=e.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}};var ul=0,cl=e.TextMarker=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++ul};Li(cl),cl.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&yt(e),Si(this,"clear")){var r=this.find();r&&bi(this,"clear",r.from,r.to)}for(var n=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=a,e.display.maxLineLength=u,e.display.maxLineChanged=!0)}null!=n&&e&&this.collapsed&&Ht(e,n,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Ne(e.doc)),e&&bi(e,"markerCleared",e,this),t&&wt(e),this.parent&&this.parent.clear()}},cl.prototype.find=function(e,t){null==e&&"bookmark"==this.type&&(e=1);for(var r,n,i=0;ir;++r){var i=this.lines[r];this.height-=i.height,Ln(i),bi(i,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;ne;++e)if(r(this.lines[e]))return!0}},Kn.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;re){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof Vn))){var s=[];this.collapse(s),this.children=[new Vn(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t=e){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(;i.lines.length>50;){var l=i.lines.splice(i.lines.length-25,25),s=new Vn(l);i.height-=s.height,this.children.splice(n+1,0,s),s.parent=this}this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=e.children.splice(e.children.length-5,5),r=new Kn(t);if(e.parent){e.size-=r.size,e.height-=r.height;var n=Ni(e.parent.children,e);e.parent.children.splice(n+1,0,r)}else{var i=new Kn(e.children);i.parent=e,e.children=[i,r],e=i}r.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;ne){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var vl=0,ml=e.Doc=function(e,t,r){if(!(this instanceof ml))return new ml(e,t,r);null==r&&(r=0),Kn.call(this,[new Vn([new dl("",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=r;var n=Oo(r,0);this.sel=de(n),this.history=new ti(null),this.id=++vl,this.modeOption=t,"string"==typeof e&&(e=Xl(e)),Un(this,{from:n,to:n,text:e}),Te(this,de(n),Nl)};ml.prototype=Di(Kn.prototype,{constructor:ml,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n=0;o--)xr(this,n[o]);s?ke(this,s):this.cm&&Hr(this.cm)}),undo:Wt(function(){Sr(this,"undo")}),redo:Wt(function(){Sr(this,"redo")}),undoSelection:Wt(function(){Sr(this,"undo",!0)}),redoSelection:Wt(function(){Sr(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=ge(this,e),t=ge(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;sa.to||null==a.from&&i!=e.line||i==t.line&&a.from>t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;ne?(t=e,!0):(e-=i,void++r)}),ge(this,Oo(r,t))},indexFromPos:function(e){e=ge(this,e);var t=e.ch;return e.linet&&(t=e.from),null!=e.to&&e.tos||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}},Hl=[""],Il=function(e){e.select()};Co?Il=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:ho&&(Il=function(e){try{e.select()}catch(t){}});var Pl,El=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,zl=e.isWordChar=function(e){return/\w/.test(e)||e>"€"&&(e.toUpperCase()!=e.toLowerCase()||El.test(e))},Fl=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;Pl=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(i){return n}return n.collapse(!0),n.moveEnd("character",r),n.moveStart("character",t),n};var Rl=e.contains=function(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do if(11==t.nodeType&&(t=t.host),t==e)return!0;while(t=t.parentNode)};ho&&11>po&&(Gi=function(){try{return document.activeElement}catch(e){return document.body}});var Bl,Gl,Ul=e.rmClass=function(e,t){var r=e.className,n=Ui(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:"")}},Vl=e.addClass=function(e,t){var r=e.className;Ui(t).test(r)||(e.className+=(r?" ":"")+t)},Kl=!1,jl=function(){if(ho&&9>po)return!1;var e=Fi("div");return"draggable"in e||"dragDrop"in e}(),Xl=e.splitLines=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;n>=t;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},_l=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(t){return!1}}:function(e){try{var t=e.ownerDocument.selection.createRange()}catch(r){}return t&&t.parentElement()==e?0!=t.compareEndPoints("StartToEnd",t):!1},Yl=function(){var e=Fi("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),"function"==typeof e.oncopy)}(),$l=null,ql={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};e.keyNames=ql,function(){for(var e=0;10>e;e++)ql[e+48]=ql[e+96]=String(e);for(var e=65;90>=e;e++)ql[e]=String.fromCharCode(e);for(var e=1;12>=e;e++)ql[e+111]=ql[e+63235]="F"+e}();var Zl,Ql=function(){function e(e){return 247>=e?r.charAt(e):e>=1424&&1524>=e?"R":e>=1536&&1773>=e?n.charAt(e-1536):e>=1774&&2220>=e?"r":e>=8192&&8203>=e?"w":8204==e?"b":"L"}function t(e,t,r){this.level=e,this.from=t,this.to=r}var r="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",n="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",i=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,o=/[stwN]/,l=/[LRr]/,s=/[Lb1n]/,a=/[1n]/,u="L";return function(r){if(!i.test(r))return!1;for(var n,c=r.length,f=[],h=0;c>h;++h)f.push(n=e(r.charCodeAt(h)));for(var h=0,d=u;c>h;++h){var n=f[h];"m"==n?f[h]=d:d=n}for(var h=0,p=u;c>h;++h){var n=f[h];"1"==n&&"r"==p?f[h]="n":l.test(n)&&(p=n,"r"==n&&(f[h]="R"))}for(var h=1,d=f[0];c-1>h;++h){var n=f[h];"+"==n&&"1"==d&&"1"==f[h+1]?f[h]="1":","!=n||d!=f[h+1]||"1"!=d&&"n"!=d||(f[h]=d),d=n}for(var h=0;c>h;++h){var n=f[h];if(","==n)f[h]="N";else if("%"==n){for(var g=h+1;c>g&&"%"==f[g];++g);for(var v=h&&"!"==f[h-1]||c>g&&"1"==f[g]?"1":"N",m=h;g>m;++m)f[m]=v;h=g-1}}for(var h=0,p=u;c>h;++h){var n=f[h];"L"==p&&"1"==n?f[h]="L":l.test(n)&&(p=n)}for(var h=0;c>h;++h)if(o.test(f[h])){for(var g=h+1;c>g&&o.test(f[g]);++g);for(var y="L"==(h?f[h-1]:u),b="L"==(c>g?f[g]:u),v=y||b?"L":"R",m=h;g>m;++m)f[m]=v;h=g-1}for(var w,x=[],h=0;c>h;)if(s.test(f[h])){var C=h;for(++h;c>h&&s.test(f[h]);++h);x.push(new t(0,C,h))}else{var S=h,L=x.length;for(++h;c>h&&"L"!=f[h];++h);for(var m=S;h>m;)if(a.test(f[m])){m>S&&x.splice(L,0,new t(1,S,m));var k=m;for(++m;h>m&&a.test(f[m]);++m);x.splice(L,0,new t(2,k,m)),S=m}else++m;h>S&&x.splice(L,0,new t(1,S,h))}return 1==x[0].level&&(w=r.match(/^\s+/))&&(x[0].from=w[0].length,x.unshift(new t(0,0,w[0].length))),1==Ai(x).level&&(w=r.match(/\s+$/))&&(Ai(x).to-=w[0].length,x.push(new t(0,c-w[0].length,c))),2==x[0].level&&x.unshift(new t(1,x[0].to,x[0].to)),x[0].level!=Ai(x).level&&x.push(new t(x[0].level,c,c)),x}}();return e.version="5.3.0",e}); -},{}],5:[function(require,module,exports){ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e){for(var t={},r=0;r*\/]/.test(r)?o(null,"select-op"):"."==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?o("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(r)?o(null,r):"u"==r&&e.match(/rl(-prefix)?\(/)||"d"==r&&e.match("omain(")||"r"==r&&e.match("egexp(")?(e.backUp(1),t.tokenize=n,o("property","word")):/[\w\\\-]/.test(r)?(e.eatWhile(/[\w\\\-]/),o("property","word")):o(null,null):/[\d.]/.test(e.peek())?(e.eatWhile(/[\w.%]/),o("number","unit")):e.match(/^-[\w\\\-]+/)?(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?o("variable-2","variable-definition"):o("variable-2","variable")):e.match(/^\w+-/)?o("meta","meta"):void 0}function i(e){return function(t,r){for(var a,i=!1;null!=(a=t.next());){if(a==e&&!i){")"==e&&t.backUp(1);break}i=!i&&"\\"==a}return(a==e||!i&&")"!=e)&&(r.tokenize=null),o("string","string")}}function n(e,t){return e.next(),e.match(/\s*[\"\')]/,!1)?t.tokenize=null:t.tokenize=i(")"),o(null,"(")}function l(e,t,r){this.type=e,this.indent=t,this.prev=r}function s(e,t,r){return e.context=new l(r,t.indentation()+b,e.context),r}function c(e){return e.context=e.context.prev,e.context.type}function d(e,t,r){return K[r.context.type](e,t,r)}function u(e,t,r,o){for(var a=o||1;a>0;a--)r.context=r.context.prev;return d(e,t,r)}function p(e){var t=e.current().toLowerCase();h=j.hasOwnProperty(t)?"atom":q.hasOwnProperty(t)?"keyword":"variable"}r.propertyKeywords||(r=e.resolveMode("text/css"));var m,h,b=t.indentUnit,g=r.tokenHooks,f=r.documentTypes||{},w=r.mediaTypes||{},y=r.mediaFeatures||{},k=r.propertyKeywords||{},v=r.nonStandardPropertyKeywords||{},x=r.fontProperties||{},z=r.counterDescriptors||{},q=r.colorKeywords||{},j=r.valueKeywords||{},P=r.allowNested,K={};return K.top=function(e,t,r){if("{"==e)return s(r,t,"block");if("}"==e&&r.context.prev)return c(r);if(/@(media|supports|(-moz-)?document)/.test(e))return s(r,t,"atBlock");if(/@(font-face|counter-style)/.test(e))return r.stateArg=e,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(e))return"keyframes";if(e&&"@"==e.charAt(0))return s(r,t,"at");if("hash"==e)h="builtin";else if("word"==e)h="tag";else{if("variable-definition"==e)return"maybeprop";if("interpolation"==e)return s(r,t,"interpolation");if(":"==e)return"pseudo";if(P&&"("==e)return s(r,t,"parens")}return r.context.type},K.block=function(e,t,r){if("word"==e){var o=t.current().toLowerCase();return k.hasOwnProperty(o)?(h="property","maybeprop"):v.hasOwnProperty(o)?(h="string-2","maybeprop"):P?(h=t.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(h+=" error","maybeprop")}return"meta"==e?"block":P||"hash"!=e&&"qualifier"!=e?K.top(e,t,r):(h="error","block")},K.maybeprop=function(e,t,r){return":"==e?s(r,t,"prop"):d(e,t,r)},K.prop=function(e,t,r){if(";"==e)return c(r);if("{"==e&&P)return s(r,t,"propBlock");if("}"==e||"{"==e)return u(e,t,r);if("("==e)return s(r,t,"parens");if("hash"!=e||/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(t.current())){if("word"==e)p(t);else if("interpolation"==e)return s(r,t,"interpolation")}else h+=" error";return"prop"},K.propBlock=function(e,t,r){return"}"==e?c(r):"word"==e?(h="property","maybeprop"):r.context.type},K.parens=function(e,t,r){return"{"==e||"}"==e?u(e,t,r):")"==e?c(r):"("==e?s(r,t,"parens"):"interpolation"==e?s(r,t,"interpolation"):("word"==e&&p(t),"parens")},K.pseudo=function(e,t,r){return"word"==e?(h="variable-3",r.context.type):d(e,t,r)},K.atBlock=function(e,t,r){if("("==e)return s(r,t,"atBlock_parens");if("}"==e)return u(e,t,r);if("{"==e)return c(r)&&s(r,t,P?"block":"top");if("word"==e){var o=t.current().toLowerCase();h="only"==o||"not"==o||"and"==o||"or"==o?"keyword":f.hasOwnProperty(o)?"tag":w.hasOwnProperty(o)?"attribute":y.hasOwnProperty(o)?"property":k.hasOwnProperty(o)?"property":v.hasOwnProperty(o)?"string-2":j.hasOwnProperty(o)?"atom":"error"}return r.context.type},K.atBlock_parens=function(e,t,r){return")"==e?c(r):"{"==e||"}"==e?u(e,t,r,2):K.atBlock(e,t,r)},K.restricted_atBlock_before=function(e,t,r){return"{"==e?s(r,t,"restricted_atBlock"):"word"==e&&"@counter-style"==r.stateArg?(h="variable","restricted_atBlock_before"):d(e,t,r)},K.restricted_atBlock=function(e,t,r){return"}"==e?(r.stateArg=null,c(r)):"word"==e?(h="@font-face"==r.stateArg&&!x.hasOwnProperty(t.current().toLowerCase())||"@counter-style"==r.stateArg&&!z.hasOwnProperty(t.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},K.keyframes=function(e,t,r){return"word"==e?(h="variable","keyframes"):"{"==e?s(r,t,"top"):d(e,t,r)},K.at=function(e,t,r){return";"==e?c(r):"{"==e||"}"==e?u(e,t,r):("word"==e?h="tag":"hash"==e&&(h="builtin"),"at")},K.interpolation=function(e,t,r){return"}"==e?c(r):"{"==e||";"==e?u(e,t,r):("word"==e?h="variable":"variable"!=e&&"("!=e&&")"!=e&&(h="error"),"interpolation")},{startState:function(e){return{tokenize:null,state:"top",stateArg:null,context:new l("top",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||a)(e,t);return r&&"object"==typeof r&&(m=r[1],r=r[0]),h=r,t.state=K[t.state](m,e,t),h},indent:function(e,t){var r=e.context,o=t&&t.charAt(0),a=r.indent;return"prop"!=r.type||"}"!=o&&")"!=o||(r=r.prev),!r.prev||("}"!=o||"block"!=r.type&&"top"!=r.type&&"interpolation"!=r.type&&"restricted_atBlock"!=r.type)&&(")"!=o||"parens"!=r.type&&"atBlock_parens"!=r.type)&&("{"!=o||"at"!=r.type&&"atBlock"!=r.type)||(a=r.indent-b,r=r.prev),a},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});var o=["domain","regexp","url","url-prefix"],a=t(o),i=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],n=t(i),l=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"],s=t(l),c=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],d=t(c),u=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],p=t(u),m=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],h=t(m),b=["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"],g=t(b),f=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],w=t(f),y=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small"],k=t(y),v=o.concat(i).concat(l).concat(c).concat(u).concat(f).concat(y);e.registerHelper("hintWords","css",v),e.defineMIME("text/css",{documentTypes:a,mediaTypes:n,mediaFeatures:s,propertyKeywords:d,nonStandardPropertyKeywords:p,fontProperties:h,counterDescriptors:g,colorKeywords:w,valueKeywords:k,tokenHooks:{"/":function(e,t){return e.eat("*")?(t.tokenize=r,r(e,t)):!1}},name:"css"}),e.defineMIME("text/x-scss",{mediaTypes:n,mediaFeatures:s,propertyKeywords:d,nonStandardPropertyKeywords:p,colorKeywords:w,valueKeywords:k,fontProperties:h,allowNested:!0,tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=r,r(e,t)):["operator","operator"]},":":function(e){return e.match(/\s*\{/)?[null,"{"]:!1},$:function(e){return e.match(/^[\w-]+/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(e){return e.eat("{")?[null,"interpolation"]:!1}},name:"css",helperType:"scss"}),e.defineMIME("text/x-less",{mediaTypes:n,mediaFeatures:s,propertyKeywords:d,nonStandardPropertyKeywords:p,colorKeywords:w,valueKeywords:k,fontProperties:h,allowNested:!0,tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=r,r(e,t)):["operator","operator"]},"@":function(e){return e.eat("{")?[null,"interpolation"]:e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/,!1)?!1:(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"})}); -},{"../../lib/codemirror":4}],6:[function(require,module,exports){ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../markdown/markdown"),require("../../addon/mode/overlay")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../markdown/markdown","../../addon/mode/overlay"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("gfm",function(o,n){function r(e){return e.code=!1,null}var t=0,a={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(e){return{code:e.code,codeBlock:e.codeBlock,ateSpace:e.ateSpace}},token:function(e,o){if(o.combineTokens=null,o.codeBlock)return e.match(/^```/)?(o.codeBlock=!1,null):(e.skipToEnd(),null);if(e.sol()&&(o.code=!1),e.sol()&&e.match(/^```/))return e.skipToEnd(),o.codeBlock=!0,null;if("`"===e.peek()){e.next();var n=e.pos;e.eatWhile("`");var r=1+e.pos-n;return o.code?r===t&&(o.code=!1):(t=r,o.code=!0),null}if(o.code)return e.next(),null;if(e.eatSpace())return o.ateSpace=!0,null;if(e.sol()||o.ateSpace){if(o.ateSpace=!1,e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/))return o.combineTokens=!0,"link";if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return o.combineTokens=!0,"link"}return e.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i)&&"]("!=e.string.slice(e.start-2,e.start)?(o.combineTokens=!0,"link"):(e.next(),null)},blankLine:r},c={underscoresBreakWords:!1,taskLists:!0,fencedCodeBlocks:!0,strikethrough:!0};for(var d in n)c[d]=n[d];return c.name="markdown",e.defineMIME("gfmBase",c),e.overlayMode(e.getMode(o,"gfmBase"),a)},"markdown")}); -},{"../../addon/mode/overlay":3,"../../lib/codemirror":4,"../markdown/markdown":9}],7:[function(require,module,exports){ -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],t):t(CodeMirror)}(function(t){"use strict";t.defineMode("htmlmixed",function(e,a){function o(t,e){var a=e.htmlState.tagName;a&&(a=a.toLowerCase());var o=r.token(t,e.htmlState);if("script"==a&&/\btag\b/.test(o)&&">"==t.current()){var l=t.string.slice(Math.max(0,t.pos-100),t.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);l=l?l[1]:"",l&&/[\"\']/.test(l.charAt(0))&&(l=l.slice(1,l.length-1));for(var m=0;m"==t.current()&&(e.token=c,e.localMode=s,e.localState=s.startState(r.indent(e.htmlState,"")));return o}function l(t,e,a){var o=t.current(),l=o.search(e);return l>-1?t.backUp(o.length-l):o.match(/<\/?$/)&&(t.backUp(o.length),t.match(e,!1)||t.match(o)),a}function n(t,e){return t.match(/^<\/\s*script\s*>/i,!1)?(e.token=o,e.localState=e.localMode=null,null):l(t,/<\/\s*script\s*>/,e.localMode.token(t,e.localState))}function c(t,e){return t.match(/^<\/\s*style\s*>/i,!1)?(e.token=o,e.localState=e.localMode=null,null):l(t,/<\/\s*style\s*>/,s.token(t,e.localState))}var r=t.getMode(e,{name:"xml",htmlMode:!0,multilineTagIndentFactor:a.multilineTagIndentFactor,multilineTagIndentPastTag:a.multilineTagIndentPastTag}),s=t.getMode(e,"css"),i=[],m=a&&a.scriptTypes;if(i.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:t.getMode(e,"javascript")}),m)for(var d=0;d"))return a("=>","operator");if("0"==r&&e.eat(/x/i))return e.eatWhile(/[\da-f]/i),a("number","number");if(/\d/.test(r))return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),a("number","number");if("/"==r)return e.eat("*")?(t.tokenize=c,c(e,t)):e.eat("/")?(e.skipToEnd(),a("comment","comment")):"operator"==t.lastType||"keyword c"==t.lastType||"sof"==t.lastType||/^[\[{}\(,;:]$/.test(t.lastType)?(n(e),e.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),a("regexp","string-2")):(e.eatWhile(Ve),a("operator","operator",e.current()));if("`"==r)return t.tokenize=u,u(e,t);if("#"==r)return e.skipToEnd(),a("error","error");if(Ve.test(r))return e.eatWhile(Ve),a("operator","operator",e.current());if(je.test(r)){e.eatWhile(je);var i=e.current(),l=Me.propertyIsEnumerable(i)&&Me[i];return l&&"."!=t.lastType?a(l.type,l.style,i):a("variable","variable",i)}}function o(e){return function(t,r){var n,o=!1;if(he&&"@"==t.peek()&&t.match(Ee))return r.tokenize=i,a("jsonld-keyword","meta");for(;null!=(n=t.next())&&(n!=e||o);)o=!o&&"\\"==n;return o||(r.tokenize=i),a("string","string")}}function c(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=i;break}n="*"==r}return a("comment","comment")}function u(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=i;break}n=!n&&"\\"==r}return a("quasi","string-2",e.current())}function l(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r=e.string.indexOf("=>",e.start);if(!(0>r)){for(var n=0,a=!1,i=r-1;i>=0;--i){var o=e.string.charAt(i),c=Ie.indexOf(o);if(c>=0&&3>c){if(!n){++i;break}if(0==--n)break}else if(c>=3&&6>c)++n;else if(je.test(o))a=!0;else{if(/["'\/]/.test(o))return;if(a&&!n){++i;break}}}a&&!n&&(t.fatArrowAt=i)}}function s(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function f(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0;for(var n=e.context;n;n=n.prev)for(var r=n.vars;r;r=r.next)if(r.name==t)return!0}function d(e,t,r,n,a){var i=e.cc;for(Te.state=e,Te.stream=a,Te.marked=null,Te.cc=i,Te.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;){var o=i.length?i.pop():ge?w:g;if(o(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return Te.marked?Te.marked:"variable"==r&&f(e,n)?"variable-2":t}}}function p(){for(var e=arguments.length-1;e>=0;e--)Te.cc.push(arguments[e])}function v(){return p.apply(null,arguments),!0}function m(e){function t(t){for(var r=t;r;r=r.next)if(r.name==e)return!0;return!1}var n=Te.state;if(n.context){if(Te.marked="def",t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;r.globalVars&&(n.globalVars={name:e,next:n.globalVars})}}function y(){Te.state.context={prev:Te.state.context,vars:Te.state.localVars},Te.state.localVars=Ae}function k(){Te.state.localVars=Te.state.context.vars,Te.state.context=Te.state.context.prev}function b(e,t){var r=function(){var r=Te.state,n=r.indented;if("stat"==r.lexical.type)n=r.lexical.indented;else for(var a=r.lexical;a&&")"==a.type&&a.align;a=a.prev)n=a.indented;r.lexical=new s(n,Te.stream.column(),e,null,r.lexical,t)};return r.lex=!0,r}function x(){var e=Te.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function h(e){function t(r){return r==e?v():";"==e?p():v(t)}return t}function g(e,t){return"var"==e?v(b("vardef",t.length),F,h(";"),x):"keyword a"==e?v(b("form"),w,g,x):"keyword b"==e?v(b("form"),g,x):"{"==e?v(b("}"),H,x):";"==e?v():"if"==e?("else"==Te.state.lexical.info&&Te.state.cc[Te.state.cc.length-1]==x&&Te.state.cc.pop()(),v(b("form"),w,g,x,Q)):"function"==e?v(ee):"for"==e?v(b("form"),R,g,x):"variable"==e?v(b("stat"),q):"switch"==e?v(b("form"),w,b("}","switch"),h("{"),H,x,x):"case"==e?v(w,h(":")):"default"==e?v(h(":")):"catch"==e?v(b("form"),y,h("("),te,h(")"),g,x,k):"module"==e?v(b("form"),y,oe,k,x):"class"==e?v(b("form"),re,x):"export"==e?v(b("form"),ce,x):"import"==e?v(b("form"),ue,x):p(b("stat"),w,h(";"),x)}function w(e){return M(e,!1)}function j(e){return M(e,!0)}function M(e,t){if(Te.state.fatArrowAt==Te.stream.start){var r=t?$:C;if("("==e)return v(y,b(")"),N(G,")"),x,h("=>"),r,k);if("variable"==e)return p(y,G,h("=>"),r,k)}var n=t?z:I;return ze.hasOwnProperty(e)?v(n):"function"==e?v(ee,n):"keyword c"==e?v(t?E:V):"("==e?v(b(")"),V,ve,h(")"),x,n):"operator"==e||"spread"==e?v(t?j:w):"["==e?v(b("]"),de,x,n):"{"==e?B(P,"}",null,n):"quasi"==e?p(T,n):v()}function V(e){return e.match(/[;\}\)\],]/)?p():p(w)}function E(e){return e.match(/[;\}\)\],]/)?p():p(j)}function I(e,t){return","==e?v(w):z(e,t,!1)}function z(e,t,r){var n=0==r?I:z,a=0==r?w:j;return"=>"==e?v(y,r?$:C,k):"operator"==e?/\+\+|--/.test(t)?v(n):"?"==t?v(w,h(":"),a):v(a):"quasi"==e?p(T,n):";"!=e?"("==e?B(j,")","call",n):"."==e?v(O,n):"["==e?v(b("]"),V,h("]"),x,n):void 0:void 0}function T(e,t){return"quasi"!=e?p():"${"!=t.slice(t.length-2)?v(T):v(w,A)}function A(e){return"}"==e?(Te.marked="string-2",Te.state.tokenize=u,v(T)):void 0}function C(e){return l(Te.stream,Te.state),p("{"==e?g:w)}function $(e){return l(Te.stream,Te.state),p("{"==e?g:j)}function q(e){return":"==e?v(x,g):p(I,h(";"),x)}function O(e){return"variable"==e?(Te.marked="property",v()):void 0}function P(e,t){return"variable"==e||"keyword"==Te.style?(Te.marked="property",v("get"==t||"set"==t?S:W)):"number"==e||"string"==e?(Te.marked=he?"property":Te.style+" property",v(W)):"jsonld-keyword"==e?v(W):"["==e?v(w,h("]"),W):void 0}function S(e){return"variable"!=e?p(W):(Te.marked="property",v(ee))}function W(e){return":"==e?v(j):"("==e?p(ee):void 0}function N(e,t){function r(n){if(","==n){var a=Te.state.lexical;return"call"==a.info&&(a.pos=(a.pos||0)+1),v(e,r)}return n==t?v():v(h(t))}return function(n){return n==t?v():p(e,r)}}function B(e,t,r){for(var n=3;n!?|~^]/,Ee=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,Ie="([{}])",ze={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},Te={state:null,column:null,marked:null,cc:null},Ae={name:"this",next:{name:"arguments"}};return x.lex=!0,{startState:function(e){var t={tokenize:i,lastType:"sof",cc:[],lexical:new s((e||0)-be,0,"block",!1),localVars:r.localVars,context:r.localVars&&{vars:r.localVars},indented:0};return r.globalVars&&"object"==typeof r.globalVars&&(t.globalVars=r.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),l(e,t)),t.tokenize!=c&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==ye?r:(t.lastType="operator"!=ye||"++"!=ke&&"--"!=ke?ye:"incdec",d(t,r,ye,ke,e))},indent:function(t,n){if(t.tokenize==c)return e.Pass;if(t.tokenize!=i)return 0;var a=n&&n.charAt(0),o=t.lexical;if(!/^\s*else\b/.test(n))for(var u=t.cc.length-1;u>=0;--u){var l=t.cc[u];if(l==x)o=o.prev;else if(l!=Q)break}"stat"==o.type&&"}"==a&&(o=o.prev),xe&&")"==o.type&&"stat"==o.prev.type&&(o=o.prev);var s=o.type,f=a==s;return"vardef"==s?o.indented+("operator"==t.lastType||","==t.lastType?o.info+1:0):"form"==s&&"{"==a?o.indented:"form"==s?o.indented+be:"stat"==s?o.indented+(me(t,n)?xe||be:0):"switch"!=o.info||f||0==r.doubleIndentSwitch?o.align?o.column+(f?0:1):o.indented+(f?0:be):o.indented+(/^(?:case|default)\b/.test(n)?be:2*be)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:ge?null:"/*",blockCommentEnd:ge?null:"*/",lineComment:ge?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:ge?"json":"javascript",jsonldMode:he,jsonMode:ge}}),e.registerHelper("wordChars","javascript",/[\w$]/),e.defineMIME("text/javascript","javascript"),e.defineMIME("text/ecmascript","javascript"),e.defineMIME("application/javascript","javascript"),e.defineMIME("application/x-javascript","javascript"),e.defineMIME("application/ecmascript","javascript"),e.defineMIME("application/json",{name:"javascript",json:!0}),e.defineMIME("application/x-json",{name:"javascript",json:!0}),e.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),e.defineMIME("text/typescript",{name:"javascript",typescript:!0}),e.defineMIME("application/typescript",{name:"javascript",typescript:!0})}); -},{"../../lib/codemirror":4}],9:[function(require,module,exports){ -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../meta")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../meta"],t):t(CodeMirror)}(function(t){"use strict";t.defineMode("markdown",function(e,i){function n(i){if(t.findModeByName){var n=t.findModeByName(i);n&&(i=n.mime||n.mimes[0])}var r=t.getMode(e,i);return"null"==r.name?null:r}function r(t,e,i){return e.f=e.inline=i,i(t,e)}function a(t,e,i){return e.f=e.block=i,i(t,e)}function o(t){return t.linkTitle=!1,t.em=!1,t.strong=!1,t.strikethrough=!1,t.quote=0,L||t.f!=h||(t.f=m,t.block=l),t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.thisLineHasContent=!1,null}function l(t,e){var a=t.sol(),o=e.list!==!1;o&&(e.indentationDiff>=0?(e.indentationDiff<4&&(e.indentation-=e.indentationDiff),e.list=null):e.indentation>0?(e.list=null,e.listDepth=Math.floor(e.indentation/4)):(e.list=!1,e.listDepth=0));var l=null;if(e.indentationDiff>=4)return e.indentation-=4,t.skipToEnd(),M;if(t.eatSpace())return null;if(l=t.match(P))return e.header=Math.min(6,-1!==l[0].indexOf(" ")?l[0].length-1:l[0].length),i.highlightFormatting&&(e.formatting="header"),e.f=e.inline,s(e);if(e.prevLineHasContent&&(l=t.match(z)))return e.header="="==l[0].charAt(0)?1:2,i.highlightFormatting&&(e.formatting="header"),e.f=e.inline,s(e);if(t.eat(">"))return e.indentation++,e.quote=a?1:e.quote+1,i.highlightFormatting&&(e.formatting="quote"),t.eatSpace(),s(e);if("["===t.peek())return r(t,e,p);if(t.match(U,!0))return T;if((!e.prevLineHasContent||o)&&(t.match(R,!1)||t.match(A,!1))){var h=null;return t.match(R,!0)?h="ul":(t.match(A,!0),h="ol"),e.indentation+=4,e.list=!0,e.listDepth++,i.taskLists&&t.match(I,!1)&&(e.taskList=!0),e.f=e.inline,i.highlightFormatting&&(e.formatting=["list","list-"+h]),s(e)}return i.fencedCodeBlocks&&t.match(/^```[ \t]*([\w+#]*)/,!0)?(e.localMode=n(RegExp.$1),e.localMode&&(e.localState=e.localMode.startState()),e.f=e.block=g,i.highlightFormatting&&(e.formatting="code-block"),e.code=!0,s(e)):r(t,e,e.inline)}function h(t,e){var i=F.token(t,e.htmlState);return(L&&null===e.htmlState.tagStart&&!e.htmlState.context||e.md_inside&&t.current().indexOf(">")>-1)&&(e.f=m,e.block=l,e.htmlState=null),i}function g(t,e){return t.sol()&&t.match("```",!1)?(e.localMode=e.localState=null,e.f=e.block=f,null):e.localMode?e.localMode.token(t,e.localState):(t.skipToEnd(),M)}function f(t,e){t.match("```"),e.block=l,e.f=m,i.highlightFormatting&&(e.formatting="code-block"),e.code=!0;var n=s(e);return e.code=!1,n}function s(t){var e=[];if(t.formatting){e.push(y),"string"==typeof t.formatting&&(t.formatting=[t.formatting]);for(var n=0;n=t.quote?y+"-"+t.formatting[n]+"-"+t.quote:"error")}if(t.taskOpen)return e.push("meta"),e.length?e.join(" "):null;if(t.taskClosed)return e.push("property"),e.length?e.join(" "):null;if(t.linkHref)return e.push(O),e.length?e.join(" "):null;if(t.strong&&e.push(E),t.em&&e.push(j),t.strikethrough&&e.push(W),t.linkText&&e.push(N),t.code&&e.push(M),t.header&&(e.push(q),e.push(q+"-"+t.header)),t.quote&&(e.push(w),e.push(!i.maxBlockquoteDepth||i.maxBlockquoteDepth>=t.quote?w+"-"+t.quote:w+"-"+i.maxBlockquoteDepth)),t.list!==!1){var r=(t.listDepth-1)%3;e.push(r?1===r?D:H:C)}return t.trailingSpaceNewLine?e.push("trailing-space-new-line"):t.trailingSpace&&e.push("trailing-space-"+(t.trailingSpace%2?"a":"b")),e.length?e.join(" "):null}function u(t,e){return t.match(G,!0)?s(e):void 0}function m(e,n){var r=n.text(e,n);if("undefined"!=typeof r)return r;if(n.list)return n.list=null,s(n);if(n.taskList){var o="x"!==e.match(I,!0)[1];return o?n.taskOpen=!0:n.taskClosed=!0,i.highlightFormatting&&(n.formatting="task"),n.taskList=!1,s(n)}if(n.taskOpen=!1,n.taskClosed=!1,n.header&&e.match(/^#+$/,!0))return i.highlightFormatting&&(n.formatting="header"),s(n);var l=e.sol(),g=e.next();if("\\"===g&&(e.next(),i.highlightFormatting)){var f=s(n);return f?f+" formatting-escape":"formatting-escape"}if(n.linkTitle){n.linkTitle=!1;var u=g;"("===g&&(u=")"),u=(u+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");var m="^\\s*(?:[^"+u+"\\\\]+|\\\\\\\\|\\\\.)"+u;if(e.match(new RegExp(m),!0))return O}if("`"===g){var k=n.formatting;i.highlightFormatting&&(n.formatting="code");var p=s(n),v=e.pos;e.eatWhile("`");var x=1+e.pos-v;return n.code?x===b?(n.code=!1,p):(n.formatting=k,s(n)):(b=x,n.code=!0,s(n))}if(n.code)return s(n);if("!"===g&&e.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return e.match(/\[[^\]]*\]/),n.inline=n.f=d,B;if("["===g&&e.match(/.*\](\(.*\)| ?\[.*\])/,!1))return n.linkText=!0,i.highlightFormatting&&(n.formatting="link"),s(n);if("]"===g&&n.linkText&&e.match(/\(.*\)| ?\[.*\]/,!1)){i.highlightFormatting&&(n.formatting="link");var f=s(n);return n.linkText=!1,n.inline=n.f=d,f}if("<"===g&&e.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){n.f=n.inline=c,i.highlightFormatting&&(n.formatting="link");var f=s(n);return f?f+=" ":f="",f+_}if("<"===g&&e.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){n.f=n.inline=c,i.highlightFormatting&&(n.formatting="link");var f=s(n);return f?f+=" ":f="",f+$}if("<"===g&&e.match(/^\w/,!1)){if(-1!=e.string.indexOf(">")){var S=e.string.substring(1,e.string.indexOf(">"));/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(S)&&(n.md_inside=!0)}return e.backUp(1),n.htmlState=t.startState(F),a(e,n,h)}if("<"===g&&e.match(/^\/\w*?>/))return n.md_inside=!1,"tag";var L=!1;if(!i.underscoresBreakWords&&"_"===g&&"_"!==e.peek()&&e.match(/(\w)/,!1)){var q=e.pos-2;if(q>=0){var M=e.string.charAt(q);"_"!==M&&M.match(/(\w)/,!1)&&(L=!0)}}if("*"===g||"_"===g&&!L)if(l&&" "===e.peek());else{if(n.strong===g&&e.eat(g)){i.highlightFormatting&&(n.formatting="strong");var p=s(n);return n.strong=!1,p}if(!n.strong&&e.eat(g))return n.strong=g,i.highlightFormatting&&(n.formatting="strong"),s(n);if(n.em===g){i.highlightFormatting&&(n.formatting="em");var p=s(n);return n.em=!1,p}if(!n.em)return n.em=g,i.highlightFormatting&&(n.formatting="em"),s(n)}else if(" "===g&&(e.eat("*")||e.eat("_"))){if(" "===e.peek())return s(n);e.backUp(1)}if(i.strikethrough)if("~"===g&&e.eatWhile(g)){if(n.strikethrough){i.highlightFormatting&&(n.formatting="strikethrough");var p=s(n);return n.strikethrough=!1,p}if(e.match(/^[^\s]/,!1))return n.strikethrough=!0,i.highlightFormatting&&(n.formatting="strikethrough"),s(n)}else if(" "===g&&e.match(/^~~/,!0)){if(" "===e.peek())return s(n);e.backUp(2)}return" "===g&&(e.match(/ +$/,!1)?n.trailingSpace++:n.trailingSpace&&(n.trailingSpaceNewLine=!0)),s(n)}function c(t,e){var n=t.next();if(">"===n){e.f=e.inline=m,i.highlightFormatting&&(e.formatting="link");var r=s(e);return r?r+=" ":r="",r+_}return t.match(/^[^>]+/,!0),_}function d(t,e){if(t.eatSpace())return null;var n=t.next();return"("===n||"["===n?(e.f=e.inline=k("("===n?")":"]"),i.highlightFormatting&&(e.formatting="link-string"),e.linkHref=!0,s(e)):"error"}function k(t){return function(e,n){var r=e.next();if(r===t){n.f=n.inline=m,i.highlightFormatting&&(n.formatting="link-string");var a=s(n);return n.linkHref=!1,a}return e.match(S(t),!0)&&e.backUp(1),n.linkHref=!0,s(n)}}function p(t,e){return t.match(/^[^\]]*\]:/,!1)?(e.f=v,t.next(),i.highlightFormatting&&(e.formatting="link"),e.linkText=!0,s(e)):r(t,e,m)}function v(t,e){if(t.match(/^\]:/,!0)){e.f=e.inline=x,i.highlightFormatting&&(e.formatting="link");var n=s(e);return e.linkText=!1,n}return t.match(/^[^\]]+/,!0),N}function x(t,e){return t.eatSpace()?null:(t.match(/^[^\s]+/,!0),void 0===t.peek()?e.linkTitle=!0:t.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,!0),e.f=e.inline=m,O)}function S(t){return J[t]||(t=(t+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),J[t]=new RegExp("^(?:[^\\\\]|\\\\.)*?("+t+")")),J[t]}var L=t.modes.hasOwnProperty("xml"),F=t.getMode(e,L?{name:"xml",htmlMode:!0}:"text/plain");void 0===i.highlightFormatting&&(i.highlightFormatting=!1),void 0===i.maxBlockquoteDepth&&(i.maxBlockquoteDepth=0),void 0===i.underscoresBreakWords&&(i.underscoresBreakWords=!0),void 0===i.fencedCodeBlocks&&(i.fencedCodeBlocks=!1),void 0===i.taskLists&&(i.taskLists=!1),void 0===i.strikethrough&&(i.strikethrough=!1);var b=0,q="header",M="comment",w="quote",C="variable-2",D="variable-3",H="keyword",T="hr",B="tag",y="formatting",_="link",$="link",N="link",O="string",j="em",E="strong",W="strikethrough",U=/^([*\-=_])(?:\s*\1){2,}\s*$/,R=/^[*\-+]\s+/,A=/^[0-9]+\.\s+/,I=/^\[(x| )\](?=\s)/,P=/^#+ ?/,z=/^(?:\={1,}|-{1,})$/,G=/^[^#!\[\]*_\\<>` "'(~]+/,J=[],K={startState:function(){return{f:l,prevLineHasContent:!1,thisLineHasContent:!1,block:l,htmlState:null,indentation:0,inline:m,text:u,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,em:!1,strong:!1,header:0,taskList:!1,list:!1,listDepth:0,quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1}},copyState:function(e){return{f:e.f,prevLineHasContent:e.prevLineHasContent,thisLineHasContent:e.thisLineHasContent,block:e.block,htmlState:e.htmlState&&t.copyState(F,e.htmlState),indentation:e.indentation,localMode:e.localMode,localState:e.localMode?t.copyState(e.localMode,e.localState):null,inline:e.inline,text:e.text,formatting:!1,linkTitle:e.linkTitle,em:e.em,strong:e.strong,strikethrough:e.strikethrough,header:e.header,taskList:e.taskList,list:e.list,listDepth:e.listDepth,quote:e.quote,trailingSpace:e.trailingSpace,trailingSpaceNewLine:e.trailingSpaceNewLine,md_inside:e.md_inside}},token:function(t,e){if(e.formatting=!1,t.sol()){var i=!!e.header;if(e.header=0,t.match(/^\s*$/,!0)||i)return e.prevLineHasContent=!1,o(e),i?this.token(t,e):null;e.prevLineHasContent=e.thisLineHasContent,e.thisLineHasContent=!0,e.taskList=!1,e.code=!1,e.trailingSpace=0,e.trailingSpaceNewLine=!1,e.f=e.block;var n=t.match(/^\s*/,!0)[0].replace(/\t/g," ").length,r=4*Math.floor((n-e.indentation)/4);r>4&&(r=4);var a=e.indentation+r;if(e.indentationDiff=a-e.indentation,e.indentation=a,n>0)return null}return e.f(t,e)},innerMode:function(t){return t.block==h?{state:t.htmlState,mode:F}:t.localState?{state:t.localState,mode:t.localMode}:{state:t,mode:K}},blankLine:o,getType:s,fold:"markdown"};return K},"xml"),t.defineMIME("text/x-markdown","markdown")}); -},{"../../lib/codemirror":4,"../meta":10,"../xml/xml":11}],10:[function(require,module,exports){ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror")):"function"==typeof define&&define.amd?define(["../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["pgp"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists.txt$/},{name:"CoffeeScript",mime:"text/x-coffeescript",mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Embedded Javascript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history).md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy"]},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Jade",mime:"text/x-jade",mode:"jade",ext:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"Jinja2",mime:"null",mode:"jinja2"},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"kotlin",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps"},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NTriples",mime:"text/n-triples",mode:"ntriples",ext:["nt"]},{name:"Objective C",mime:"text/x-objectivec",mode:"clike",ext:["m","mm"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mime:"application/x-httpd-php",mode:"php",ext:["php","php3","php4","php5","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["py","pyw"]},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mime:"text/x-sh",mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"]},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"MariaDB",mime:"text/x-mariadb",mode:"sql"},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki ",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"YAML",mime:"text/x-yaml",mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]}];for(var m=0;m-1&&m.substring(i+1,m.length);return x?e.findModeByExtension(x):void 0},e.findModeByName=function(m){m=m.toLowerCase();for(var t=0;t")):null:t.match("--")?n(i("comment","-->")):t.match("DOCTYPE",!0,!0)?(t.eatWhile(/[\w\._\-]/),n(l(1))):null:t.eat("?")?(t.eatWhile(/[\w\._\-]/),e.tokenize=i("meta","?>"),"meta"):(z=t.eat("/")?"closeTag":"openTag",e.tokenize=o,"tag bracket");if("&"==r){var a;return a=t.eat("#")?t.eat("x")?t.eatWhile(/[a-fA-F\d]/)&&t.eat(";"):t.eatWhile(/[\d]/)&&t.eat(";"):t.eatWhile(/[\w\.\-:]/)&&t.eat(";"),a?"atom":"error"}return t.eatWhile(/[^&<]/),null}function o(t,e){var n=t.next();if(">"==n||"/"==n&&t.eat(">"))return e.tokenize=r,z=">"==n?"endTag":"selfcloseTag","tag bracket";if("="==n)return z="equals",null;if("<"==n){e.tokenize=r,e.state=f,e.tagName=e.tagStart=null;var o=e.tokenize(t,e);return o?o+" tag error":"tag error"}return/[\'\"]/.test(n)?(e.tokenize=a(n),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function a(t){var e=function(e,n){for(;!e.eol();)if(e.next()==t){n.tokenize=o;break}return"string"};return e.isInAttribute=!0,e}function i(t,e){return function(n,o){for(;!n.eol();){if(n.match(e)){o.tokenize=r;break}n.next()}return t}}function l(t){return function(e,n){for(var o;null!=(o=e.next());){if("<"==o)return n.tokenize=l(t+1),n.tokenize(e,n);if(">"==o){if(1==t){n.tokenize=r;break}return n.tokenize=l(t-1),n.tokenize(e,n)}}return"meta"}}function u(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(T.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}function d(t){t.context&&(t.context=t.context.prev)}function c(t,e){for(var n;;){if(!t.context)return;if(n=t.context.tagName,!T.contextGrabbers.hasOwnProperty(n)||!T.contextGrabbers[n].hasOwnProperty(e))return;d(t)}}function f(t,e,n){return"openTag"==t?(n.tagStart=e.column(),s):"closeTag"==t?m:f}function s(t,e,n){return"word"==t?(n.tagName=e.current(),N="tag",h):(N="error",s)}function m(t,e,n){if("word"==t){var r=e.current();return n.context&&n.context.tagName!=r&&T.implicitlyClosed.hasOwnProperty(n.context.tagName)&&d(n),n.context&&n.context.tagName==r?(N="tag",g):(N="tag error",p)}return N="error",p}function g(t,e,n){return"endTag"!=t?(N="error",g):(d(n),f)}function p(t,e,n){return N="error",g(t,e,n)}function h(t,e,n){if("word"==t)return N="attribute",x;if("endTag"==t||"selfcloseTag"==t){var r=n.tagName,o=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==t||T.autoSelfClosers.hasOwnProperty(r)?c(n,r):(c(n,r),n.context=new u(n,r,o==n.indented)),f}return N="error",h}function x(t,e,n){return"equals"==t?b:(T.allowMissing||(N="error"),h(t,e,n))}function b(t,e,n){return"string"==t?k:"word"==t&&T.allowUnquoted?(N="string",h):(N="error",h(t,e,n))}function k(t,e,n){return"string"==t?k:h(t,e,n)}var w=e.indentUnit,v=n.multilineTagIndentFactor||1,y=n.multilineTagIndentPastTag;null==y&&(y=!0);var z,N,T=n.htmlMode?{autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,caseFold:!1},C=n.alignCDATA;return{startState:function(){return{tokenize:r,state:f,indented:0,tagName:null,tagStart:null,context:null}},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null;z=null;var n=e.tokenize(t,e);return(n||z)&&"comment"!=n&&(N=null,e.state=e.state(z||n,t,e),N&&(n="error"==N?n+" error":N)),n},indent:function(e,n,a){var i=e.context;if(e.tokenize.isInAttribute)return e.tagStart==e.indented?e.stringStartCol+1:e.indented+w;if(i&&i.noIndent)return t.Pass;if(e.tokenize!=o&&e.tokenize!=r)return a?a.match(/^(\s*)/)[0].length:0;if(e.tagName)return y?e.tagStart+e.tagName.length+2:e.tagStart+w*v;if(C&&/$/,blockCommentStart:"",configuration:n.htmlMode?"html":"xml",helperType:n.htmlMode?"html":"xml"}}),t.defineMIME("text/xml","xml"),t.defineMIME("application/xml","xml"),t.mimeModes.hasOwnProperty("text/html")||t.defineMIME("text/html",{name:"xml",htmlMode:!0})}); -},{"../../lib/codemirror":4}],12:[function(require,module,exports){ -(function (global){ -(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||a.defaults,this.rules=u.normal,this.options.gfm&&(this.options.tables?this.rules=u.tables:this.rules=u.gfm)}function t(e,t){if(this.options=t||a.defaults,this.links=e,this.rules=p.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=p.breaks:this.rules=p.gfm:this.options.pedantic&&(this.rules=p.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||a.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function i(e){return e.replace(/&([#\w]+);/g,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?String.fromCharCode("x"===t.charAt(1)?parseInt(t.substring(2),16):+t.substring(1)):""})}function l(e,t){return e=e.source,t=t||"",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(){}function h(e){for(var t,n,r=1;rAn error occured:

"+s(c.message+"",!0)+"
";throw c}}var u={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:o,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:o,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};u.bullet=/(?:[*+-]|\d+\.)/,u.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,u.item=l(u.item,"gm")(/bull/g,u.bullet)(),u.list=l(u.list)(/bull/g,u.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+u.def.source+")")(),u.blockquote=l(u.blockquote)("def",u.def)(),u._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",u.html=l(u.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,u._tag)(),u.paragraph=l(u.paragraph)("hr",u.hr)("heading",u.heading)("lheading",u.lheading)("blockquote",u.blockquote)("tag","<"+u._tag)("def",u.def)(),u.normal=h({},u),u.gfm=h({},u.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/}),u.gfm.paragraph=l(u.paragraph)("(?!","(?!"+u.gfm.fences.source.replace("\\1","\\2")+"|"+u.list.source.replace("\\1","\\3")+"|")(),u.tables=h({},u.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=u,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,p,c,e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},p=0;p ?/gm,""),this.token(i,t,!0),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,p=0;c>p;p++)h=i[p],a=h.length,h=h.replace(/^ *([*+-]|\d+\.) +/,""),~h.indexOf("\n ")&&(a-=h.length,h=this.options.pedantic?h.replace(/^ {1,4}/gm,""):h.replace(new RegExp("^ {1,"+a+"}","gm"),"")),this.options.smartLists&&p!==c-1&&(o=u.bullet.exec(i[p+1])[0],l===o||l.length>1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(h),p!==c-1&&(r="\n"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(h,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:"pre"===i[1]||"script"===i[1]||"style"===i[1],text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},p=0;p])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:o,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:o,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,p.link=l(p.link)("inside",p._inside)("href",p._href)(),p.reflink=l(p.reflink)("inside",p._inside)(),p.normal=h({},p),p.pedantic=h({},p.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),p.gfm=h({},p.normal,{escape:l(p.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(p.text)("]|","~]|")("|","|https?://|")()}),p.breaks=h({},p.gfm,{br:l(p.br)("{2,}","*")(),text:l(p.gfm.text)("{2,}","*")()}),t.rules=p,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=this.mangle(":"===i[1].charAt(6)?i[1].substring(7):i[1]),r=this.mangle("mailto:")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=s(this.smartypants(i[0]));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/--/g,"—").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},t.prototype.mangle=function(e){for(var t,n="",r=e.length,s=0;r>s;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'
'+(n?e:s(e,!0))+"\n
\n":"
"+(n?e:s(e,!0))+"\n
"},n.prototype.blockquote=function(e){return"
\n"+e+"
\n"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return"'+e+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},n.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"\n"},n.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},n.prototype.paragraph=function(e){return"

    "+e+"

    \n"},n.prototype.table=function(e,t){return"\n\n"+e+"\n\n"+t+"\n
    \n"},n.prototype.tablerow=function(e){return"\n"+e+"\n"},n.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+"\n"},n.prototype.strong=function(e){return""+e+""},n.prototype.em=function(e){return""+e+""},n.prototype.codespan=function(e){return""+e+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(e){return""+e+""},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(s){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var l='
    "},n.prototype.image=function(e,t,n){var r=''+n+'":">"},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s,i="",l="";for(n="",e=0;e'),this.preview.append(this.iframe),this.iframe[0].contentWindow.document.open(),this.iframe[0].contentWindow.document.close(),this.preview.container=t.$(this.iframe[0].contentWindow.document).find("body"),"string"==typeof this.options.iframe&&this.preview.container.parent().append('')):this.preview.container=this.preview,t.$win.on("resize load",t.Utils.debounce(function(){i.fit()},200));var r=this.iframe?this.preview.container:i.preview.parent(),n=this.code.find(".CodeMirror-sizer"),l=this.code.find(".CodeMirror-scroll").on("scroll",t.Utils.debounce(function(){if("tab"!=i.htmleditor.attr("data-mode")){var t=n.height()-l.height(),e=r[0].scrollHeight-(i.iframe?i.iframe.height():r.height()),o=e/t,s=l.scrollTop()*o;r.scrollTop(s)}},10));this.htmleditor.on("click",".uk-htmleditor-button-code, .uk-htmleditor-button-preview",function(e){e.preventDefault(),"tab"==i.htmleditor.attr("data-mode")&&(i.htmleditor.find(".uk-htmleditor-button-code, .uk-htmleditor-button-preview").removeClass("uk-active").filter(this).addClass("uk-active"),i.activetab=t.$(this).hasClass("uk-htmleditor-button-code")?"code":"preview",i.htmleditor.attr("data-active-tab",i.activetab),i.editor.refresh())}),this.htmleditor.on("click","a[data-htmleditor-button]",function(){i.code.is(":visible")&&i.trigger("action."+t.$(this).data("htmleditor-button"),[i.editor])}),this.preview.parent().css("height",this.code.height()),this.options.autocomplete&&this.CodeMirror.showHint&&this.CodeMirror.hint&&this.CodeMirror.hint.html&&this.editor.on("inputRead",t.Utils.debounce(function(){var t=i.editor.getDoc(),e=t.getCursor(),o=i.CodeMirror.innerMode(i.editor.getMode(),i.editor.getTokenAt(e).state).mode.name;if("xml"==o){var r=i.editor.getCursor(),n=i.editor.getTokenAt(r);("<"==n.string.charAt(0)||"attribute"==n.type)&&i.CodeMirror.showHint(i.editor,i.CodeMirror.hint.html,{completeSingle:!1})}},100)),this.debouncedRedraw=t.Utils.debounce(function(){i.redraw()},5),this.on("init.uk.component",function(){i.redraw()}),this.element.attr("data-uk-check-display",1).on("display.uk.check",function(t){this.htmleditor.is(":visible")&&this.fit()}.bind(this)),e.push(this)},addButton:function(t,e){this.buttons[t]=e},addButtons:function(e){t.$.extend(this.buttons,e)},replaceInPreview:function(t,e){function i(t){var e=o.getValue().substring(0,t).split("\n");return{line:e.length-1,ch:e[e.length-1].length}}var o=this.editor,r=[],n=o.getValue(),l=-1;return this.currentvalue=this.currentvalue.replace(t,function(){l=n.indexOf(arguments[0],++l);var t={matches:arguments,from:i(l),to:i(l+arguments[0].length),replace:function(e){o.replaceRange(e,t.from,t.to)},inRange:function(e){return e.line===t.from.line&&e.line===t.to.line?e.ch>=t.from.ch&&e.ch=t.from.ch||e.line>t.from.line&&e.line'+t.buttons[i].label+"")}}),this.toolbar.html(e.join("\n"))}},fit:function(){var t=this.options.mode;"split"==t&&this.htmleditor.width()','
    ','
      ','
      ','","
      ","
      ",'
      ','
      ','
      ',"
      ",""].join(""),t.plugin("htmleditor","base",{init:function(e){function i(t,i,o){e.on("action."+t,function(){"html"==e.getCursorMode()&&e["replaceLine"==o?"replaceLine":"replaceSelection"](i)})}e.addButtons({fullscreen:{title:"Fullscreen",label:''},bold:{title:"Bold",label:''},italic:{title:"Italic",label:''},strike:{title:"Strikethrough",label:''},blockquote:{title:"Blockquote",label:''},link:{title:"Link",label:''},image:{title:"Image",label:''},listUl:{title:"Unordered List",label:''},listOl:{title:"Ordered List",label:''}}),i("bold","$1"),i("italic","$1"),i("strike","$1"),i("blockquote","

      $1

      ","replaceLine"),i("link",'$1'),i("image",'$1');var o=function(){if("html"==e.getCursorMode()){for(var t=e.editor,i=t.getDoc().getCursor(!0),o=t.getDoc().getCursor(!1),r=i.line;r"+t.getLine(r)+"",{line:r,ch:0},{line:r,ch:t.getLine(r).length});t.setCursor({line:o.line,ch:t.getLine(o.line).length}),t.focus()}};e.on("action.listUl",function(){o()}),e.on("action.listOl",function(){o()}),e.htmleditor.on("click",'a[data-htmleditor-button="fullscreen"]',function(){e.htmleditor.toggleClass("uk-htmleditor-fullscreen");var i=e.editor.getWrapperElement();if(e.htmleditor.hasClass("uk-htmleditor-fullscreen"))e.editor.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:i.style.width,height:i.style.height},i.style.width="",i.style.height=e.content.height()+"px",document.documentElement.style.overflow="hidden";else{document.documentElement.style.overflow="";var o=e.editor.state.fullScreenRestore;i.style.width=o.width,i.style.height=o.height,window.scrollTo(o.scrollLeft,o.scrollTop)}setTimeout(function(){e.fit(),t.$win.trigger("resize")},50)}),e.addShortcut(["Ctrl-S","Cmd-S"],function(){e.element.trigger("htmleditor-save",[e])}),e.addShortcutAction("bold",["Ctrl-B","Cmd-B"])}}),t.plugin("htmleditor","markdown",{init:function(e){function i(){e.editor.setOption("mode","gfm"),e.htmleditor.find(".uk-htmleditor-button-code a").html(e.options.lblMarkedview)}function o(t,i,o){e.on("action."+t,function(){"markdown"==e.getCursorMode()&&e["replaceLine"==o?"replaceLine":"replaceSelection"](i)})}var r=e.options.marked||marked;r&&(r.setOptions(e.options.markedOptions),e.options.markdown&&i(),o("bold","**$1**"),o("italic","*$1*"),o("strike","~~$1~~"),o("blockquote","> $1","replaceLine"),o("link","[$1](http://)"),o("image","![$1](http://)"),e.on("action.listUl",function(){if("markdown"==e.getCursorMode()){for(var t=e.editor,i=t.getDoc().getCursor(!0),o=t.getDoc().getCursor(!1),r=i.line;r0){var n,l=t.getLine(i.line-1);(n=l.match(/^(\d+)\./))&&(r=Number(n[1])+1)}for(var s=i.line;s0)){var n=String($(i).find("a").attr("href"))+location.hash,t=location.href.lastIndexOf(n);n&&t>-1&&t+n.length===location.href.length&&($(i).addClass("uk-active"),e+=1)}}),$("form").one("submit",function(e){var t=$(this).find("[type=submit]");setTimeout(function(){t.attr("disabled",!0)},1)}),$("a.av-clipboard-copy").on("click",function(e){e.preventDefault(),prompt($(this).data("text"),$(this).data("value"))}),$(".macro-code").click(function(e){$(this).selectText()}),$("a.cancel").on("click",function(e){e.preventDefault(),history.back()}),$(".av-skin").each(function(){var e=$('');e.find("a").attr({"data-uk-tooltip":!0,href:$(this).data("href"),title:"Click to edit "+$(this).data("name")+" skin"}).mouseover(function(){$(this).parents(".av-skin").eq(0).addClass("av-skin-active")}).mouseout(function(){$(this).parents(".av-skin").eq(0).removeClass("av-skin-active")}).html(''),$(this).prepend(e)})}),Antville={},Antville.prefix="Antville_",Antville.encode=function(e){var t=["&","<",">","'"];for(var i in t){var n=t[i],r=new RegExp(n,"g");e=e.replace(r,"&#"+n.charCodeAt()+";")}return e},Antville.decode=function(e){return e.replace(/&/g,"&")},Antville.Referrer=function(e,t,i){this.url=e;var n=new RegExp("https?://(?:www.)?");this.text=String(t).replace(n,"");var r=this.text.lastIndexOf("/");return r===this.text.length-1&&(this.text=this.text.substr(0,r)),this.count=parseInt(i,10),this.compose=function(e,t){e||(e="");var i=new Antville.Query(this.url);return i[t]?e+" "+Antville.encode(i[t]):this.text},this},Antville.Query=function(e){if(void 0==e)var e=location.search.substring(1);else if(e.indexOf("?")>-1)var e=e.split("?")[1];if(""==e)return this;var t=Antville.decode(decodeURIComponent(e)).split("&");for(var i in t){var n=t[i].split("="),r=n[0];if(r){r=r.replace(/\+/g," ");var a=n[1];a&&(a=a.replace(/\+/g," ")),this[r]=a}}return this},Antville.Filter=function(e,t){return this.key=t,null==e?this.items=[]:e instanceof Array?this.items=e:this.items=e.replace(/\r/g,"\n").split("\n"),this.test=function(e){if(!e)return!1;e=e.replace(/&/g,"&");for(var t in this.items){var i=new RegExp(this.items[t],"i");if(i.test(e))return!0}return!1},this}; -},{"jquery":163,"jquery-collagePlus/extras/jquery.collageCaption":160,"jquery-collagePlus/extras/jquery.removeWhitespace":161,"jquery-collagePlus/jquery.collagePlus":162,"js-md5/src/md5":164,"uikit-bower/js/components/form-password":165,"uikit-bower/js/components/tooltip":166,"uikit-bower/js/components/upload":167,"uikit-bower/js/uikit":168}],2:[function(require,module,exports){ -function Buffer(t,e,r){if(!(this instanceof Buffer))return new Buffer(t,e,r);var n,i=typeof t;if("number"===i)n=+t;else if("string"===i)n=Buffer.byteLength(t,e);else{if("object"!==i||null===t)throw new TypeError("must start with number, buffer, array or string");"Buffer"===t.type&&isArray(t.data)&&(t=t.data),n=+t.length}if(n>kMaxLength)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength.toString(16)+" bytes");0>n?n=0:n>>>=0;var f=this;Buffer.TYPED_ARRAY_SUPPORT?f=Buffer._augment(new Uint8Array(n)):(f.length=n,f._isBuffer=!0);var o;if(Buffer.TYPED_ARRAY_SUPPORT&&"number"==typeof t.byteLength)f._set(t);else if(isArrayish(t))if(Buffer.isBuffer(t))for(o=0;n>o;o++)f[o]=t.readUInt8(o);else for(o=0;n>o;o++)f[o]=(t[o]%256+256)%256;else if("string"===i)f.write(t,0,e);else if("number"===i&&!Buffer.TYPED_ARRAY_SUPPORT&&!r)for(o=0;n>o;o++)f[o]=0;return n>0&&n<=Buffer.poolSize&&(f.parent=rootParent),f}function SlowBuffer(t,e,r){if(!(this instanceof SlowBuffer))return new SlowBuffer(t,e,r);var n=new Buffer(t,e,r);return delete n.parent,n}function hexWrite(t,e,r,n){r=Number(r)||0;var i=t.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var f=e.length;if(f%2!==0)throw new Error("Invalid hex string");n>f/2&&(n=f/2);for(var o=0;n>o;o++){var u=parseInt(e.substr(2*o,2),16);if(isNaN(u))throw new Error("Invalid hex string");t[r+o]=u}return o}function utf8Write(t,e,r,n){var i=blitBuffer(utf8ToBytes(e,t.length-r),t,r,n);return i}function asciiWrite(t,e,r,n){var i=blitBuffer(asciiToBytes(e),t,r,n);return i}function binaryWrite(t,e,r,n){return asciiWrite(t,e,r,n)}function base64Write(t,e,r,n){var i=blitBuffer(base64ToBytes(e),t,r,n);return i}function utf16leWrite(t,e,r,n){var i=blitBuffer(utf16leToBytes(e,t.length-r),t,r,n);return i}function base64Slice(t,e,r){return base64.fromByteArray(0===e&&r===t.length?t:t.slice(e,r))}function utf8Slice(t,e,r){var n="",i="";r=Math.min(t.length,r);for(var f=e;r>f;f++)t[f]<=127?(n+=decodeUtf8Char(i)+String.fromCharCode(t[f]),i=""):i+="%"+t[f].toString(16);return n+decodeUtf8Char(i)}function asciiSlice(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;r>i;i++)n+=String.fromCharCode(127&t[i]);return n}function binarySlice(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;r>i;i++)n+=String.fromCharCode(t[i]);return n}function hexSlice(t,e,r){var n=t.length;(!e||0>e)&&(e=0),(!r||0>r||r>n)&&(r=n);for(var i="",f=e;r>f;f++)i+=toHex(t[f]);return i}function utf16leSlice(t,e,r){for(var n=t.slice(e,r),i="",f=0;ft)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function checkInt(t,e,r,n,i,f){if(!Buffer.isBuffer(t))throw new TypeError("buffer must be a Buffer instance");if(e>i||f>e)throw new RangeError("value is out of bounds");if(r+n>t.length)throw new RangeError("index out of range")}function objectWriteUInt16(t,e,r,n){0>e&&(e=65535+e+1);for(var i=0,f=Math.min(t.length-r,2);f>i;i++)t[r+i]=(e&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function objectWriteUInt32(t,e,r,n){0>e&&(e=4294967295+e+1);for(var i=0,f=Math.min(t.length-r,4);f>i;i++)t[r+i]=e>>>8*(n?i:3-i)&255}function checkIEEE754(t,e,r,n,i,f){if(e>i||f>e)throw new RangeError("value is out of bounds");if(r+n>t.length)throw new RangeError("index out of range");if(0>r)throw new RangeError("index out of range")}function writeFloat(t,e,r,n,i){return i||checkIEEE754(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(t,e,r,n,23,4),r+4}function writeDouble(t,e,r,n,i){return i||checkIEEE754(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(t,e,r,n,52,8),r+8}function base64clean(t){if(t=stringtrim(t).replace(INVALID_BASE64_RE,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function stringtrim(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function isArrayish(t){return isArray(t)||Buffer.isBuffer(t)||t&&"object"==typeof t&&"number"==typeof t.length}function toHex(t){return 16>t?"0"+t.toString(16):t.toString(16)}function utf8ToBytes(t,e){e=e||1/0;for(var r,n=t.length,i=null,f=[],o=0;n>o;o++){if(r=t.charCodeAt(o),r>55295&&57344>r){if(!i){if(r>56319){(e-=3)>-1&&f.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&f.push(239,191,189);continue}i=r;continue}if(56320>r){(e-=3)>-1&&f.push(239,191,189),i=r;continue}r=i-55296<<10|r-56320|65536,i=null}else i&&((e-=3)>-1&&f.push(239,191,189),i=null);if(128>r){if((e-=1)<0)break;f.push(r)}else if(2048>r){if((e-=2)<0)break;f.push(r>>6|192,63&r|128)}else if(65536>r){if((e-=3)<0)break;f.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(2097152>r))throw new Error("Invalid code point");if((e-=4)<0)break;f.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return f}function asciiToBytes(t){for(var e=[],r=0;r>8,i=r%256,f.push(i),f.push(n);return f}function base64ToBytes(t){return base64.toByteArray(base64clean(t))}function blitBuffer(t,e,r,n){for(var i=0;n>i&&!(i+r>=e.length||i>=t.length);i++)e[i+r]=t[i];return i}function decodeUtf8Char(t){try{return decodeURIComponent(t)}catch(e){return String.fromCharCode(65533)}}var base64=require("base64-js"),ieee754=require("ieee754"),isArray=require("is-array");exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50,Buffer.poolSize=8192;var kMaxLength=1073741823,rootParent={};Buffer.TYPED_ARRAY_SUPPORT=function(){try{var t=new ArrayBuffer(0),e=new Uint8Array(t);return e.foo=function(){return 42},42===e.foo()&&"function"==typeof e.subarray&&0===new Uint8Array(1).subarray(1,1).byteLength}catch(r){return!1}}(),Buffer.isBuffer=function(t){return!(null==t||!t._isBuffer)},Buffer.compare=function(t,e){if(!Buffer.isBuffer(t)||!Buffer.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,i=0,f=Math.min(r,n);f>i&&t[i]===e[i];i++);return i!==f&&(r=t[i],n=e[i]),n>r?-1:r>n?1:0},Buffer.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"raw":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer.concat=function(t,e){if(!isArray(t))throw new TypeError("Usage: Buffer.concat(list[, length])");if(0===t.length)return new Buffer(0);if(1===t.length)return t[0];var r;if(void 0===e)for(e=0,r=0;r>>1;break;case"utf8":case"utf-8":r=utf8ToBytes(t).length;break;case"base64":r=base64ToBytes(t).length;break;default:r=t.length}return r},Buffer.prototype.length=void 0,Buffer.prototype.parent=void 0,Buffer.prototype.toString=function(t,e,r){var n=!1;if(e>>>=0,r=void 0===r||r===1/0?this.length:r>>>0,t||(t="utf8"),0>e&&(e=0),r>this.length&&(r=this.length),e>=r)return"";for(;;)switch(t){case"hex":return hexSlice(this,e,r);case"utf8":case"utf-8":return utf8Slice(this,e,r);case"ascii":return asciiSlice(this,e,r);case"binary":return binarySlice(this,e,r);case"base64":return base64Slice(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}},Buffer.prototype.equals=function(t){if(!Buffer.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t?!0:0===Buffer.compare(this,t)},Buffer.prototype.inspect=function(){var t="",e=exports.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),""},Buffer.prototype.compare=function(t){if(!Buffer.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t?0:Buffer.compare(this,t)},Buffer.prototype.get=function(t){return console.log(".get() is deprecated. Access using array indexes instead."),this.readUInt8(t)},Buffer.prototype.set=function(t,e){return console.log(".set() is deprecated. Access using array indexes instead."),this.writeUInt8(t,e)},Buffer.prototype.write=function(t,e,r,n){if(isFinite(e))isFinite(r)||(n=r,r=void 0);else{var i=n;n=e,e=r,r=i}if(e=Number(e)||0,0>r||0>e||e>this.length)throw new RangeError("attempt to write outside buffer bounds");var f=this.length-e;r?(r=Number(r),r>f&&(r=f)):r=f,n=String(n||"utf8").toLowerCase();var o;switch(n){case"hex":o=hexWrite(this,t,e,r);break;case"utf8":case"utf-8":o=utf8Write(this,t,e,r);break;case"ascii":o=asciiWrite(this,t,e,r);break;case"binary":o=binaryWrite(this,t,e,r);break;case"base64":o=base64Write(this,t,e,r);break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":o=utf16leWrite(this,t,e,r);break;default:throw new TypeError("Unknown encoding: "+n)}return o},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},Buffer.prototype.slice=function(t,e){var r=this.length;t=~~t,e=void 0===e?r:~~e,0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),t>e&&(e=t);var n;if(Buffer.TYPED_ARRAY_SUPPORT)n=Buffer._augment(this.subarray(t,e));else{var i=e-t;n=new Buffer(i,void 0,!0);for(var f=0;i>f;f++)n[f]=this[f+t]}return n.length&&(n.parent=this.parent||this),n},Buffer.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||checkOffset(t,e,this.length);for(var n=this[t],i=1,f=0;++f>>=0,e>>>=0,r||checkOffset(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},Buffer.prototype.readUInt8=function(t,e){return e||checkOffset(t,1,this.length),this[t]},Buffer.prototype.readUInt16LE=function(t,e){return e||checkOffset(t,2,this.length),this[t]|this[t+1]<<8},Buffer.prototype.readUInt16BE=function(t,e){return e||checkOffset(t,2,this.length),this[t]<<8|this[t+1]},Buffer.prototype.readUInt32LE=function(t,e){return e||checkOffset(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Buffer.prototype.readUInt32BE=function(t,e){return e||checkOffset(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Buffer.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||checkOffset(t,e,this.length);for(var n=this[t],i=1,f=0;++f=i&&(n-=Math.pow(2,8*e)),n},Buffer.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||checkOffset(t,e,this.length);for(var n=e,i=1,f=this[t+--n];n>0&&(i*=256);)f+=this[t+--n]*i;return i*=128,f>=i&&(f-=Math.pow(2,8*e)),f},Buffer.prototype.readInt8=function(t,e){return e||checkOffset(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Buffer.prototype.readInt16LE=function(t,e){e||checkOffset(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function(t,e){e||checkOffset(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function(t,e){return e||checkOffset(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Buffer.prototype.readInt32BE=function(t,e){return e||checkOffset(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Buffer.prototype.readFloatLE=function(t,e){return e||checkOffset(t,4,this.length),ieee754.read(this,t,!0,23,4)},Buffer.prototype.readFloatBE=function(t,e){return e||checkOffset(t,4,this.length),ieee754.read(this,t,!1,23,4)},Buffer.prototype.readDoubleLE=function(t,e){return e||checkOffset(t,8,this.length),ieee754.read(this,t,!0,52,8)},Buffer.prototype.readDoubleBE=function(t,e){return e||checkOffset(t,8,this.length),ieee754.read(this,t,!1,52,8)},Buffer.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||checkInt(this,t,e,r,Math.pow(2,8*r),0);var i=1,f=0;for(this[e]=255&t;++f>>0&255;return e+r},Buffer.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||checkInt(this,t,e,r,Math.pow(2,8*r),0);var i=r-1,f=1;for(this[e+i]=255&t;--i>=0&&(f*=256);)this[e+i]=t/f>>>0&255;return e+r},Buffer.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=t,e+1},Buffer.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t,this[e+1]=t>>>8):objectWriteUInt16(this,t,e,!0),e+2},Buffer.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=t):objectWriteUInt16(this,t,e,!1),e+2},Buffer.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=t):objectWriteUInt32(this,t,e,!0),e+4},Buffer.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t):objectWriteUInt32(this,t,e,!1),e+4},Buffer.prototype.writeIntLE=function(t,e,r,n){t=+t,e>>>=0,n||checkInt(this,t,e,r,Math.pow(2,8*r-1)-1,-Math.pow(2,8*r-1));var i=0,f=1,o=0>t?1:0;for(this[e]=255&t;++i>0)-o&255;return e+r},Buffer.prototype.writeIntBE=function(t,e,r,n){t=+t,e>>>=0,n||checkInt(this,t,e,r,Math.pow(2,8*r-1)-1,-Math.pow(2,8*r-1));var i=r-1,f=1,o=0>t?1:0;for(this[e+i]=255&t;--i>=0&&(f*=256);)this[e+i]=(t/f>>0)-o&255;return e+r},Buffer.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),0>t&&(t=255+t+1),this[e]=t,e+1},Buffer.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t,this[e+1]=t>>>8):objectWriteUInt16(this,t,e,!0),e+2},Buffer.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=t):objectWriteUInt16(this,t,e,!1),e+2},Buffer.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):objectWriteUInt32(this,t,e,!0),e+4},Buffer.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),0>t&&(t=4294967295+t+1),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t):objectWriteUInt32(this,t,e,!1),e+4},Buffer.prototype.writeFloatLE=function(t,e,r){return writeFloat(this,t,e,!0,r)},Buffer.prototype.writeFloatBE=function(t,e,r){return writeFloat(this,t,e,!1,r)},Buffer.prototype.writeDoubleLE=function(t,e,r){return writeDouble(this,t,e,!0,r)},Buffer.prototype.writeDoubleBE=function(t,e,r){return writeDouble(this,t,e,!1,r)},Buffer.prototype.copy=function(t,e,r,n){var i=this;if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===t.length||0===i.length)return 0;if(0>e)throw new RangeError("targetStart out of bounds");if(0>r||r>=i.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-ef||!Buffer.TYPED_ARRAY_SUPPORT)for(var o=0;f>o;o++)t[o+e]=this[o+r];else t._set(this.subarray(r,r+f),e);return f},Buffer.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),e>r)throw new RangeError("end < start");if(r!==e&&0!==this.length){if(0>e||e>=this.length)throw new RangeError("start out of bounds");if(0>r||r>this.length)throw new RangeError("end out of bounds");var n;if("number"==typeof t)for(n=e;r>n;n++)this[n]=t;else{var i=utf8ToBytes(t.toString()),f=i.length;for(n=e;r>n;n++)this[n]=i[n%f]}return this}},Buffer.prototype.toArrayBuffer=function(){if("undefined"!=typeof Uint8Array){if(Buffer.TYPED_ARRAY_SUPPORT)return new Buffer(this).buffer;for(var t=new Uint8Array(this.length),e=0,r=t.length;r>e;e+=1)t[e]=this[e];return t.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser")};var BP=Buffer.prototype;Buffer._augment=function(t){return t.constructor=Buffer,t._isBuffer=!0,t._get=t.get,t._set=t.set,t.get=BP.get,t.set=BP.set,t.write=BP.write,t.toString=BP.toString,t.toLocaleString=BP.toString,t.toJSON=BP.toJSON,t.equals=BP.equals,t.compare=BP.compare,t.copy=BP.copy,t.slice=BP.slice,t.readUIntLE=BP.readUIntLE,t.readUIntBE=BP.readUIntBE,t.readUInt8=BP.readUInt8,t.readUInt16LE=BP.readUInt16LE,t.readUInt16BE=BP.readUInt16BE,t.readUInt32LE=BP.readUInt32LE,t.readUInt32BE=BP.readUInt32BE,t.readIntLE=BP.readIntLE,t.readIntBE=BP.readIntBE,t.readInt8=BP.readInt8,t.readInt16LE=BP.readInt16LE,t.readInt16BE=BP.readInt16BE,t.readInt32LE=BP.readInt32LE,t.readInt32BE=BP.readInt32BE,t.readFloatLE=BP.readFloatLE,t.readFloatBE=BP.readFloatBE,t.readDoubleLE=BP.readDoubleLE,t.readDoubleBE=BP.readDoubleBE,t.writeUInt8=BP.writeUInt8,t.writeUIntLE=BP.writeUIntLE,t.writeUIntBE=BP.writeUIntBE,t.writeUInt16LE=BP.writeUInt16LE,t.writeUInt16BE=BP.writeUInt16BE,t.writeUInt32LE=BP.writeUInt32LE,t.writeUInt32BE=BP.writeUInt32BE,t.writeIntLE=BP.writeIntLE,t.writeIntBE=BP.writeIntBE,t.writeInt8=BP.writeInt8,t.writeInt16LE=BP.writeInt16LE,t.writeInt16BE=BP.writeInt16BE,t.writeInt32LE=BP.writeInt32LE,t.writeInt32BE=BP.writeInt32BE,t.writeFloatLE=BP.writeFloatLE,t.writeFloatBE=BP.writeFloatBE,t.writeDoubleLE=BP.writeDoubleLE,t.writeDoubleBE=BP.writeDoubleBE,t.fill=BP.fill,t.inspect=BP.inspect,t.toArrayBuffer=BP.toArrayBuffer,t};var INVALID_BASE64_RE=/[^+\/0-9A-z\-]/g; -},{"base64-js":3,"ieee754":4,"is-array":5}],3:[function(require,module,exports){ -var lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";!function(t){"use strict";function r(t){var r=t.charCodeAt(0);return r===h||r===u?62:r===c||r===f?63:o>r?-1:o+10>r?r-o+26+26:i+26>r?r-i:A+26>r?r-A+26:void 0}function e(t){function e(t){i[f++]=t}var n,h,c,o,A,i;if(t.length%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=t.length;A="="===t.charAt(u-2)?2:"="===t.charAt(u-1)?1:0,i=new a(3*t.length/4-A),c=A>0?t.length-4:t.length;var f=0;for(n=0,h=0;c>n;n+=4,h+=3)o=r(t.charAt(n))<<18|r(t.charAt(n+1))<<12|r(t.charAt(n+2))<<6|r(t.charAt(n+3)),e((16711680&o)>>16),e((65280&o)>>8),e(255&o);return 2===A?(o=r(t.charAt(n))<<2|r(t.charAt(n+1))>>4,e(255&o)):1===A&&(o=r(t.charAt(n))<<10|r(t.charAt(n+1))<<4|r(t.charAt(n+2))>>2,e(o>>8&255),e(255&o)),i}function n(t){function r(t){return lookup.charAt(t)}function e(t){return r(t>>18&63)+r(t>>12&63)+r(t>>6&63)+r(63&t)}var n,a,h,c=t.length%3,o="";for(n=0,h=t.length-c;h>n;n+=3)a=(t[n]<<16)+(t[n+1]<<8)+t[n+2],o+=e(a);switch(c){case 1:a=t[t.length-1],o+=r(a>>2),o+=r(a<<4&63),o+="==";break;case 2:a=(t[t.length-2]<<8)+t[t.length-1],o+=r(a>>10),o+=r(a>>4&63),o+=r(a<<2&63),o+="="}return o}var a="undefined"!=typeof Uint8Array?Uint8Array:Array,h="+".charCodeAt(0),c="/".charCodeAt(0),o="0".charCodeAt(0),A="a".charCodeAt(0),i="A".charCodeAt(0),u="-".charCodeAt(0),f="_".charCodeAt(0);t.toByteArray=e,t.fromByteArray=n}("undefined"==typeof exports?this.base64js={}:exports); -},{}],4:[function(require,module,exports){ -exports.read=function(o,t,a,r,h){var M,p,w=8*h-r-1,f=(1<>1,i=-7,n=a?h-1:0,s=a?-1:1,N=o[t+n];for(n+=s,M=N&(1<<-i)-1,N>>=-i,i+=w;i>0;M=256*M+o[t+n],n+=s,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+o[t+n],n+=s,i-=8);if(0===M)M=1-e;else{if(M===f)return p?0/0:(N?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(N?-1:1)*p*Math.pow(2,M-r)},exports.write=function(o,t,a,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,s=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,N=r?0:M-1,u=r?1:-1,l=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(w=isNaN(t)?1:0,p=i):(p=Math.floor(Math.log(t)/Math.LN2),t*(f=Math.pow(2,-p))<1&&(p--,f*=2),t+=p+n>=1?s/f:s*Math.pow(2,1-n),t*f>=2&&(p++,f/=2),p+n>=i?(w=0,p=i):p+n>=1?(w=(t*f-1)*Math.pow(2,h),p+=n):(w=t*Math.pow(2,n-1)*Math.pow(2,h),p=0));h>=8;o[a+N]=255&w,N+=u,w/=256,h-=8);for(p=p<0;o[a+N]=255&p,N+=u,p/=256,e-=8);o[a+N-u]|=128*l}; -},{}],5:[function(require,module,exports){ -var isArray=Array.isArray,str=Object.prototype.toString;module.exports=isArray||function(r){return!!r&&"[object Array]"==str.call(r)}; -},{}],6:[function(require,module,exports){ -"use strict";exports.randomBytes=exports.rng=exports.pseudoRandomBytes=exports.prng=require("randombytes"),exports.createHash=exports.Hash=require("create-hash"),exports.createHmac=exports.Hmac=require("create-hmac");var hashes=["sha1","sha224","sha256","sha384","sha512","md5","rmd160"].concat(Object.keys(require("browserify-sign/algos")));exports.getHashes=function(){return hashes};var p=require("pbkdf2-compat");exports.pbkdf2=p.pbkdf2,exports.pbkdf2Sync=p.pbkdf2Sync;var aes=require("browserify-aes");["Cipher","createCipher","Cipheriv","createCipheriv","Decipher","createDecipher","Decipheriv","createDecipheriv","getCiphers","listCiphers"].forEach(function(e){exports[e]=aes[e]});var dh=require("diffie-hellman");["DiffieHellmanGroup","createDiffieHellmanGroup","getDiffieHellman","createDiffieHellman","DiffieHellman"].forEach(function(e){exports[e]=dh[e]}),require("browserify-sign/inject")(module.exports,exports),exports.createECDH=require("create-ecdh");var publicEncrypt=require("public-encrypt");["publicEncrypt","privateEncrypt","publicDecrypt","privateDecrypt"].forEach(function(e){exports[e]=publicEncrypt[e]}),["createCredentials"].forEach(function(e){exports[e]=function(){throw new Error(["sorry, "+e+" is not implemented yet","we accept pull requests","https://github.com/crypto-browserify/crypto-browserify"].join("\n"))}}); -},{"browserify-aes":10,"browserify-sign/algos":25,"browserify-sign/inject":26,"create-ecdh":72,"create-hash":94,"create-hmac":105,"diffie-hellman":106,"pbkdf2-compat":113,"public-encrypt":114,"randombytes":140}],7:[function(require,module,exports){ -(function (Buffer){ -function EVP_BytesToKey(e,f,r){Buffer.isBuffer(e)||(e=new Buffer(e,"binary")),f/=8,r=r||0;for(var i,n,u=0,a=0,t=new Buffer(f),o=new Buffer(r),h=0,B=[];;){if(h++>0&&B.push(i),B.push(e),i=md5(Buffer.concat(B)),B=[],n=0,f>0)for(;;){if(0===f)break;if(n===i.length)break;t[u++]=i[n],f--,n++}if(r>0&&n!==i.length)for(;;){if(0===r)break;if(n===i.length)break;o[a++]=i[n],r--,n++}if(0===f&&0===r)break}for(n=0;nuint_max||0>t?(r=Math.abs(t)%uint_max,0>t?uint_max-r:r):t}function scrub_vec(t){var e,r,i;for(e=r=0,i=t.length;i>=0?i>r:r>i;e=i>=0?++r:--r)t[e]=0;return!1}function Global(){var t;this.SBOX=[],this.INV_SBOX=[],this.SUB_MIX=function(){var e,r;for(r=[],t=e=0;4>e;t=++e)r.push([]);return r}(),this.INV_SUB_MIX=function(){var e,r;for(r=[],t=e=0;4>e;t=++e)r.push([]);return r}(),this.init(),this.RCON=[0,1,2,4,8,16,32,64,128,27,54]}function bufferToArray(t){for(var e=t.length/4,r=new Array(e),i=-1;++it;e=++t)r.push(128>e?e<<1:e<<1^283);return r}(),n=0,_=0,e=h=0;256>h;e=++h)r=_^_<<1^_<<2^_<<3^_<<4,r=r>>>8^255&r^99,this.SBOX[n]=r,this.INV_SBOX[r]=n,u=t[n],o=t[u],S=t[o],i=257*t[r]^16843008*r,this.SUB_MIX[0][n]=i<<24|i>>>8,this.SUB_MIX[1][n]=i<<16|i>>>16,this.SUB_MIX[2][n]=i<<8|i>>>24,this.SUB_MIX[3][n]=i,i=16843009*S^65537*o^257*u^16843008*n,this.INV_SUB_MIX[0][r]=i<<24|i>>>8,this.INV_SUB_MIX[1][r]=i<<16|i>>>16,this.INV_SUB_MIX[2][r]=i<<8|i>>>24,this.INV_SUB_MIX[3][r]=i,0===n?n=_=1:(n=u^t[t[t[S^u]]],_^=t[t[_]]);return!0};var G=new Global;AES.blockSize=16,AES.prototype.blockSize=AES.blockSize,AES.keySize=32,AES.prototype.keySize=AES.keySize,AES.prototype._doReset=function(){var t,e,r,i,n,u,o,S;for(r=this._key,e=r.length,this._nRounds=e+6,n=4*(this._nRounds+1),this._keySchedule=[],i=o=0;n>=0?n>o:o>n;i=n>=0?++o:--o)this._keySchedule[i]=e>i?r[i]:(u=this._keySchedule[i-1],i%e===0?(u=u<<8|u>>>24,u=G.SBOX[u>>>24]<<24|G.SBOX[u>>>16&255]<<16|G.SBOX[u>>>8&255]<<8|G.SBOX[255&u],u^=G.RCON[i/e|0]<<24):e>6&&i%e===4?u=G.SBOX[u>>>24]<<24|G.SBOX[u>>>16&255]<<16|G.SBOX[u>>>8&255]<<8|G.SBOX[255&u]:void 0,this._keySchedule[i-e]^u);for(this._invKeySchedule=[],t=S=0;n>=0?n>S:S>n;t=n>=0?++S:--S)i=n-t,u=this._keySchedule[i-(t%4?0:4)],this._invKeySchedule[t]=4>t||4>=i?u:G.INV_SUB_MIX[0][G.SBOX[u>>>24]]^G.INV_SUB_MIX[1][G.SBOX[u>>>16&255]]^G.INV_SUB_MIX[2][G.SBOX[u>>>8&255]]^G.INV_SUB_MIX[3][G.SBOX[255&u]];return!0},AES.prototype.encryptBlock=function(t){t=bufferToArray(new Buffer(t));var e=this._doCryptBlock(t,this._keySchedule,G.SUB_MIX,G.SBOX),r=new Buffer(16);return r.writeUInt32BE(e[0],0),r.writeUInt32BE(e[1],4),r.writeUInt32BE(e[2],8),r.writeUInt32BE(e[3],12),r},AES.prototype.decryptBlock=function(t){t=bufferToArray(new Buffer(t));var e=[t[3],t[1]];t[1]=e[0],t[3]=e[1];var r=this._doCryptBlock(t,this._invKeySchedule,G.INV_SUB_MIX,G.INV_SBOX),i=new Buffer(16);return i.writeUInt32BE(r[0],0),i.writeUInt32BE(r[3],4),i.writeUInt32BE(r[2],8),i.writeUInt32BE(r[1],12),i},AES.prototype.scrub=function(){scrub_vec(this._keySchedule),scrub_vec(this._invKeySchedule),scrub_vec(this._key)},AES.prototype._doCryptBlock=function(t,e,r,i){var n,u,o,S,_,h,B,s,c,f,I,y;for(o=t[0]^e[0],S=t[1]^e[1],_=t[2]^e[2],h=t[3]^e[3],n=4,u=I=1,y=this._nRounds;y>=1?y>I:I>y;u=y>=1?++I:--I)B=r[0][o>>>24]^r[1][S>>>16&255]^r[2][_>>>8&255]^r[3][255&h]^e[n++],s=r[0][S>>>24]^r[1][_>>>16&255]^r[2][h>>>8&255]^r[3][255&o]^e[n++],c=r[0][_>>>24]^r[1][h>>>16&255]^r[2][o>>>8&255]^r[3][255&S]^e[n++],f=r[0][h>>>24]^r[1][o>>>16&255]^r[2][S>>>8&255]^r[3][255&_]^e[n++],o=B,S=s,_=c,h=f;return B=(i[o>>>24]<<24|i[S>>>16&255]<<16|i[_>>>8&255]<<8|i[255&h])^e[n++],s=(i[S>>>24]<<24|i[_>>>16&255]<<16|i[h>>>8&255]<<8|i[255&o])^e[n++],c=(i[_>>>24]<<24|i[h>>>16&255]<<16|i[o>>>8&255]<<8|i[255&S])^e[n++],f=(i[h>>>24]<<24|i[o>>>16&255]<<16|i[S>>>8&255]<<8|i[255&_])^e[n++],[fixup_uint32(B),fixup_uint32(s),fixup_uint32(c),fixup_uint32(f)]},exports.AES=AES; -}).call(this,require("buffer").Buffer) - -},{"buffer":2}],9:[function(require,module,exports){ -(function (Buffer){ -function StreamCipher(t,e,r,h){if(!(this instanceof StreamCipher))return new StreamCipher(t,e,r);Transform.call(this),this._finID=Buffer.concat([r,new Buffer([0,0,0,1])]),r=Buffer.concat([r,new Buffer([0,0,0,2])]),this._cipher=new aes.AES(e),this._prev=new Buffer(r.length),this._cache=new Buffer(""),this._secCache=new Buffer(""),this._decrypt=h,this._alen=0,this._len=0,r.copy(this._prev),this._mode=t;var i=new Buffer(4);i.fill(0),this._ghash=new GHASH(this._cipher.encryptBlock(i)),this._authTag=null,this._called=!1}function xorTest(t,e){var r=0;t.length!==e.length&&r++;for(var h=Math.min(t.length,e.length),i=-1;++ie&&(e=new Buffer(e),e.fill(0),this._ghash.update(e))}this._called=!0;var r=this._mode.encrypt(this,t);return this._ghash.update(this._decrypt?t:r),this._len+=t.length,r},StreamCipher.prototype._final=function(){if(this._decrypt&&!this._authTag)throw new Error("Unsupported state or unable to authenticate data");var t=xor(this._ghash["final"](8*this._alen,8*this._len),this._cipher.encryptBlock(this._finID));if(this._decrypt){if(xorTest(t,this._authTag))throw new Error("Unsupported state or unable to authenticate data")}else this._authTag=t;this._cipher.scrub()},StreamCipher.prototype.getAuthTag=function(){if(!this._decrypt&&Buffer.isBuffer(this._authTag))return this._authTag;throw new Error("Attempting to get auth tag in unsupported state")},StreamCipher.prototype.setAuthTag=function(t){if(!this._decrypt)throw new Error("Attempting to set auth tag in unsupported state");this._authTag=t},StreamCipher.prototype.setAAD=function(t){if(this._called)throw new Error("Attempting to set AAD in unsupported state");this._ghash.update(t),this._alen+=t.length}; -}).call(this,require("buffer").Buffer) - -},{"./aes":8,"./cipherBase":11,"./ghash":14,"./xor":24,"buffer":2,"inherits":142}],10:[function(require,module,exports){ -function getCiphers(){return Object.keys(modes)}var ciphers=require("./encrypter");exports.createCipher=exports.Cipher=ciphers.createCipher,exports.createCipheriv=exports.Cipheriv=ciphers.createCipheriv;var deciphers=require("./decrypter");exports.createDecipher=exports.Decipher=deciphers.createDecipher,exports.createDecipheriv=exports.Decipheriv=deciphers.createDecipheriv;var modes=require("./modes");exports.listCiphers=exports.getCiphers=getCiphers; -},{"./decrypter":12,"./encrypter":13,"./modes":15}],11:[function(require,module,exports){ -(function (Buffer){ -function CipherBase(){Transform.call(this)}var Transform=require("stream").Transform,inherits=require("inherits");module.exports=CipherBase,inherits(CipherBase,Transform),CipherBase.prototype.update=function(r,t,e){"string"==typeof r&&(r=new Buffer(r,t));var i=this._update(r);return e&&(i=i.toString(e)),i},CipherBase.prototype._transform=function(r,t,e){this.push(this._update(r)),e()},CipherBase.prototype._flush=function(r){try{this.push(this._final())}catch(t){return r(t)}r()},CipherBase.prototype["final"]=function(r){var t=this._final()||new Buffer("");return r&&(t=t.toString(r)),t}; -}).call(this,require("buffer").Buffer) - -},{"buffer":2,"inherits":142,"stream":156}],12:[function(require,module,exports){ -(function (Buffer){ -function Decipher(e,r,t){return this instanceof Decipher?(Transform.call(this),this._cache=new Splitter,this._last=void 0,this._cipher=new aes.AES(r),this._prev=new Buffer(t.length),t.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new Decipher(e,r,t)}function Splitter(){return this instanceof Splitter?void(this.cache=new Buffer("")):new Splitter}function unpad(e){for(var r=e[15],t=-1;++t16)return r=this.cache.slice(0,16),this.cache=this.cache.slice(16),r}else if(this.cache.length>=16)return r=this.cache.slice(0,16),this.cache=this.cache.slice(16),r;return null},Splitter.prototype.flush=function(){return this.cache.length?this.cache:void 0};var modelist={ECB:require("./modes/ecb"),CBC:require("./modes/cbc"),CFB:require("./modes/cfb"),CFB8:require("./modes/cfb8"),CFB1:require("./modes/cfb1"),OFB:require("./modes/ofb"),CTR:require("./modes/ctr"),GCM:require("./modes/ctr")};exports.createDecipher=createDecipher,exports.createDecipheriv=createDecipheriv; -}).call(this,require("buffer").Buffer) - -},{"./EVP_BytesToKey":7,"./aes":8,"./authCipher":9,"./cipherBase":11,"./modes":15,"./modes/cbc":16,"./modes/cfb":17,"./modes/cfb1":18,"./modes/cfb8":19,"./modes/ctr":20,"./modes/ecb":21,"./modes/ofb":22,"./streamCipher":23,"buffer":2,"inherits":142}],13:[function(require,module,exports){ -(function (Buffer){ -function Cipher(e,r,t){return this instanceof Cipher?(Transform.call(this),this._cache=new Splitter,this._cipher=new aes.AES(r),this._prev=new Buffer(t.length),t.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new Cipher(e,r,t)}function Splitter(){return this instanceof Splitter?void(this.cache=new Buffer("")):new Splitter}function createCipheriv(e,r,t){var i=modes[e.toLowerCase()];if(!i)throw new TypeError("invalid suite type");if("string"==typeof t&&(t=new Buffer(t)),"string"==typeof r&&(r=new Buffer(r)),r.length!==i.key/8)throw new TypeError("invalid key length "+r.length);if(t.length!==i.iv)throw new TypeError("invalid iv length "+t.length);return"stream"===i.type?new StreamCipher(modelist[i.mode],r,t):"auth"===i.type?new AuthCipher(modelist[i.mode],r,t):new Cipher(modelist[i.mode],r,t)}function createCipher(e,r){var t=modes[e.toLowerCase()];if(!t)throw new TypeError("invalid suite type");var i=ebtk(r,t.key,t.iv);return createCipheriv(e,i.key,i.iv)}var aes=require("./aes"),Transform=require("./cipherBase"),inherits=require("inherits"),modes=require("./modes"),ebtk=require("./EVP_BytesToKey"),StreamCipher=require("./streamCipher"),AuthCipher=require("./authCipher");inherits(Cipher,Transform),Cipher.prototype._update=function(e){this._cache.add(e);for(var r,t,i=[];r=this._cache.get();)t=this._mode.encrypt(this,r),i.push(t);return Buffer.concat(i)},Cipher.prototype._final=function(){var e=this._cache.flush();if(this._autopadding)return e=this._mode.encrypt(this,e),this._cipher.scrub(),e;if("10101010101010101010101010101010"!==e.toString("hex"))throw this._cipher.scrub(),new Error("data not multiple of block length")},Cipher.prototype.setAutoPadding=function(e){this._autopadding=!!e},Splitter.prototype.add=function(e){this.cache=Buffer.concat([this.cache,e])},Splitter.prototype.get=function(){if(this.cache.length>15){var e=this.cache.slice(0,16);return this.cache=this.cache.slice(16),e}return null},Splitter.prototype.flush=function(){for(var e=16-this.cache.length,r=new Buffer(e),t=-1;++tuint_max||0>t?(e=Math.abs(t)%uint_max,0>t?uint_max-e:e):t}function xor(t,r){return[t[0]^r[0],t[1]^r[1],t[2]^r[2],t[3]^r[3]]}var zeros=new Buffer(16);zeros.fill(0),module.exports=GHASH,GHASH.prototype.ghash=function(t){for(var r=-1;++r0;t--)i[t]=i[t]>>>1|(1&i[t-1])<<31;i[0]=i[0]>>>1,e&&(i[0]=i[0]^225<<24)}this.state=fromArray(a)},GHASH.prototype.update=function(t){this.cache=Buffer.concat([this.cache,t]);for(var r;this.cache.length>=16;)r=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(r)},GHASH.prototype["final"]=function(t,r){return this.cache.length&&this.ghash(Buffer.concat([this.cache,zeros],16)),this.ghash(fromArray([0,t,0,r])),this.state};var uint_max=Math.pow(2,32); -}).call(this,require("buffer").Buffer) - -},{"buffer":2}],15:[function(require,module,exports){ -exports["aes-128-ecb"]={cipher:"AES",key:128,iv:0,mode:"ECB",type:"block"},exports["aes-192-ecb"]={cipher:"AES",key:192,iv:0,mode:"ECB",type:"block"},exports["aes-256-ecb"]={cipher:"AES",key:256,iv:0,mode:"ECB",type:"block"},exports["aes-128-cbc"]={cipher:"AES",key:128,iv:16,mode:"CBC",type:"block"},exports["aes-192-cbc"]={cipher:"AES",key:192,iv:16,mode:"CBC",type:"block"},exports["aes-256-cbc"]={cipher:"AES",key:256,iv:16,mode:"CBC",type:"block"},exports.aes128=exports["aes-128-cbc"],exports.aes192=exports["aes-192-cbc"],exports.aes256=exports["aes-256-cbc"],exports["aes-128-cfb"]={cipher:"AES",key:128,iv:16,mode:"CFB",type:"stream"},exports["aes-192-cfb"]={cipher:"AES",key:192,iv:16,mode:"CFB",type:"stream"},exports["aes-256-cfb"]={cipher:"AES",key:256,iv:16,mode:"CFB",type:"stream"},exports["aes-128-cfb8"]={cipher:"AES",key:128,iv:16,mode:"CFB8",type:"stream"},exports["aes-192-cfb8"]={cipher:"AES",key:192,iv:16,mode:"CFB8",type:"stream"},exports["aes-256-cfb8"]={cipher:"AES",key:256,iv:16,mode:"CFB8",type:"stream"},exports["aes-128-cfb1"]={cipher:"AES",key:128,iv:16,mode:"CFB1",type:"stream"},exports["aes-192-cfb1"]={cipher:"AES",key:192,iv:16,mode:"CFB1",type:"stream"},exports["aes-256-cfb1"]={cipher:"AES",key:256,iv:16,mode:"CFB1",type:"stream"},exports["aes-128-ofb"]={cipher:"AES",key:128,iv:16,mode:"OFB",type:"stream"},exports["aes-192-ofb"]={cipher:"AES",key:192,iv:16,mode:"OFB",type:"stream"},exports["aes-256-ofb"]={cipher:"AES",key:256,iv:16,mode:"OFB",type:"stream"},exports["aes-128-ctr"]={cipher:"AES",key:128,iv:16,mode:"CTR",type:"stream"},exports["aes-192-ctr"]={cipher:"AES",key:192,iv:16,mode:"CTR",type:"stream"},exports["aes-256-ctr"]={cipher:"AES",key:256,iv:16,mode:"CTR",type:"stream"},exports["aes-128-gcm"]={cipher:"AES",key:128,iv:12,mode:"GCM",type:"auth"},exports["aes-192-gcm"]={cipher:"AES",key:192,iv:12,mode:"GCM",type:"auth"},exports["aes-256-gcm"]={cipher:"AES",key:256,iv:12,mode:"GCM",type:"auth"}; -},{}],16:[function(require,module,exports){ -var xor=require("../xor");exports.encrypt=function(r,e){var p=xor(e,r._prev);return r._prev=r._cipher.encryptBlock(p),r._prev},exports.decrypt=function(r,e){var p=r._prev;r._prev=e;var c=r._cipher.decryptBlock(e);return xor(c,p)}; -},{"../xor":24}],17:[function(require,module,exports){ -(function (Buffer){ -function encryptStart(e,r,c){var t=r.length,n=xor(r,e._cache);return e._cache=e._cache.slice(t),e._prev=Buffer.concat([e._prev,c?r:n]),n}var xor=require("../xor");exports.encrypt=function(e,r,c){for(var t,n=new Buffer("");r.length;){if(0===e._cache.length&&(e._cache=e._cipher.encryptBlock(e._prev),e._prev=new Buffer("")),!(e._cache.length<=r.length)){n=Buffer.concat([n,encryptStart(e,r,c)]);break}t=e._cache.length,n=Buffer.concat([n,encryptStart(e,r.slice(0,t),c)]),r=r.slice(t)}return n}; -}).call(this,require("buffer").Buffer) - -},{"../xor":24,"buffer":2}],18:[function(require,module,exports){ -(function (Buffer){ -function encryptByte(r,e,n){for(var t,f,c,u=-1,o=8,p=0;++u>u%8,r._prev=shiftIn(r._prev,n?f:c);return p}function shiftIn(r,e){var n=r.length,t=-1,f=new Buffer(r.length);for(r=Buffer.concat([r,new Buffer([e])]);++t>7;return f}exports.encrypt=function(r,e,n){for(var t=e.length,f=new Buffer(t),c=-1;++ch;h++){var e=t.charCodeAt(h)-48;n<<=4,n|=e>=49&&54>=e?e-49+10:e>=17&&22>=e?e-17+10:15&e}return n}function e(t,i,r,n){for(var s=0,h=Math.min(t.length,r),e=i;h>e;e++){var o=t.charCodeAt(e)-48;s*=n,s+=o>=49?o-49+10:o>=17?o-17+10:o}return s}function o(t,i){this.name=t,this.p=new s(i,16),this.n=this.p.bitLength(),this.k=new s(1).ishln(this.n).isub(this.p),this.tmp=this._tmp()}function f(){o.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function d(){o.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function u(){o.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function l(){o.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function p(t){if("string"==typeof t){var i=s._prime(t);this.m=i.p,this.prime=i}else this.m=t,this.prime=null}function g(t){p.call(this,t),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new s(1).ishln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r.invm(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv.sign=!0,this.minv=this.minv.mod(this.r)}"object"==typeof t?t.exports=s:i.BN=s,s.BN=s,s.wordSize=26,s.prototype._init=function(t,i,n){if("number"==typeof t)return 0>t&&(this.sign=!0,t=-t),void(67108864>t?(this.words=[67108863&t],this.length=1):(this.words=[67108863&t,t/67108864&67108863],this.length=2));if("object"==typeof t)return this._initArray(t,i,n);"hex"===i&&(i=16),r(i===(0|i)&&i>=2&&36>=i),t=t.toString().replace(/\s+/g,"");var s=0;"-"===t[0]&&s++,16===i?this._parseHex(t,s):this._parseBase(t,i,s),"-"===t[0]&&(this.sign=!0),this.strip()},s.prototype._initArray=function(t,i,n){r("number"==typeof t.length),this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var s=0;s=0;s-=3){var o=t[s]|t[s-1]<<8|t[s-2]<<16;this.words[e]|=o<>>26-h&67108863,h+=24,h>=26&&(h-=26,e++)}else if("le"===n)for(var s=0,e=0;s>>26-h&67108863,h+=24,h>=26&&(h-=26,e++)}return this.strip()},s.prototype._parseHex=function(t,i){this.length=Math.ceil((t.length-i)/6),this.words=new Array(this.length);for(var r=0;r=i;r-=6){var e=h(t,r,r+6);this.words[s]|=e<>>26-n&4194303,n+=24,n>=26&&(n-=26,s++)}if(r+6!==i){var e=h(t,i,r+6);this.words[s]|=e<>>26-n&4194303}this.strip()},s.prototype._parseBase=function(t,i,r){this.words=[0],this.length=1;for(var n=0,s=1;67108863>=s;s*=i)n++;n--,s=s/i|0;for(var h=t.length-r,o=h%n,f=Math.min(h,h-o)+r,d=0,u=r;f>u;u+=n)d=e(t,u,u+n,i),this.imuln(s),this.words[0]+d<67108864?this.words[0]+=d:this._iaddn(d);if(0!==o){for(var l=1,d=e(t,u,t.length,i),u=0;o>u;u++)l*=i;this.imuln(l),this.words[0]+d<67108864?this.words[0]+=d:this._iaddn(d)}},s.prototype.copy=function(t){t.words=new Array(this.length);for(var i=0;i1&&0===this.words[this.length-1];)this.length--;return this._normSign()},s.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.sign=!1),this},s.prototype.inspect=function(){return(this.red?""};var a=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],c=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],m=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];s.prototype.toString=function(t,i){if(t=t||10,16===t||"hex"===t){for(var n="",s=0,i=0|i||1,h=0,e=0;e>>24-s&16777215,n=0!==h||e!==this.length-1?a[6-f.length]+f+n:f+n,s+=2,s>=26&&(s-=26,e--)}for(0!==h&&(n=h.toString(16)+n);n.length%i!==0;)n="0"+n;return this.sign&&(n="-"+n),n}if(t===(0|t)&&t>=2&&36>=t){var d=c[t],u=m[t],n="",l=this.clone();for(l.sign=!1;0!==l.cmpn(0);){var p=l.modn(u).toString(t);l=l.idivn(u),n=0!==l.cmpn(0)?a[d-p.length]+p+n:p+n}return 0===this.cmpn(0)&&(n="0"+n),this.sign&&(n="-"+n),n}r(!1,"Base should be between 2 and 36")},s.prototype.toJSON=function(){return this.toString(16)},s.prototype.toArray=function(){this.strip();var t=new Array(this.byteLength());t[0]=0;for(var i=this.clone(),r=0;0!==i.cmpn(0);r++){var n=i.andln(255);i.ishrn(8),t[t.length-r-1]=n}return t},s.prototype._countBits=function(t){return t>=33554432?26:t>=16777216?25:t>=8388608?24:t>=4194304?23:t>=2097152?22:t>=1048576?21:t>=524288?20:t>=262144?19:t>=131072?18:t>=65536?17:t>=32768?16:t>=16384?15:t>=8192?14:t>=4096?13:t>=2048?12:t>=1024?11:t>=512?10:t>=256?9:t>=128?8:t>=64?7:t>=32?6:t>=16?5:t>=8?4:t>=4?3:t>=2?2:t>=1?1:0},s.prototype.bitLength=function(){var t=0,i=this.words[this.length-1],t=this._countBits(i);return 26*(this.length-1)+t},s.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},s.prototype.neg=function(){if(0===this.cmpn(0))return this.clone();var t=this.clone();return t.sign=!this.sign,t},s.prototype.ior=function(t){for(this.sign=this.sign||t.sign;this.lengtht.length?this.clone().ior(t):t.clone().ior(this)},s.prototype.iand=function(t){this.sign=this.sign&&t.sign;var i;i=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},s.prototype.ixor=function(t){this.sign=this.sign||t.sign;var i,r;this.length>t.length?(i=this,r=t):(i=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},s.prototype.setn=function(t,i){r("number"==typeof t&&t>=0);for(var n=t/26|0,s=t%26;this.length<=n;)this.words[this.length++]=0;return i?this.words[n]=this.words[n]|1<t.length?(r=this,n=t):(r=t,n=this);for(var s=0,h=0;h>>26}for(;0!==s&&h>>26}if(this.length=r.length,0!==s)this.words[this.length]=s,this.length++;else if(r!==this)for(;ht.length?this.clone().iadd(t):t.clone().iadd(this)},s.prototype.isub=function(t){if(t.sign){t.sign=!1;var i=this.iadd(t);return t.sign=!0,i._normSign()}if(this.sign)return this.sign=!1,this.iadd(t),this.sign=!0,this._normSign();var r=this.cmp(t);if(0===r)return this.sign=!1,this.length=1,this.words[0]=0,this;var n,s;r>0?(n=this,s=t):(n=t,s=this);for(var h=0,e=0;e>26,this.words[e]=67108863&i}for(;0!==h&&e>26,this.words[e]=67108863&i}if(0===h&&e>>26,h=67108863&r,e=Math.min(n,t.length-1),o=Math.max(0,n-this.length+1);e>=o;o++){var f=n-o,d=0|this.words[f],u=0|t.words[o],l=d*u,p=67108863&l;s=s+(l/67108864|0)|0,p=p+h|0,h=67108863&p,s=s+(p>>>26)|0}i.words[n]=h,r=s}return 0!==r?i.words[n]=r:i.length--,i.strip()},s.prototype._bigMulTo=function(t,i){i.sign=t.sign!==this.sign,i.length=this.length+t.length;for(var r=0,n=0,s=0;s=f;f++){var d=s-f,u=0|this.words[d],l=0|t.words[f],p=u*l,g=67108863&p;h=h+(p/67108864|0)|0,g=g+e|0,e=67108863&g,h=h+(g>>>26)|0,n+=h>>>26,h&=67108863}i.words[s]=e,r=h,h=n}return 0!==r?i.words[s]=r:i.length--,i.strip()},s.prototype.mulTo=function(t,i){var r;return r=this.length+t.length<63?this._smallMulTo(t,i):this._bigMulTo(t,i)},s.prototype.mul=function(t){var i=new s(null);return i.words=new Array(this.length+t.length),this.mulTo(t,i)},s.prototype.imul=function(t){if(0===this.cmpn(0)||0===t.cmpn(0))return this.words[0]=0,this.length=1,this;var i=this.length,r=t.length;this.sign=t.sign!==this.sign,this.length=this.length+t.length,this.words[this.length-1]=0;for(var n=this.length-2;n>=0;n--){for(var s=0,h=0,e=Math.min(n,r-1),o=Math.max(0,n-i+1);e>=o;o++){var f=n-o,d=this.words[f],u=t.words[o],l=d*u,p=67108863&l;s+=l/67108864|0,p+=h,h=67108863&p,s+=p>>>26}this.words[n]=h,this.words[n+1]+=s,s=0}for(var s=0,f=1;f>>26}return this.strip()},s.prototype.imuln=function(t){r("number"==typeof t);for(var i=0,n=0;n>=26,i+=s/67108864|0,i+=h>>>26,this.words[n]=67108863&h}return 0!==i&&(this.words[n]=i,this.length++),this},s.prototype.sqr=function(){return this.mul(this)},s.prototype.isqr=function(){return this.mul(this)},s.prototype.ishln=function(t){r("number"==typeof t&&t>=0);var i=t%26,n=(t-i)/26,s=67108863>>>26-i<<26-i;if(0!==i){for(var h=0,e=0;e>>26-i}h&&(this.words[e]=h,this.length++)}if(0!==n){for(var e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(var e=0;n>e;e++)this.words[e]=0;this.length+=n}return this.strip()},s.prototype.ishrn=function(t,i,n){r("number"==typeof t&&t>=0),i=i?(i-i%26)/26:0;var s=t%26,h=Math.min((t-s)/26,this.length),e=67108863^67108863>>>s<f;f++)o.words[f]=this.words[f];o.length=h}if(0===h);else if(this.length>h){this.length-=h;for(var f=0;f=0&&(0!==d||f>=i);f--){var u=this.words[f];this.words[f]=d<<26-s|u>>>s,d=u&e}return o&&0!==d&&(o.words[o.length++]=d),0===this.length&&(this.words[0]=0,this.length=1),this.strip(),n?{hi:this,lo:o}:this},s.prototype.shln=function(t){return this.clone().ishln(t)},s.prototype.shrn=function(t){return this.clone().ishrn(t)},s.prototype.testn=function(t){r("number"==typeof t&&t>=0);var i=t%26,n=(t-i)/26,s=1<=0);var i=t%26,n=(t-i)/26;if(r(!this.sign,"imaskn works only with positive numbers"),0!==i&&n++,this.length=Math.min(n,this.length),0!==i){var s=67108863^67108863>>>i<t?this.isubn(-t):this.sign?1===this.length&&this.words[0]=67108864;i++)this.words[i]-=67108864,i===this.length-1?this.words[i+1]=1:this.words[i+1]++;return this.length=Math.max(this.length,i+1),this},s.prototype.isubn=function(t){if(r("number"==typeof t),0>t)return this.iaddn(-t);if(this.sign)return this.sign=!1,this.iaddn(t),this.sign=!0,this;this.words[0]-=t;for(var i=0;i>26)-(d/67108864|0),this.words[s+n]=67108863&f}for(;s>26,this.words[s+n]=67108863&f}if(0===o)return this.strip();r(-1===o),o=0;for(var s=0;s>26,this.words[s]=67108863&f}return this.sign=!0,this.strip()},s.prototype._wordDiv=function(t,i){for(var r=this.length-t.length,n=this.clone(),h=t,e=h.words[h.length-1],r=0;33554432>e;r++)e<<=1;0!==r&&(h=h.shln(r),n.ishln(r),e=h.words[h.length-1]);var o,f=n.length-h.length;if("mod"!==i){o=new s(null),o.length=f+1,o.words=new Array(o.length);for(var d=0;d=0;l--){var p=67108864*n.words[h.length+l]+n.words[h.length+l-1];for(p=Math.min(p/e|0,67108863),n._ishlnsubmul(h,p,l);n.sign;)p--,n.sign=!1,n._ishlnsubmul(h,1,l),n.sign=!n.sign;o&&(o.words[l]=p)}return o&&o.strip(),n.strip(),"div"!==i&&0!==r&&n.ishrn(r),{div:o?o:null,mod:n}},s.prototype.divmod=function(t,i){if(r(0!==t.cmpn(0)),this.sign&&!t.sign){var n,h,e=this.neg().divmod(t,i);return"mod"!==i&&(n=e.div.neg()),"div"!==i&&(h=0===e.mod.cmpn(0)?e.mod:t.sub(e.mod)),{div:n,mod:h}}if(!this.sign&&t.sign){var n,e=this.divmod(t.neg(),i);return"mod"!==i&&(n=e.div.neg()),{div:n,mod:e.mod}}return this.sign&&t.sign?this.neg().divmod(t.neg(),i):t.length>this.length||this.cmp(t)<0?{div:new s(0),mod:this}:1===t.length?"div"===i?{div:this.divn(t.words[0]),mod:null}:"mod"===i?{div:null,mod:new s(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new s(this.modn(t.words[0]))}:this._wordDiv(t,i)},s.prototype.div=function(t){return this.divmod(t,"div").div},s.prototype.mod=function(t){return this.divmod(t,"mod").mod},s.prototype.divRound=function(t){var i=this.divmod(t);if(0===i.mod.cmpn(0))return i.div;var r=i.div.sign?i.mod.isub(t):i.mod,n=t.shrn(1),s=t.andln(1),h=r.cmp(n);return 0>h||1===s&&0===h?i.div:i.div.sign?i.div.isubn(1):i.div.iaddn(1)},s.prototype.modn=function(t){r(67108863>=t);for(var i=(1<<26)%t,n=0,s=this.length-1;s>=0;s--)n=(i*n+this.words[s])%t;return n},s.prototype.idivn=function(t){r(67108863>=t);for(var i=0,n=this.length-1;n>=0;n--){var s=this.words[n]+67108864*i;this.words[n]=s/t|0,i=s%t}return this.strip()},s.prototype.divn=function(t){return this.clone().idivn(t)},s.prototype._egcd=function(t,i){r(!i.sign),r(0!==i.cmpn(0));var n=this,h=i.clone();n=n.sign?n.mod(i):n.clone();for(var e=new s(0);h.isEven();)h.ishrn(1);for(var o=h.clone();n.cmpn(1)>0&&h.cmpn(1)>0;){for(;n.isEven();)n.ishrn(1),t.isEven()?t.ishrn(1):t.iadd(o).ishrn(1);for(;h.isEven();)h.ishrn(1),e.isEven()?e.ishrn(1):e.iadd(o).ishrn(1);n.cmp(h)>=0?(n.isub(h),t.isub(e)):(h.isub(n),e.isub(t))}return 0===n.cmpn(1)?t:e},s.prototype.gcd=function(t){if(0===this.cmpn(0))return t.clone();if(0===t.cmpn(0))return this.clone();var i=this.clone(),r=t.clone();i.sign=!1,r.sign=!1;for(var n=0;i.isEven()&&r.isEven();n++)i.ishrn(1),r.ishrn(1);for(;i.isEven();)i.ishrn(1);do{for(;r.isEven();)r.ishrn(1);if(i.cmp(r)<0){var s=i;i=r,r=s}i.isub(i.div(r).mul(r))}while(0!==i.cmpn(0)&&0!==r.cmpn(0));return 0===i.cmpn(0)?r.ishln(n):i.ishln(n)},s.prototype.invm=function(t){return this._egcd(new s(1),t).mod(t)},s.prototype.isEven=function(){return 0===(1&this.words[0])},s.prototype.isOdd=function(){return 1===(1&this.words[0])},s.prototype.andln=function(t){return this.words[0]&t},s.prototype.bincn=function(t){r("number"==typeof t);var i=t%26,n=(t-i)/26,s=1<h;h++)this.words[h]=0;return this.words[n]|=s,this.length=n+1,this}for(var e=s,h=n;0!==e&&h>>26,o&=67108863,this.words[h]=o}return 0!==e&&(this.words[h]=e,this.length++),this},s.prototype.cmpn=function(t){var i=0>t;if(i&&(t=-t),this.sign&&!i)return-1;if(!this.sign&&i)return 1;t&=67108863,this.strip();var r;if(this.length>1)r=1;else{var n=this.words[0];r=n===t?0:t>n?-1:1}return this.sign&&(r=-r),r},s.prototype.cmp=function(t){if(this.sign&&!t.sign)return-1;if(!this.sign&&t.sign)return 1;var i=this.ucmp(t);return this.sign?-i:i},s.prototype.ucmp=function(t){if(this.length>t.length)return 1;if(this.length=0;r--){var n=this.words[r],s=t.words[r];if(n!==s){s>n?i=-1:n>s&&(i=1);break}}return i},s.red=function(t){return new p(t)},s.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(!this.sign,"red works only with positives"),t.convertTo(this)._forceRed(t)},s.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},s.prototype._forceRed=function(t){return this.red=t,this},s.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},s.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},s.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},s.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},s.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},s.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},s.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},s.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},s.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},s.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},s.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},s.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},s.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},s.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var w={k256:null,p224:null,p192:null,p25519:null};o.prototype._tmp=function(){var t=new s(null);return t.words=new Array(Math.ceil(this.n/13)),t},o.prototype.ireduce=function(t){var i,r=t;do{var n=r.ishrn(this.n,0,this.tmp);r=this.imulK(n.hi),r=r.iadd(n.lo),i=r.bitLength()}while(i>this.n);var s=i0?r.isub(this.p):r.strip(),r},o.prototype.imulK=function(t){return t.imul(this.k)},n(f,o),f.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var i,r=0,n=0;n>>=26,t.words[r]=s,i=n}return 0!==i&&(t.words[t.length++]=i),t},s._prime=function v(t){if(w[t])return w[t];var v;if("k256"===t)v=new f;else if("p224"===t)v=new d;else if("p192"===t)v=new u;else{if("p25519"!==t)throw new Error("Unknown prime "+t);v=new l}return w[t]=v,v},p.prototype._verify1=function(t){r(!t.sign,"red works only with positives"),r(t.red,"red works only with red numbers")},p.prototype._verify2=function(t,i){r(!t.sign&&!i.sign,"red works only with positives"),r(t.red&&t.red===i.red,"red works only with red numbers")},p.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.mod(this.m)._forceRed(this)},p.prototype.neg=function(t){var i=t.clone();return i.sign=!i.sign,i.iadd(this.m)._forceRed(this)},p.prototype.add=function(t,i){this._verify2(t,i);var r=t.add(i);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},p.prototype.iadd=function(t,i){this._verify2(t,i);var r=t.iadd(i);return r.cmp(this.m)>=0&&r.isub(this.m),r},p.prototype.sub=function(t,i){this._verify2(t,i);var r=t.sub(i);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},p.prototype.isub=function(t,i){this._verify2(t,i);var r=t.isub(i);return r.cmpn(0)<0&&r.iadd(this.m),r},p.prototype.shl=function(t,i){return this._verify1(t),this.imod(t.shln(i))},p.prototype.imul=function(t,i){return this._verify2(t,i),this.imod(t.imul(i))},p.prototype.mul=function(t,i){return this._verify2(t,i),this.imod(t.mul(i))},p.prototype.isqr=function(t){return this.imul(t,t)},p.prototype.sqr=function(t){return this.mul(t,t)},p.prototype.sqrt=function(t){if(0===t.cmpn(0))return t.clone();var i=this.m.andln(3);if(r(i%2===1),3===i){var n=this.m.add(new s(1)).ishrn(2),h=this.pow(t,n);return h}for(var e=this.m.subn(1),o=0;0!==e.cmpn(0)&&0===e.andln(1);)o++,e.ishrn(1);r(0!==e.cmpn(0));var f=new s(1).toRed(this),d=f.redNeg(),u=this.m.subn(1).ishrn(1),l=this.m.bitLength();for(l=new s(2*l*l).toRed(this);0!==this.pow(l,u).cmp(d);)l.redIAdd(d);for(var p=this.pow(l,e),h=this.pow(t,e.addn(1).ishrn(1)),g=this.pow(t,e),a=o;0!==g.cmp(f);){for(var c=g,m=0;0!==c.cmp(f);m++)c=c.redSqr();r(a>m);var w=this.pow(p,new s(1).ishln(a-m-1));h=h.redMul(w),p=w.redSqr(),g=g.redMul(p),a=m}return h},p.prototype.invm=function(t){var i=t._egcd(new s(1),this.m);return i.sign?(i.sign=!1,this.imod(i).redNeg()):this.imod(i)},p.prototype.pow=function(t,i){for(var r=[],n=i.clone();0!==n.cmpn(0);)r.push(n.andln(1)),n.ishrn(1);for(var s=t,h=0;h=0?h=s.isub(this.m):s.cmpn(0)<0&&(h=s.iadd(this.m)),h._forceRed(this)},g.prototype.mul=function(t,i){if(0===t.cmpn(0)||0===i.cmpn(0))return new s(0)._forceRed(this);var r=t.mul(i),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),h=r.isub(n).ishrn(this.shift),e=h;return h.cmp(this.m)>=0?e=h.isub(this.m):h.cmpn(0)<0&&(e=h.iadd(this.m)),e._forceRed(this)},g.prototype.invm=function(t){var i=this.imod(t.invm(this.m).mul(this.r2));return i._forceRed(this)}}("undefined"==typeof module||module,this); -},{}],28:[function(require,module,exports){ -(function (Buffer){ -function blind(e,n){var r=getr(e,n),o=r.toRed(bn.mont(e.modulus)).redPow(new bn(e.publicExponent)).fromRed();return{blinder:o,unblinder:r.invm(e.modulus)}}function crt(e,n,r){var o=blind(n,r),m=n.modulus.byteLength(),t=(bn.mont(n.modulus),new bn(e).mul(o.blinder).mod(n.modulus)),u=t.toRed(bn.mont(n.prime1)),d=t.toRed(bn.mont(n.prime2)),i=n.coefficient,l=n.prime1,b=n.prime2,f=u.redPow(n.exponent1),s=d.redPow(n.exponent2);f=f.fromRed(),s=s.fromRed();var a=f.isub(s).imul(i).mod(l);a.imul(b),s.iadd(a);var c=new Buffer(s.imul(o.unblinder).mod(n.modulus).toArray());if(c.length=0||!o.mod(e.prime1)||!o.mod(e.prime2);)o=new bn(n.randomBytes(r));return o}var bn=require("bn.js");module.exports=crt,crt.getr=getr; -}).call(this,require("buffer").Buffer) - -},{"bn.js":27,"buffer":2}],29:[function(require,module,exports){ -var elliptic=exports;elliptic.version=require("../package.json").version,elliptic.utils=require("./elliptic/utils"),elliptic.rand=require("brorand"),elliptic.hmacDRBG=require("./elliptic/hmac-drbg"),elliptic.curve=require("./elliptic/curve"),elliptic.curves=require("./elliptic/curves"),elliptic.ec=require("./elliptic/ec"); -},{"../package.json":48,"./elliptic/curve":32,"./elliptic/curves":35,"./elliptic/ec":36,"./elliptic/hmac-drbg":39,"./elliptic/utils":40,"brorand":41}],30:[function(require,module,exports){ -function BaseCurve(t,e){this.type=t,this.p=new bn(e.p,16),this.red=e.prime?bn.red(e.prime):bn.mont(this.p),this.zero=new bn(0).toRed(this.red),this.one=new bn(1).toRed(this.red),this.two=new bn(2).toRed(this.red),this.n=e.n&&new bn(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4)}function BasePoint(t,e){this.curve=t,this.type=e,this.precomputed=null}var bn=require("bn.js"),elliptic=require("../../elliptic"),getNAF=elliptic.utils.getNAF,getJSF=elliptic.utils.getJSF,assert=elliptic.utils.assert;module.exports=BaseCurve,BaseCurve.prototype.point=function(){throw new Error("Not implemented")},BaseCurve.prototype.validate=function(t){throw new Error("Not implemented")},BaseCurve.prototype._fixedNafMul=function(t,e){var n=t._getDoubles(),r=getNAF(e,1),i=(1<=s;e--)a=(a<<1)+r[e];o.push(a)}for(var l=this.jpoint(null,null,null),p=this.jpoint(null,null,null),u=i;u>0;u--){for(var s=0;s=0;a--){for(var e=0;a>=0&&0===o[a];a--)e++;if(a>=0&&e++,s=s.dblp(e),0>a)break;var l=o[a];assert(0!==l),s="affine"===t.type?s.mixedAdd(l>0?i[l-1>>1]:i[-l-1>>1].neg()):s.add(l>0?i[l-1>>1]:i[-l-1>>1].neg())}return"affine"===t.type?s.toP():s},BaseCurve.prototype._wnafMulAdd=function(t,e,n,r){for(var i=this._wnafT1,o=this._wnafT2,s=this._wnafT3,a=0,l=0;r>l;l++){var p=e[l],u=p._getNAFPoints(t);i[l]=u.wnd,o[l]=u.points}for(var l=r-1;l>=1;l-=2){var d=l-1,h=l;if(1===i[d]&&1===i[h]){var f=[e[d],null,null,e[h]];0===e[d].y.cmp(e[h].y)?(f[1]=e[d].add(e[h]),f[2]=e[d].toJ().mixedAdd(e[h].neg())):0===e[d].y.cmp(e[h].y.redNeg())?(f[1]=e[d].toJ().mixedAdd(e[h]),f[2]=e[d].add(e[h].neg())):(f[1]=e[d].toJ().mixedAdd(e[h]),f[2]=e[d].toJ().mixedAdd(e[h].neg()));var v=[-3,-1,-5,-7,0,7,5,1,3],g=getJSF(n[d],n[h]);a=Math.max(g[0].length,a),s[d]=new Array(a),s[h]=new Array(a);for(var c=0;a>c;c++){var m=0|g[0][c],w=0|g[1][c];s[d][c]=v[3*(m+1)+(w+1)],s[h][c]=0,o[d]=f}}else s[d]=getNAF(n[d],i[d]),s[h]=getNAF(n[h],i[h]),a=Math.max(s[d].length,a),a=Math.max(s[h].length,a)}for(var b=this.jpoint(null,null,null),y=this._wnafT4,l=a;l>=0;l--){for(var A=0;l>=0;){for(var _=!0,c=0;r>c;c++)y[c]=0|s[c][l],0!==y[c]&&(_=!1);if(!_)break;A++,l--}if(l>=0&&A++,b=b.dblp(A),0>l)break;for(var c=0;r>c;c++){var p,B=y[c];0!==B&&(B>0?p=o[c][B-1>>1]:0>B&&(p=o[c][-B-1>>1].neg()),b="affine"===p.type?b.mixedAdd(p):b.add(p))}}for(var l=0;r>l;l++)o[l]=null;return b.toP()},BaseCurve.BasePoint=BasePoint,BasePoint.prototype.validate=function(){return this.curve.validate(this)},BasePoint.prototype.precompute=function(t,e){if(this.precomputed)return this;var n={doubles:null,naf:null,beta:null};return n.naf=this._getNAFPoints(8),n.doubles=this._getDoubles(4,t),n.beta=this._getBeta(),this.precomputed=n,this},BasePoint.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var n=[this],r=this,i=0;e>i;i+=t){for(var o=0;t>o;o++)r=r.dbl();n.push(r)}return{step:t,points:n}},BasePoint.prototype._getNAFPoints=function(t){if(this.precomputed&&this.precomputed.naf)return this.precomputed.naf;for(var e=[this],n=(1<i;i++)e[i]=e[i-1].add(r);return{wnd:t,points:e}},BasePoint.prototype._getBeta=function(){return null},BasePoint.prototype.dblp=function(t){for(var e=this,n=0;t>n;n++)e=e.dbl();return e}; -},{"../../elliptic":29,"bn.js":27}],31:[function(require,module,exports){ -function EdwardsCurve(t){this.twisted=1!=t.a,this.mOneA=this.twisted&&-1==t.a,this.extended=this.mOneA,Base.call(this,"mont",t),this.a=new bn(t.a,16).mod(this.red.m).toRed(this.red),this.c=new bn(t.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new bn(t.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),assert(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==t.c}function Point(t,e,r,i,d){Base.BasePoint.call(this,t,"projective"),null===e&&null===r&&null===i?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new bn(e,16),this.y=new bn(r,16),this.z=i?new bn(i,16):this.curve.one,this.t=d&&new bn(d,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}var curve=require("../curve"),elliptic=require("../../elliptic"),bn=require("bn.js"),inherits=require("inherits"),Base=curve.base,getNAF=elliptic.utils.getNAF,assert=elliptic.utils.assert;inherits(EdwardsCurve,Base),module.exports=EdwardsCurve,EdwardsCurve.prototype._mulA=function(t){return this.mOneA?t.redNeg():this.a.redMul(t)},EdwardsCurve.prototype._mulC=function(t){return this.oneC?t:this.c.redMul(t)},EdwardsCurve.prototype.point=function(t,e,r,i){return new Point(this,t,e,r,i)},EdwardsCurve.prototype.jpoint=function(t,e,r,i){return this.point(t,e,r,i)},EdwardsCurve.prototype.pointFromJSON=function(t){return Point.fromJSON(this,t)},EdwardsCurve.prototype.pointFromX=function(t,e){e=new bn(e,16),e.red||(e=e.toRed(this.red));var r=e.redSqr(),i=this.c2.redSub(this.a.redMul(r)),d=this.one.redSub(this.c2.redMul(this.d).redMul(r)),s=i.redMul(d.redInvm()).redSqrt(),u=s.fromRed().isOdd();return(t&&!u||!t&&u)&&(s=s.redNeg()),this.point(e,s,curve.one)},EdwardsCurve.prototype.validate=function(t){if(t.isInfinity())return!0;t.normalize();var e=t.x.redSqr(),r=t.y.redSqr(),i=e.redMul(this.a).redAdd(r),d=this.c2.redMul(this.one.redAdd(this.d.redMul(e).redMul(r)));return 0===i.cmp(d)},inherits(Point,Base.BasePoint),Point.fromJSON=function(t,e){return new Point(t,e[0],e[1],e[2])},Point.prototype.inspect=function(){return this.isInfinity()?"":""},Point.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&0===this.y.cmp(this.z)},Point.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var i=this.curve._mulA(t),d=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),s=i.redAdd(e),u=s.redSub(r),n=i.redSub(e),h=d.redMul(u),o=s.redMul(n),l=d.redMul(n),c=u.redMul(s);return this.curve.point(h,o,c,l)},Point.prototype._projDbl=function(){var t=this.x.redAdd(this.y).redSqr(),e=this.x.redSqr(),r=this.y.redSqr();if(this.curve.twisted){var i=this.curve._mulA(e),d=i.redAdd(r);if(this.zOne)var s=t.redSub(e).redSub(r).redMul(d.redSub(this.curve.two)),u=d.redMul(i.redSub(r)),n=d.redSqr().redSub(d).redSub(d);else var h=this.z.redSqr(),o=d.redSub(h).redISub(h),s=t.redSub(e).redISub(r).redMul(o),u=d.redMul(i.redSub(r)),n=d.redMul(o)}else var i=e.redAdd(r),h=this.curve._mulC(redMul(this.z)).redSqr(),o=i.redSub(h).redSub(h),s=this.curve._mulC(t.redISub(i)).redMul(o),u=this.curve._mulC(i).redMul(e.redISub(r)),n=i.redMul(o);return this.curve.point(s,u,n)},Point.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},Point.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),i=this.t.redMul(this.curve.dd).redMul(t.t),d=this.z.redMul(t.z.redAdd(t.z)),s=r.redSub(e),u=d.redSub(i),n=d.redAdd(i),h=r.redAdd(e),o=s.redMul(u),l=n.redMul(h),c=s.redMul(h),p=u.redMul(n);return this.curve.point(o,l,p,c)},Point.prototype._projAdd=function(t){var e=this.z.redMul(t.z),r=e.redSqr(),i=this.x.redMul(t.x),d=this.y.redMul(t.y),s=this.curve.d.redMul(i).redMul(d),u=r.redSub(s),n=r.redAdd(s),h=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(i).redISub(d),o=e.redMul(u).redMul(h);if(this.curve.twisted)var l=e.redMul(n).redMul(d.redSub(this.curve._mulA(i))),c=u.redMul(n);else var l=e.redMul(n).redMul(d.redSub(i)),c=this.curve._mulC(u).redMul(n);return this.curve.point(o,l,c)},Point.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},Point.prototype.mul=function(t){return this.precomputed&&this.precomputed.doubles?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},Point.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2)},Point.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},Point.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},Point.prototype.getX=function(){return this.normalize(),this.x.fromRed()},Point.prototype.getY=function(){return this.normalize(),this.y.fromRed()},Point.prototype.toP=Point.prototype.normalize,Point.prototype.mixedAdd=Point.prototype.add; -},{"../../elliptic":29,"../curve":32,"bn.js":27,"inherits":142}],32:[function(require,module,exports){ -var curve=exports;curve.base=require("./base"),curve["short"]=require("./short"),curve.mont=require("./mont"),curve.edwards=require("./edwards"); -},{"./base":30,"./edwards":31,"./mont":33,"./short":34}],33:[function(require,module,exports){ -function MontCurve(t){Base.call(this,"mont",t),this.a=new bn(t.a,16).toRed(this.red),this.b=new bn(t.b,16).toRed(this.red),this.i4=new bn(4).toRed(this.red).redInvm(),this.two=new bn(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function Point(t,e,r){Base.BasePoint.call(this,t,"projective"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new bn(e,16),this.z=new bn(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}var curve=require("../curve"),elliptic=require("../../elliptic"),bn=require("bn.js"),inherits=require("inherits"),Base=curve.base,getNAF=elliptic.utils.getNAF,assert=elliptic.utils.assert;inherits(MontCurve,Base),module.exports=MontCurve,MontCurve.prototype.point=function(t,e){return new Point(this,t,e)},MontCurve.prototype.pointFromJSON=function(t){return Point.fromJSON(this,t)},MontCurve.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),i=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e),n=i.redSqrt();return 0===n.redSqr().cmp(i)},inherits(Point,Base.BasePoint),Point.prototype.precompute=function(){},Point.fromJSON=function(t,e){return new Point(t,e[0],e[1]||t.one)},Point.prototype.inspect=function(){return this.isInfinity()?"":""},Point.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},Point.prototype.dbl=function(){var t=this.x.redAdd(this.z),e=t.redSqr(),r=this.x.redSub(this.z),i=r.redSqr(),n=e.redSub(i),o=e.redMul(i),d=n.redMul(i.redAdd(this.curve.a24.redMul(n)));return this.curve.point(o,d)},Point.prototype.add=function(t){throw new Error("Not supported on Montgomery curve")},Point.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),i=this.x.redSub(this.z),n=t.x.redAdd(t.z),o=t.x.redSub(t.z),d=o.redMul(r),s=n.redMul(i),u=e.z.redMul(d.redAdd(s).redSqr()),h=e.x.redMul(d.redISub(s).redSqr());return this.curve.point(u,h)},Point.prototype.mul=function(t){for(var e=t.clone(),r=this,i=this.curve.point(null,null),n=this,o=[];0!==e.cmpn(0);e.ishrn(1))o.push(e.andln(1));for(var d=o.length-1;d>=0;d--)0===o[d]?(r=r.diffAdd(i,n),i=i.dbl()):(i=r.diffAdd(i,n),r=r.dbl());return i},Point.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},Point.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},Point.prototype.getX=function(){return this.normalize(),this.x.fromRed()}; -},{"../../elliptic":29,"../curve":32,"bn.js":27,"inherits":142}],34:[function(require,module,exports){ -function ShortCurve(r){Base.call(this,"short",r),this.a=new bn(r.a,16).toRed(this.red),this.b=new bn(r.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(r),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function Point(r,e,t,d){Base.BasePoint.call(this,r,"affine"),null===e&&null===t?(this.x=null,this.y=null,this.inf=!0):(this.x=new bn(e,16),this.y=new bn(t,16),d&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function JPoint(r,e,t,d){Base.BasePoint.call(this,r,"jacobian"),null===e&&null===t&&null===d?(this.x=this.curve.one,this.y=this.curve.one,this.z=new bn(0)):(this.x=new bn(e,16),this.y=new bn(t,16),this.z=new bn(d,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}var curve=require("../curve"),elliptic=require("../../elliptic"),bn=require("bn.js"),inherits=require("inherits"),Base=curve.base,getNAF=elliptic.utils.getNAF,assert=elliptic.utils.assert;inherits(ShortCurve,Base),module.exports=ShortCurve,ShortCurve.prototype._getEndomorphism=function(r){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var e,t;if(r.beta)e=new bn(r.beta,16).toRed(this.red);else{var d=this._getEndoRoots(this.p);e=d[0].cmp(d[1])<0?d[0]:d[1],e=e.toRed(this.red)}if(r.lambda)t=new bn(r.lambda,16);else{var i=this._getEndoRoots(this.n);0===this.g.mul(i[0]).x.cmp(this.g.x.redMul(e))?t=i[0]:(t=i[1],assert(0===this.g.mul(t).x.cmp(this.g.x.redMul(e))))}var n;return n=r.basis?r.basis.map(function(r){return{a:new bn(r.a,16),b:new bn(r.b,16)}}):this._getEndoBasis(t),{beta:e,lambda:t,basis:n}}},ShortCurve.prototype._getEndoRoots=function(r){var e=r===this.p?this.red:bn.mont(r),t=new bn(2).toRed(e).redInvm(),d=t.redNeg(),i=(new bn(1).toRed(e),new bn(3).toRed(e).redNeg().redSqrt().redMul(t)),n=d.redAdd(i).fromRed(),s=d.redSub(i).fromRed();return[n,s]},ShortCurve.prototype._getEndoBasis=function(r){for(var e,t,d,i,n,s,u,o=this.n.shrn(Math.floor(this.n.bitLength()/2)),h=r,l=this.n.clone(),p=new bn(1),a=new bn(0),b=new bn(0),f=new bn(1),c=0;0!==h.cmpn(0);){var S=l.div(h),v=l.sub(S.mul(h)),I=b.sub(S.mul(p)),y=f.sub(S.mul(a));if(!d&&v.cmp(o)<0)e=u.neg(),t=p,d=v.neg(),i=I;else if(d&&2===++c)break;u=v,l=h,h=v,b=p,p=I,f=a,a=y}n=v.neg(),s=I;var A=d.sqr().add(i.sqr()),m=n.sqr().add(s.sqr());return m.cmp(A)>=0&&(n=e,s=t),d.sign&&(d=d.neg(),i=i.neg()),n.sign&&(n=n.neg(),s=s.neg()),[{a:d,b:i},{a:n,b:s}]},ShortCurve.prototype._endoSplit=function(r){var e=this.endo.basis,t=e[0],d=e[1],i=d.b.mul(r).divRound(this.n),n=t.b.neg().mul(r).divRound(this.n),s=i.mul(t.a),u=n.mul(d.a),o=i.mul(t.b),h=n.mul(d.b),l=r.sub(s).sub(u),p=o.add(h).neg();return{k1:l,k2:p}},ShortCurve.prototype.point=function(r,e,t){return new Point(this,r,e,t)},ShortCurve.prototype.pointFromX=function(r,e){e=new bn(e,16),e.red||(e=e.toRed(this.red));var t=e.redSqr().redMul(e).redIAdd(e.redMul(this.a)).redIAdd(this.b),d=t.redSqrt(),i=d.fromRed().isOdd();return(r&&!i||!r&&i)&&(d=d.redNeg()),this.point(e,d)},ShortCurve.prototype.jpoint=function(r,e,t){return new JPoint(this,r,e,t)},ShortCurve.prototype.pointFromJSON=function(r,e){return Point.fromJSON(this,r,e)},ShortCurve.prototype.validate=function(r){if(r.inf)return!0;var e=r.x,t=r.y,d=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(d).redIAdd(this.b);return 0===t.redSqr().redISub(i).cmpn(0)},ShortCurve.prototype._endoWnafMulAdd=function(r,e){for(var t=this._endoWnafT1,d=this._endoWnafT2,i=0;ih;h++)t[h]=null,d[h]=null;return o},inherits(Point,Base.BasePoint),Point.prototype._getBeta=function(){function r(r){return d.point(r.x.redMul(d.endo.beta),r.y)}if(this.curve.endo){var e=this.precomputed;if(e&&e.beta)return e.beta;var t=this.curve.point(this.x.redMul(this.curve.endo.beta),this.y);if(e){var d=this.curve;e.beta=t,t.precomputed={beta:null,naf:e.naf&&{wnd:e.naf.wnd,points:e.naf.points.map(r)},doubles:e.doubles&&{step:e.doubles.step,points:e.doubles.points.map(r)}}}return t}},Point.prototype.toJSON=function(){return this.precomputed?[this.x,this.y,this.precomputed&&{doubles:this.precomputed.doubles&&{step:this.precomputed.doubles.step,points:this.precomputed.doubles.points.slice(1)},naf:this.precomputed.naf&&{wnd:this.precomputed.naf.wnd,points:this.precomputed.naf.points.slice(1)}}]:[this.x,this.y]},Point.fromJSON=function(r,e,t){function d(e){return r.point(e[0],e[1],t)}"string"==typeof e&&(e=JSON.parse(e));var i=r.point(e[0],e[1],t);if(!e[2])return i;var n=e[2];return i.precomputed={beta:null,doubles:n.doubles&&{step:n.doubles.step,points:[i].concat(n.doubles.points.map(d))},naf:n.naf&&{wnd:n.naf.wnd,points:[i].concat(n.naf.points.map(d))}},i},Point.prototype.inspect=function(){return this.isInfinity()?"":""},Point.prototype.isInfinity=function(){return this.inf},Point.prototype.add=function(r){if(this.inf)return r;if(r.inf)return this;if(this.eq(r))return this.dbl();if(this.neg().eq(r))return this.curve.point(null,null);if(0===this.x.cmp(r.x))return this.curve.point(null,null);var e=this.y.redSub(r.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(r.x).redInvm()));var t=e.redSqr().redISub(this.x).redISub(r.x),d=e.redMul(this.x.redSub(t)).redISub(this.y);return this.curve.point(t,d)},Point.prototype.dbl=function(){if(this.inf)return this;var r=this.y.redAdd(this.y);if(0===r.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,t=this.x.redSqr(),d=r.redInvm(),i=t.redAdd(t).redIAdd(t).redIAdd(e).redMul(d),n=i.redSqr().redISub(this.x.redAdd(this.x)),s=i.redMul(this.x.redSub(n)).redISub(this.y);return this.curve.point(n,s)},Point.prototype.getX=function(){return this.x.fromRed()},Point.prototype.getY=function(){return this.y.fromRed()},Point.prototype.mul=function(r){return r=new bn(r,16),this.precomputed&&this.precomputed.doubles?this.curve._fixedNafMul(this,r):this.curve.endo?this.curve._endoWnafMulAdd([this],[r]):this.curve._wnafMul(this,r)},Point.prototype.mulAdd=function(r,e,t){var d=[this,e],i=[r,t];return this.curve.endo?this.curve._endoWnafMulAdd(d,i):this.curve._wnafMulAdd(1,d,i,2)},Point.prototype.eq=function(r){return this===r||this.inf===r.inf&&(this.inf||0===this.x.cmp(r.x)&&0===this.y.cmp(r.y))},Point.prototype.neg=function(r){function e(r){return r.neg()}if(this.inf)return this;var t=this.curve.point(this.x,this.y.redNeg());if(r&&this.precomputed){var d=this.precomputed;t.precomputed={naf:d.naf&&{wnd:d.naf.wnd,points:d.naf.points.map(e)},doubles:d.doubles&&{step:d.doubles.step,points:d.doubles.points.map(e)}}}return t},Point.prototype.toJ=function(){if(this.inf)return this.curve.jpoint(null,null,null);var r=this.curve.jpoint(this.x,this.y,this.curve.one);return r},inherits(JPoint,Base.BasePoint),JPoint.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var r=this.z.redInvm(),e=r.redSqr(),t=this.x.redMul(e),d=this.y.redMul(e).redMul(r);return this.curve.point(t,d)},JPoint.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},JPoint.prototype.add=function(r){if(this.isInfinity())return r;if(r.isInfinity())return this;var e=r.z.redSqr(),t=this.z.redSqr(),d=this.x.redMul(e),i=r.x.redMul(t),n=this.y.redMul(e.redMul(r.z)),s=r.y.redMul(t.redMul(this.z)),u=d.redSub(i),o=n.redSub(s);if(0===u.cmpn(0))return 0!==o.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var h=u.redSqr(),l=h.redMul(u),p=d.redMul(h),a=o.redSqr().redIAdd(l).redISub(p).redISub(p),b=o.redMul(p.redISub(a)).redISub(n.redMul(l)),f=this.z.redMul(r.z).redMul(u);return this.curve.jpoint(a,b,f)},JPoint.prototype.mixedAdd=function(r){if(this.isInfinity())return r.toJ();if(r.isInfinity())return this;var e=this.z.redSqr(),t=this.x,d=r.x.redMul(e),i=this.y,n=r.y.redMul(e).redMul(this.z),s=t.redSub(d),u=i.redSub(n);if(0===s.cmpn(0))return 0!==u.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var o=s.redSqr(),h=o.redMul(s),l=t.redMul(o),p=u.redSqr().redIAdd(h).redISub(l).redISub(l),a=u.redMul(l.redISub(p)).redISub(i.redMul(h)),b=this.z.redMul(s);return this.curve.jpoint(p,a,b)},JPoint.prototype.dblp=function(r){if(0===r)return this;if(this.isInfinity())return this;if(!r)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,t=0;r>t;t++)e=e.dbl();return e}for(var d=this.curve.a,i=this.curve.tinv,n=this.x,s=this.y,u=this.z,o=u.redSqr().redSqr(),h=s.redAdd(s),t=0;r>t;t++){var l=n.redSqr(),p=h.redSqr(),a=p.redSqr(),b=l.redAdd(l).redIAdd(l).redIAdd(d.redMul(o)),f=n.redMul(p),c=b.redSqr().redISub(f.redAdd(f)),S=f.redISub(c),v=b.redMul(S);v=v.redIAdd(v).redISub(a);var I=h.redMul(u);r>t+1&&(o=o.redMul(a)),n=c,u=I,h=v}return this.curve.jpoint(n,h.redMul(i),u)},JPoint.prototype.dbl=function(){return this.isInfinity()?this:this.curve.zeroA?this._zeroDbl():this.curve.threeA?this._threeDbl():this._dbl()},JPoint.prototype._zeroDbl=function(){if(this.zOne){var r=this.x.redSqr(),e=this.y.redSqr(),t=e.redSqr(),d=this.x.redAdd(e).redSqr().redISub(r).redISub(t);d=d.redIAdd(d);var i=r.redAdd(r).redIAdd(r),n=i.redSqr().redISub(d).redISub(d),s=t.redIAdd(t);s=s.redIAdd(s),s=s.redIAdd(s);var u=n,o=i.redMul(d.redISub(n)).redISub(s),h=this.y.redAdd(this.y)}else{var l=this.x.redSqr(),p=this.y.redSqr(),a=p.redSqr(),b=this.x.redAdd(p).redSqr().redISub(l).redISub(a);b=b.redIAdd(b);var f=l.redAdd(l).redIAdd(l),c=f.redSqr(),S=a.redIAdd(a);S=S.redIAdd(S),S=S.redIAdd(S);var u=c.redISub(b).redISub(b),o=f.redMul(b.redISub(u)).redISub(S),h=this.y.redMul(this.z);h=h.redIAdd(h)}return this.curve.jpoint(u,o,h)},JPoint.prototype._threeDbl=function(){if(this.zOne){var r=this.x.redSqr(),e=this.y.redSqr(),t=e.redSqr(),d=this.x.redAdd(e).redSqr().redISub(r).redISub(t);d=d.redIAdd(d);var i=r.redAdd(r).redIAdd(r).redIAdd(this.curve.a),n=i.redSqr().redISub(d).redISub(d),s=n,u=t.redIAdd(t);u=u.redIAdd(u),u=u.redIAdd(u);var o=i.redMul(d.redISub(n)).redISub(u),h=this.y.redAdd(this.y)}else{var l=this.z.redSqr(),p=this.y.redSqr(),a=this.x.redMul(p),b=this.x.redSub(l).redMul(this.x.redAdd(l));b=b.redAdd(b).redIAdd(b);var f=a.redIAdd(a);f=f.redIAdd(f);var c=f.redAdd(f),s=b.redSqr().redISub(c),h=this.y.redAdd(this.z).redSqr().redISub(p).redISub(l),S=p.redSqr();S=S.redIAdd(S),S=S.redIAdd(S),S=S.redIAdd(S);var o=b.redMul(f.redISub(s)).redISub(S)}return this.curve.jpoint(s,o,h)},JPoint.prototype._dbl=function(){var r=this.curve.a,e=(this.curve.tinv,this.x),t=this.y,d=this.z,i=d.redSqr().redSqr(),n=e.redSqr(),s=t.redSqr(),u=n.redAdd(n).redIAdd(n).redIAdd(r.redMul(i)),o=e.redAdd(e);o=o.redIAdd(o);var h=o.redMul(s),l=u.redSqr().redISub(h.redAdd(h)),p=h.redISub(l),a=s.redSqr();a=a.redIAdd(a),a=a.redIAdd(a),a=a.redIAdd(a);var b=u.redMul(p).redISub(a),f=t.redAdd(t).redMul(d);return this.curve.jpoint(l,b,f)},JPoint.prototype.trpl=function(){if(!this.curve.zeroA)return this.dbl().add(this);var r=this.x.redSqr(),e=this.y.redSqr(),t=this.z.redSqr(),d=e.redSqr(),i=r.redAdd(r).redIAdd(r),n=i.redSqr(),s=this.x.redAdd(e).redSqr().redISub(r).redISub(d);s=s.redIAdd(s),s=s.redAdd(s).redIAdd(s),s=s.redISub(n);var u=s.redSqr(),o=d.redIAdd(d);o=o.redIAdd(o),o=o.redIAdd(o),o=o.redIAdd(o);var h=i.redIAdd(s).redSqr().redISub(n).redISub(u).redISub(o),l=e.redMul(h);l=l.redIAdd(l),l=l.redIAdd(l);var p=this.x.redMul(u).redISub(l);p=p.redIAdd(p),p=p.redIAdd(p);var a=this.y.redMul(h.redMul(o.redISub(h)).redISub(s.redMul(u)));a=a.redIAdd(a),a=a.redIAdd(a),a=a.redIAdd(a);var b=this.z.redAdd(s).redSqr().redISub(t).redISub(u);return this.curve.jpoint(p,a,b)},JPoint.prototype.mul=function(r,e){return r=new bn(r,e),this.curve._wnafMul(this,r)},JPoint.prototype.eq=function(r){if("affine"===r.type)return this.eq(r.toJ());if(this===r)return!0;var e=this.z.redSqr(),t=r.z.redSqr();if(0!==this.x.redMul(t).redISub(r.x.redMul(e)).cmpn(0))return!1;var d=e.redMul(this.z),i=t.redMul(r.z);return 0===this.y.redMul(i).redISub(r.y.redMul(d)).cmpn(0)},JPoint.prototype.inspect=function(){return this.isInfinity()?"":""},JPoint.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}; -},{"../../elliptic":29,"../curve":32,"bn.js":27,"inherits":142}],35:[function(require,module,exports){ -function PresetCurve(f){"short"===f.type?this.curve=new elliptic.curve["short"](f):"edwards"===f.type?this.curve=new elliptic.curve.edwards(f):this.curve=new elliptic.curve.mont(f),this.g=this.curve.g,this.n=this.curve.n,this.hash=f.hash,assert(this.g.validate(),"Invalid curve"),assert(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function defineCurve(f,e){Object.defineProperty(curves,f,{configurable:!0,enumerable:!0,get:function(){var d=new PresetCurve(e);return Object.defineProperty(curves,f,{configurable:!0,enumerable:!0,value:d}),d}})}var curves=exports,hash=require("hash.js"),bn=require("bn.js"),elliptic=require("../elliptic"),assert=elliptic.utils.assert;curves.PresetCurve=PresetCurve,defineCurve("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:hash.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),defineCurve("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:hash.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),defineCurve("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:hash.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),defineCurve("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"0",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:hash.sha256,gRed:!1,g:["9"]}),defineCurve("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:hash.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]}),defineCurve("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:hash.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",{doubles:{step:4,points:[["e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a","f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"],["8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508","11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"],["175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739","d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"],["363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640","4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"],["8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c","4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"],["723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda","96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"],["eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa","5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"],["100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0","cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"],["e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d","9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"],["feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d","e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"],["da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1","9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"],["53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0","5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"],["8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047","10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"],["385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862","283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"],["6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7","7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"],["3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd","56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"],["85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83","7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"],["948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a","53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"],["6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8","bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"],["e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d","4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"],["e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725","7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"],["213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754","4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"],["4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c","17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"],["fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6","6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"],["76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39","c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"],["c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891","893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"],["d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b","febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"],["b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03","2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"],["e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d","eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"],["a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070","7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"],["90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4","e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"],["8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da","662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"],["e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11","1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"],["8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e","efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"],["e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41","2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"],["b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef","67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"],["d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8","db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"],["324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d","648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"],["4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96","35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"],["9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd","ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"],["6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5","9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"],["a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266","40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"],["7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71","34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"],["928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac","c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"],["85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751","1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"],["ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e","493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"],["827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241","c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"],["eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3","be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"],["e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f","4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"],["1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19","aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"],["146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be","b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"],["fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9","6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"],["da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2","8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"],["a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13","7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"],["174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c","ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"],["959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba","2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"],["d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151","e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"],["64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073","d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"],["8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458","38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"],["13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b","69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"],["bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366","d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"],["8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa","40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"],["8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0","620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"],["dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787","7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"],["f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e","ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"]]},naf:{wnd:7,points:[["f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9","388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"],["2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4","d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"],["5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc","6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"],["acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe","cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"],["774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb","d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"],["f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8","ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"],["d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e","581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"],["defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34","4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"],["2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c","85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"],["352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5","321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"],["2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f","2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"],["9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714","73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"],["daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729","a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"],["c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db","2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"],["6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4","e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"],["1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5","b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"],["605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479","2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"],["62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d","80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"],["80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f","1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"],["7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb","d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"],["d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9","eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"],["49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963","758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"],["77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74","958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"],["f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530","e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"],["463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b","5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"],["f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247","cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"],["caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1","cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"],["2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120","4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"],["7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435","91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"],["754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18","673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"],["e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8","59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"],["186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb","3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"],["df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f","55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"],["5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143","efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"],["290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba","e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"],["af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45","f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"],["766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a","744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"],["59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e","c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"],["f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8","e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"],["7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c","30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"],["948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519","e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"],["7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab","100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"],["3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca","ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"],["d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf","8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"],["1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610","68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"],["733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4","f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"],["15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c","d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"],["a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940","edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"],["e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980","a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"],["311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3","66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"],["34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf","9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"],["f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63","4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"],["d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448","fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"],["32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf","5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"],["7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5","8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"],["ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6","8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"],["16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5","5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"],["eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99","f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"],["78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51","f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"],["494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5","42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"],["a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5","204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"],["c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997","4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"],["841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881","73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"],["5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5","39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"],["36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66","d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"],["336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726","ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"],["8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede","6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"],["1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94","60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"],["85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31","3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"],["29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51","b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"],["a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252","ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"],["4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5","cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"],["d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b","6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"],["ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4","322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"],["af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f","6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"],["e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889","2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"],["591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246","b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"],["11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984","998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"],["3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a","b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"],["cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030","bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"],["c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197","6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"],["c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593","c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"],["a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef","21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"],["347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38","60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"],["da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a","49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"],["c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111","5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"],["4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502","7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"],["3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea","be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"],["cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26","8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"],["b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986","39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"],["d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e","62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"],["48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4","25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"],["dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda","ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"],["6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859","cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"],["e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f","f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"],["eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c","6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"],["13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942","fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"],["ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a","1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"],["b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80","5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"],["ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d","438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"],["8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1","cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"],["52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63","c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"],["e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352","6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"],["7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193","ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"],["5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00","9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"],["32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58","ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"],["e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7","d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"],["8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8","c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"],["4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e","67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"],["3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d","cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"],["674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b","299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"],["d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f","f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"],["30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6","462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"],["be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297","62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"],["93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a","7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"],["b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c","ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"],["d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52","4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"],["d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb","bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"],["463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065","bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"],["7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917","603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"],["74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9","cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"],["30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3","553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"],["9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57","712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"],["176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66","ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"],["75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8","9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"],["809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721","9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"],["1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180","4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"]]}}]}); -},{"../elliptic":29,"bn.js":27,"hash.js":42}],36:[function(require,module,exports){ -function EC(t){return this instanceof EC?("string"==typeof t&&(assert(elliptic.curves.hasOwnProperty(t),"Unknown curve "+t),t=elliptic.curves[t]),t instanceof elliptic.curves.PresetCurve&&(t={curve:t}),this.curve=t.curve.curve,this.n=this.curve.n,this.nh=this.n.shrn(1),this.g=this.curve.g,this.g=t.curve.g,this.g.precompute(t.curve.n.bitLength()+1),void(this.hash=t.hash||t.curve.hash)):new EC(t)}var bn=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert,KeyPair=require("./key"),Signature=require("./signature");module.exports=EC,EC.prototype.keyPair=function(t,e){return new KeyPair(this,t,e)},EC.prototype.genKeyPair=function(t){t||(t={});for(var e=new elliptic.hmacDRBG({hash:this.hash,pers:t.pers,entropy:t.entropy||elliptic.rand(this.hash.hmacStrength),nonce:this.n.toArray()}),n=this.n.byteLength(),i=this.n.sub(new bn(2));;){var r=new bn(e.generate(n));if(!(r.cmp(i)>0))return r.iaddn(1),this.keyPair(r)}},EC.prototype._truncateToN=function(t,e){var n=8*t.byteLength()-this.n.bitLength();return n>0&&(t=t.shrn(n)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},EC.prototype.sign=function(t,e,n){e=this.keyPair(e,"hex"),t=this._truncateToN(new bn(t,16)),n||(n={});for(var i=this.n.byteLength(),r=e.getPrivate().toArray(),s=r.length;21>s;s++)r.unshift(0);for(var h=t.toArray(),s=h.length;i>s;s++)h.unshift(0);for(var u=new elliptic.hmacDRBG({hash:this.hash,entropy:r,nonce:h}),a=this.n.sub(new bn(1));;){var c=new bn(u.generate(this.n.byteLength()));if(c=this._truncateToN(c,!0),!(c.cmpn(1)<=0||c.cmp(a)>=0)){var o=this.g.mul(c);if(!o.isInfinity()){var p=o.getX().mod(this.n);if(0!==p.cmpn(0)){var v=c.invm(this.n).mul(p.mul(e.getPrivate()).iadd(t)).mod(this.n);if(0!==v.cmpn(0))return n.canonical&&v.cmp(this.nh)>0&&(v=this.n.sub(v)),new Signature(p,v)}}}}},EC.prototype.verify=function(t,e,n){t=this._truncateToN(new bn(t,16)),n=this.keyPair(n,"hex"),e=new Signature(e,"hex");var i=e.r,r=e.s;if(i.cmpn(1)<0||i.cmp(this.n)>=0)return!1;if(r.cmpn(1)<0||r.cmp(this.n)>=0)return!1;var s=r.invm(this.n),h=s.mul(t).mod(this.n),u=s.mul(i).mod(this.n),a=this.g.mulAdd(h,n.getPublic(),u);return a.isInfinity()?!1:0===a.getX().mod(this.n).cmp(i)}; -},{"../../elliptic":29,"./key":37,"./signature":38,"bn.js":27}],37:[function(require,module,exports){ -function KeyPair(t,i,e){return i instanceof KeyPair?i:e instanceof KeyPair?e:(i||(i=e,e=null),null!==i&&"object"==typeof i&&(i.x?(e=i,i=null):(i.priv||i.pub)&&(e=i.pub,i=i.priv)),this.ec=t,this.priv=null,this.pub=null,void(this._importPublicHex(i,e)||("hex"===e&&(e=null),i&&this._importPrivate(i),e&&this._importPublic(e))))}var bn=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert;module.exports=KeyPair,KeyPair.prototype.validate=function(){var t=this.getPublic();return t.isInfinity()?{result:!1,reason:"Invalid public key"}:t.validate()?t.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},KeyPair.prototype.getPublic=function(t,i){if(this.pub||(this.pub=this.ec.g.mul(this.priv)),"string"==typeof t&&(i=t,t=null),!i)return this.pub;for(var e=this.ec.curve.p.byteLength(),r=this.pub.getX().toArray(),n=r.length;e>n;n++)r.unshift(0);if(t)var u=[this.pub.getY().isEven()?2:3].concat(r);else{for(var s=this.pub.getY().toArray(),n=s.length;e>n;n++)s.unshift(0);var u=[4].concat(r,s)}return utils.encode(u,i)},KeyPair.prototype.getPrivate=function(t){return"hex"===t?this.priv.toString(16,2):this.priv},KeyPair.prototype._importPrivate=function(t){this.priv=new bn(t,16),this.priv=this.priv.mod(this.ec.curve.n)},KeyPair.prototype._importPublic=function(t){this.pub=this.ec.curve.point(t.x,t.y)},KeyPair.prototype._importPublicHex=function(t,i){t=utils.toArray(t,i);var e=this.ec.curve.p.byteLength();if(4===t[0]&&t.length-1===2*e)this.pub=this.ec.curve.point(t.slice(1,1+e),t.slice(1+e,1+2*e));else{if(2!==t[0]&&3!==t[0]||t.length-1!==e)return!1;this.pub=this.ec.curve.pointFromX(3===t[0],t.slice(1,1+e))}return!0},KeyPair.prototype.derive=function(t){return t.mul(this.priv).getX()},KeyPair.prototype.sign=function(t){return this.ec.sign(t,this)},KeyPair.prototype.verify=function(t,i){return this.ec.verify(t,i,this)},KeyPair.prototype.inspect=function(){return""}; -},{"../../elliptic":29,"bn.js":27}],38:[function(require,module,exports){ -function Signature(t,r){return t instanceof Signature?t:void(this._importDER(t,r)||(assert(t&&r,"Signature without r or s"),this.r=new bn(t,16),this.s=new bn(r,16)))}var bn=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert;module.exports=Signature,Signature.prototype._importDER=function(t,r){if(t=utils.toArray(t,r),t.length<6||48!==t[0]||2!==t[2])return!1;var e=t[1];if(1+e>t.length)return!1;var n=t[3];if(n>=128)return!1;if(4+n+2>=t.length)return!1;if(2!==t[4+n])return!1;var i=t[5+n];return i>=128?!1:4+n+2+i>t.length?!1:(this.r=new bn(t.slice(4,4+n)),this.s=new bn(t.slice(4+n+2,4+n+2+i)),!0)},Signature.prototype.toDER=function(t){var r=this.r.toArray(),e=this.s.toArray();128&r[0]&&(r=[0].concat(r)),128&e[0]&&(e=[0].concat(e));var n=r.length+e.length+4,i=[48,n,2,r.length];return i=i.concat(r,[2,e.length],e),utils.encode(i,t)}; -},{"../../elliptic":29,"bn.js":27}],39:[function(require,module,exports){ -function HmacDRBG(t){if(!(this instanceof HmacDRBG))return new HmacDRBG(t);this.hash=t.hash,this.predResist=!!t.predResist,this.outLen=this.hash.outSize,this.minEntropy=t.minEntropy||this.hash.hmacStrength,this.reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var e=utils.toArray(t.entropy,t.entropyEnc),i=utils.toArray(t.nonce,t.nonceEnc),s=utils.toArray(t.pers,t.persEnc);assert(e.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,i,s)}var hash=require("hash.js"),elliptic=require("../elliptic"),utils=elliptic.utils,assert=utils.assert;module.exports=HmacDRBG,HmacDRBG.prototype._init=function(t,e,i){var s=t.concat(e).concat(i);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var h=0;h=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(i||[])),this.reseed=1},HmacDRBG.prototype.generate=function(t,e,i,s){if(this.reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(s=i,i=e,e=null),i&&(i=utils.toArray(i,s),this._update(i));for(var h=[];h.length>8,a=255&i;o?e.push(o,a):e.push(a)}else for(var t=0;t=0;){var o;if(i.isOdd()){var a=i.andln(t-1);o=a>(t>>1)-1?(t>>1)-a:a,i.isubn(o)}else o=0;e.push(o);for(var s=0!==i.cmpn(0)&&0===i.andln(t-1)?n+1:1,u=1;s>u;u++)e.push(0);i.ishrn(s)}return e}function getJSF(r,n){var e=[[],[]];r=r.clone(),n=n.clone();for(var t=0,i=0;r.cmpn(-t)>0||n.cmpn(-i)>0;){var o=r.andln(3)+t&3,a=n.andln(3)+i&3;3===o&&(o=-1),3===a&&(a=-1);var s;if(0===(1&o))s=0;else{var u=r.andln(7)+t&7;s=3!==u&&5!==u||2!==a?o:-o}e[0].push(s);var l;if(0===(1&a))l=0;else{var u=n.andln(7)+i&7;l=3!==u&&5!==u||2!==o?a:-a}e[1].push(l),2*t===s+1&&(t=1-t),2*i===l+1&&(i=1-i),r.ishrn(1),n.ishrn(1)}return e}var bn=require("bn.js"),utils=exports;utils.assert=function(r,n){if(!r)throw new Error(n||"Assertion failed")},utils.toArray=toArray,utils.toHex=toHex,utils.encode=function(r,n){return"hex"===n?toHex(r):r},utils.zero2=zero2,utils.getNAF=getNAF,utils.getJSF=getJSF; -},{"bn.js":27}],41:[function(require,module,exports){ -function Rand(n){this.rand=n}var r;if(module.exports=function(n){return r||(r=new Rand(null)),r.generate(n)},module.exports.Rand=Rand,Rand.prototype.generate=function(n){return this._rand(n)},"object"==typeof window)window.crypto&&window.crypto.getRandomValues?Rand.prototype._rand=function(n){var r=new Uint8Array(n);return window.crypto.getRandomValues(r),r}:window.msCrypto&&window.msCrypto.getRandomValues?Rand.prototype._rand=function(n){var r=new Uint8Array(n);return window.msCrypto.getRandomValues(r),r}:Rand.prototype._rand=function(){throw new Error("Not implemented yet")};else try{var crypto=require("crypto");Rand.prototype._rand=function(n){return crypto.randomBytes(n)}}catch(e){Rand.prototype._rand=function(n){for(var r=new Uint8Array(n),t=0;t=this._delta8){t=this.pending;var h=t.length%this._delta8;this.pending=t.slice(t.length-h,t.length),0===this.pending.length&&(this.pending=null),t=utils.join32(t,0,t.length-h,this.endian);for(var s=0;sn;n++)s[n]=0;if(t<<=3,"big"===this.endian){for(var e=8;e>>24&255,s[n++]=t>>>16&255,s[n++]=t>>>8&255,s[n++]=255&t}else{s[n++]=255&t,s[n++]=t>>>8&255,s[n++]=t>>>16&255,s[n++]=t>>>24&255,s[n++]=0,s[n++]=0,s[n++]=0,s[n++]=0;for(var e=8;ethis.blockSize&&(t=(new this.Hash).update(t).digest()),assert(t.length<=this.blockSize);for(var i=t.length;i=t?h^s^i:31>=t?h&s|~h&i:47>=t?(h|~s)^i:63>=t?h&i|s&~i:h^(s|~i)}function K(t){return 15>=t?0:31>=t?1518500249:47>=t?1859775393:63>=t?2400959708:2840853838}function Kh(t){return 15>=t?1352829926:31>=t?1548603684:47>=t?1836072691:63>=t?2053994217:0}var hash=require("../hash"),utils=hash.utils,rotl32=utils.rotl32,sum32=utils.sum32,sum32_3=utils.sum32_3,sum32_4=utils.sum32_4,BlockHash=hash.common.BlockHash;utils.inherits(RIPEMD160,BlockHash),exports.ripemd160=RIPEMD160,RIPEMD160.blockSize=512,RIPEMD160.outSize=160,RIPEMD160.hmacStrength=192,RIPEMD160.padLength=64,RIPEMD160.prototype._update=function(t,h){for(var i=this.h[0],u=this.h[1],l=this.h[2],o=this.h[3],e=this.h[4],n=i,m=u,a=l,c=o,_=e,D=0;80>D;D++){var E=sum32(rotl32(sum32_4(i,f(D,u,l,o),t[r[D]+h],K(D)),s[D]),e);i=e,e=o,o=rotl32(l,10),l=u,u=E,E=sum32(rotl32(sum32_4(n,f(79-D,m,a,c),t[rh[D]+h],Kh(D)),sh[D]),_),n=_,_=c,c=rotl32(a,10),a=m,m=E}E=sum32_3(this.h[1],l,c),this.h[1]=sum32_3(this.h[2],o,_),this.h[2]=sum32_3(this.h[3],e,n),this.h[3]=sum32_3(this.h[4],i,m),this.h[4]=sum32_3(this.h[0],u,a),this.h[0]=E},RIPEMD160.prototype._digest=function(t){return"hex"===t?utils.toHex32(this.h,"little"):utils.split32(this.h,"little")};var r=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],rh=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],s=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],sh=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]; -},{"../hash":42}],46:[function(require,module,exports){ -function SHA256(){return this instanceof SHA256?(BlockHash.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=sha256_K,void(this.W=new Array(64))):new SHA256}function SHA224(){return this instanceof SHA224?(SHA256.call(this),void(this.h=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])):new SHA224}function SHA512(){return this instanceof SHA512?(BlockHash.call(this),this.h=[1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209],this.k=sha512_K,void(this.W=new Array(160))):new SHA512}function SHA384(){return this instanceof SHA384?(SHA512.call(this),void(this.h=[3418070365,3238371032,1654270250,914150663,2438529370,812702999,355462360,4144912697,1731405415,4290775857,2394180231,1750603025,3675008525,1694076839,1203062813,3204075428])):new SHA384}function SHA1(){return this instanceof SHA1?(BlockHash.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],void(this.W=new Array(80))):new SHA1}function ch32(t,h,s){return t&h^~t&s}function maj32(t,h,s){return t&h^t&s^h&s}function p32(t,h,s){return t^h^s}function s0_256(t){return rotr32(t,2)^rotr32(t,13)^rotr32(t,22)}function s1_256(t){return rotr32(t,6)^rotr32(t,11)^rotr32(t,25)}function g0_256(t){return rotr32(t,7)^rotr32(t,18)^t>>>3}function g1_256(t){return rotr32(t,17)^rotr32(t,19)^t>>>10}function ft_1(t,h,s,i){return 0===t?ch32(h,s,i):1===t||3===t?p32(h,s,i):2===t?maj32(h,s,i):void 0}function ch64_hi(t,h,s,i,r,o){var u=t&s^~t&r;return 0>u&&(u+=4294967296),u}function ch64_lo(t,h,s,i,r,o){var u=h&i^~h&o;return 0>u&&(u+=4294967296),u}function maj64_hi(t,h,s,i,r,o){var u=t&s^t&r^s&r;return 0>u&&(u+=4294967296),u}function maj64_lo(t,h,s,i,r,o){var u=h&i^h&o^i&o;return 0>u&&(u+=4294967296),u}function s0_512_hi(t,h){var s=rotr64_hi(t,h,28),i=rotr64_hi(h,t,2),r=rotr64_hi(h,t,7),o=s^i^r;return 0>o&&(o+=4294967296),o}function s0_512_lo(t,h){var s=rotr64_lo(t,h,28),i=rotr64_lo(h,t,2),r=rotr64_lo(h,t,7),o=s^i^r;return 0>o&&(o+=4294967296),o}function s1_512_hi(t,h){var s=rotr64_hi(t,h,14),i=rotr64_hi(t,h,18),r=rotr64_hi(h,t,9),o=s^i^r;return 0>o&&(o+=4294967296),o}function s1_512_lo(t,h){var s=rotr64_lo(t,h,14),i=rotr64_lo(t,h,18),r=rotr64_lo(h,t,9),o=s^i^r;return 0>o&&(o+=4294967296),o}function g0_512_hi(t,h){var s=rotr64_hi(t,h,1),i=rotr64_hi(t,h,8),r=shr64_hi(t,h,7),o=s^i^r;return 0>o&&(o+=4294967296),o}function g0_512_lo(t,h){var s=rotr64_lo(t,h,1),i=rotr64_lo(t,h,8),r=shr64_lo(t,h,7),o=s^i^r;return 0>o&&(o+=4294967296),o}function g1_512_hi(t,h){var s=rotr64_hi(t,h,19),i=rotr64_hi(h,t,29),r=shr64_hi(t,h,6),o=s^i^r;return 0>o&&(o+=4294967296),o}function g1_512_lo(t,h){var s=rotr64_lo(t,h,19),i=rotr64_lo(h,t,29),r=shr64_lo(t,h,6),o=s^i^r;return 0>o&&(o+=4294967296),o}var hash=require("../hash"),utils=hash.utils,assert=utils.assert,rotr32=utils.rotr32,rotl32=utils.rotl32,sum32=utils.sum32,sum32_4=utils.sum32_4,sum32_5=utils.sum32_5,rotr64_hi=utils.rotr64_hi,rotr64_lo=utils.rotr64_lo,shr64_hi=utils.shr64_hi,shr64_lo=utils.shr64_lo,sum64=utils.sum64,sum64_hi=utils.sum64_hi,sum64_lo=utils.sum64_lo,sum64_4_hi=utils.sum64_4_hi,sum64_4_lo=utils.sum64_4_lo,sum64_5_hi=utils.sum64_5_hi,sum64_5_lo=utils.sum64_5_lo,BlockHash=hash.common.BlockHash,sha256_K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],sha512_K=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],sha1_K=[1518500249,1859775393,2400959708,3395469782];utils.inherits(SHA256,BlockHash),exports.sha256=SHA256,SHA256.blockSize=512,SHA256.outSize=256,SHA256.hmacStrength=192,SHA256.padLength=64,SHA256.prototype._update=function(t,h){for(var s=this.W,i=0;16>i;i++)s[i]=t[h+i];for(;ii;i++)s[i]=t[h+i];for(;ii;i++)s[i]=t[h+i];for(;i>8,s=255&o;e?n.push(e,s):n.push(s)}else for(var u=0;u>>24|r>>>8&65280|r<<8&16711680|(255&r)<<24;return t>>>0}function toHex32(r,t){for(var n="",u=0;u>>0}return e}function split32(r,t){for(var n=new Array(4*r.length),u=0,o=0;u>>24,n[o+1]=e>>>16&255,n[o+2]=e>>>8&255,n[o+3]=255&e):(n[o+3]=e>>>24,n[o+2]=e>>>16&255,n[o+1]=e>>>8&255,n[o]=255&e)}return n}function rotr32(r,t){return r>>>t|r<<32-t}function rotl32(r,t){return r<>>32-t}function sum32(r,t){return r+t>>>0}function sum32_3(r,t,n){return r+t+n>>>0}function sum32_4(r,t,n,u){return r+t+n+u>>>0}function sum32_5(r,t,n,u,o){return r+t+n+u+o>>>0}function assert(r,t){if(!r)throw new Error(t||"Assertion failed")}function sum64(r,t,n,u){var o=r[t],e=r[t+1],s=u+e>>>0,i=(u>s?1:0)+n+o;r[t]=i>>>0,r[t+1]=s}function sum64_hi(r,t,n,u){var o=t+u>>>0,e=(t>o?1:0)+r+n;return e>>>0}function sum64_lo(r,t,n,u){var o=t+u;return o>>>0}function sum64_4_hi(r,t,n,u,o,e,s,i){var l=0,h=t;h=h+u>>>0,l+=t>h?1:0,h=h+e>>>0,l+=e>h?1:0,h=h+i>>>0,l+=i>h?1:0;var _=r+n+o+s+l;return _>>>0}function sum64_4_lo(r,t,n,u,o,e,s,i){var l=t+u+e+i;return l>>>0}function sum64_5_hi(r,t,n,u,o,e,s,i,l,h){var _=0,a=t;a=a+u>>>0,_+=t>a?1:0,a=a+e>>>0,_+=e>a?1:0,a=a+i>>>0,_+=i>a?1:0,a=a+h>>>0,_+=h>a?1:0;var f=r+n+o+s+l+_;return f>>>0}function sum64_5_lo(r,t,n,u,o,e,s,i,l,h){var _=t+u+e+i+h;return _>>>0}function rotr64_hi(r,t,n){var u=t<<32-n|r>>>n;return u>>>0}function rotr64_lo(r,t,n){var u=r<<32-n|t>>>n;return u>>>0}function shr64_hi(r,t,n){return r>>>n}function shr64_lo(r,t,n){var u=r<<32-n|t>>>n;return u>>>0}var utils=exports,inherits=require("inherits");utils.toArray=toArray,utils.toHex=toHex,utils.htonl=htonl,utils.toHex32=toHex32,utils.zero2=zero2,utils.zero8=zero8,utils.join32=join32,utils.split32=split32,utils.rotr32=rotr32,utils.rotl32=rotl32,utils.sum32=sum32,utils.sum32_3=sum32_3,utils.sum32_4=sum32_4,utils.sum32_5=sum32_5,utils.assert=assert,utils.inherits=inherits,exports.sum64=sum64,exports.sum64_hi=sum64_hi,exports.sum64_lo=sum64_lo,exports.sum64_4_hi=sum64_4_hi,exports.sum64_4_lo=sum64_4_lo,exports.sum64_5_hi=sum64_5_hi,exports.sum64_5_lo=sum64_5_lo,exports.rotr64_hi=rotr64_hi,exports.rotr64_lo=rotr64_lo,exports.shr64_hi=shr64_hi,exports.shr64_lo=shr64_lo; -},{"inherits":142}],48:[function(require,module,exports){ -module.exports={"name":"elliptic","version":"1.0.1","description":"EC cryptography","main":"lib/elliptic.js","scripts":{"test":"mocha --reporter=spec test/*-test.js"},"repository":{"type":"git","url":"git@github.com:indutny/elliptic"},"keywords":["EC","Elliptic","curve","Cryptography"],"author":{"name":"Fedor Indutny","email":"fedor@indutny.com"},"license":"MIT","bugs":{"url":"https://github.com/indutny/elliptic/issues"},"homepage":"https://github.com/indutny/elliptic","devDependencies":{"browserify":"^3.44.2","mocha":"^1.18.2","uglify-js":"^2.4.13"},"dependencies":{"bn.js":"^1.0.0","brorand":"^1.0.1","hash.js":"^1.0.0","inherits":"^2.0.1"},"gitHead":"17dc013761dd1efcfb868e2b06b0b897627b40be","_id":"elliptic@1.0.1","_shasum":"d180376b66a17d74995c837796362ac4d22aefe3","_from":"elliptic@>=1.0.0 <2.0.0","_npmVersion":"1.4.28","_npmUser":{"name":"indutny","email":"fedor@indutny.com"},"maintainers":[{"name":"indutny","email":"fedor@indutny.com"}],"dist":{"shasum":"d180376b66a17d74995c837796362ac4d22aefe3","tarball":"http://registry.npmjs.org/elliptic/-/elliptic-1.0.1.tgz"},"directories":{},"_resolved":"https://registry.npmjs.org/elliptic/-/elliptic-1.0.1.tgz","readme":"ERROR: No README data found!"} -},{}],49:[function(require,module,exports){ -(function (Buffer){ -module.exports=function(e,r,f,t){t/=8;for(var a,u,d,i=0,n=new Buffer(t),o=0;;){if(a=e.createHash("md5"),o++>0&&a.update(u),a.update(r),a.update(f),u=a.digest(),d=0,t>0)for(;;){if(0===t)break;if(d===u.length)break;n[i++]=u[d++],t--}if(0===t)break}for(d=0;d=0&&255>=e))return t.error("non-byte EncoderBuffer value");this.value=e,this.length=1}else if("string"==typeof e)this.value=e,this.length=Buffer.byteLength(e);else{if(!Buffer.isBuffer(e))return t.error("Unsupported type: "+typeof e);this.value=e,this.length=e.length}}var inherits=require("inherits"),Reporter=require("../base").Reporter,Buffer=require("buffer").Buffer;inherits(DecoderBuffer,Reporter),exports.DecoderBuffer=DecoderBuffer,DecoderBuffer.prototype.save=function(){return{offset:this.offset}},DecoderBuffer.prototype.restore=function(e){var t=new DecoderBuffer(this.base);return t.offset=e.offset,t.length=this.offset,this.offset=e.offset,t},DecoderBuffer.prototype.isEmpty=function(){return this.offset===this.length},DecoderBuffer.prototype.readUInt8=function(e){return this.offset+1<=this.length?this.base.readUInt8(this.offset++,!0):this.error(e||"DecoderBuffer overrun")},DecoderBuffer.prototype.skip=function(e,t){if(!(this.offset+e<=this.length))return this.error(t||"DecoderBuffer overrun");var r=new DecoderBuffer(this.base);return r._reporterState=this._reporterState,r.offset=this.offset,r.length=this.offset+e,this.offset+=e,r},DecoderBuffer.prototype.raw=function(e){return this.base.slice(e?e.offset:this.offset,this.length)},exports.EncoderBuffer=EncoderBuffer,EncoderBuffer.prototype.join=function(e,t){return e||(e=new Buffer(this.length)),t||(t=0),0===this.length?e:(Array.isArray(this.value)?this.value.forEach(function(r){r.join(e,t),t+=r.length}):("number"==typeof this.value?e[t]=this.value:"string"==typeof this.value?e.write(this.value,t):Buffer.isBuffer(this.value)&&this.value.copy(e,t),t+=this.length),e)}; -},{"../base":58,"buffer":2,"inherits":142}],58:[function(require,module,exports){ -var base=exports;base.Reporter=require("./reporter").Reporter,base.DecoderBuffer=require("./buffer").DecoderBuffer,base.EncoderBuffer=require("./buffer").EncoderBuffer,base.Node=require("./node"); -},{"./buffer":57,"./node":59,"./reporter":60}],59:[function(require,module,exports){ -function Node(e,t){var r={};this._baseState=r,r.enc=e,r.parent=t||null,r.children=null,r.tag=null,r.args=null,r.reverseArgs=null,r.choice=null,r.optional=!1,r.any=!1,r.obj=!1,r.use=null,r.useDecoder=null,r.key=null,r["default"]=null,r.explicit=null,r.implicit=null,r.parent||(r.children=[],this._wrap())}var Reporter=require("../base").Reporter,EncoderBuffer=require("../base").EncoderBuffer,assert=require("minimalistic-assert"),tags=["seq","seqof","set","setof","octstr","bitstr","objid","bool","gentime","utctime","null_","enum","int","ia5str"],methods=["key","obj","use","optional","explicit","implicit","def","choice","any"].concat(tags),overrided=["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"];module.exports=Node;var stateProps=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit"];Node.prototype.clone=function(){var e=this._baseState,t={};stateProps.forEach(function(r){t[r]=e[r]});var r=new this.constructor(t.parent);return r._baseState=t,r},Node.prototype._wrap=function(){var e=this._baseState;methods.forEach(function(t){this[t]=function(){var r=new this.constructor(this);return e.children.push(r),r[t].apply(r,arguments)}},this)},Node.prototype._init=function(e){var t=this._baseState;assert(null===t.parent),e.call(this),t.children=t.children.filter(function(e){return e._baseState.parent===this},this),assert.equal(t.children.length,1,"Root node can have only one child")},Node.prototype._useArgs=function(e){var t=this._baseState,r=e.filter(function(e){return e instanceof this.constructor},this);e=e.filter(function(e){return!(e instanceof this.constructor)},this),0!==r.length&&(assert(null===t.children),t.children=r,r.forEach(function(e){e._baseState.parent=this},this)),0!==e.length&&(assert(null===t.args),t.args=e,t.reverseArgs=e.map(function(e){if("object"!=typeof e||e.constructor!==Object)return e;var t={};return Object.keys(e).forEach(function(r){r==(0|r)&&(r|=0);var i=e[r];t[i]=r}),t}))},overrided.forEach(function(e){Node.prototype[e]=function(){var t=this._baseState;throw new Error(e+" not implemented for encoding: "+t.enc)}}),tags.forEach(function(e){Node.prototype[e]=function(){var t=this._baseState,r=Array.prototype.slice.call(arguments);return assert(null===t.tag),t.tag=e,this._useArgs(r),this}}),Node.prototype.use=function(e){var t=this._baseState;return assert(null===t.use),t.use=e,this},Node.prototype.optional=function(){var e=this._baseState;return e.optional=!0,this},Node.prototype.def=function(e){var t=this._baseState;return assert(null===t["default"]),t["default"]=e,t.optional=!0,this},Node.prototype.explicit=function(e){var t=this._baseState;return assert(null===t.explicit&&null===t.implicit),t.explicit=e,this},Node.prototype.implicit=function(e){var t=this._baseState;return assert(null===t.explicit&&null===t.implicit),t.implicit=e,this},Node.prototype.obj=function(){var e=this._baseState,t=Array.prototype.slice.call(arguments);return e.obj=!0,0!==t.length&&this._useArgs(t),this},Node.prototype.key=function(e){var t=this._baseState;return assert(null===t.key),t.key=e,this},Node.prototype.any=function(){var e=this._baseState;return e.any=!0,this},Node.prototype.choice=function(e){var t=this._baseState;return assert(null===t.choice),t.choice=e,this._useArgs(Object.keys(e).map(function(t){return e[t]})),this},Node.prototype._decode=function(e){var t=this._baseState;if(null===t.parent)return e.wrapResult(t.children[0]._decode(e));var r,i=t["default"],o=!0;if(null!==t.key&&(r=e.enterKey(t.key)),t.optional&&(o=this._peekTag(e,null!==t.explicit?t.explicit:null!==t.implicit?t.implicit:t.tag||0),e.isError(o)))return o;var n;if(t.obj&&o&&(n=e.enterObject()),o){if(null!==t.explicit){var s=this._decodeTag(e,t.explicit);if(e.isError(s))return s;e=s}if(null===t.use&&null===t.choice){if(t.any)var a=e.save();var c=this._decodeTag(e,null!==t.implicit?t.implicit:t.tag,t.any);if(e.isError(c))return c;t.any?i=e.raw(a):e=c}if(i=t.any?i:null===t.choice?this._decodeGeneric(t.tag,e):this._decodeChoice(e),e.isError(i))return i;if(!t.any&&null===t.choice&&null!==t.children){var l=t.children.some(function(t){t._decode(e)});if(l)return err}}return t.obj&&o&&(i=e.leaveObject(n)),null===t.key||null===i&&o!==!0||e.leaveKey(r,t.key,i),i},Node.prototype._decodeGeneric=function(e,t){var r=this._baseState;return"seq"===e||"set"===e?null:"seqof"===e||"setof"===e?this._decodeList(t,e,r.args[0]):"octstr"===e||"bitstr"===e||"ia5str"===e?this._decodeStr(t,e):"objid"===e&&r.args?this._decodeObjid(t,r.args[0],r.args[1]):"objid"===e?this._decodeObjid(t,null,null):"gentime"===e||"utctime"===e?this._decodeTime(t,e):"null_"===e?this._decodeNull(t):"bool"===e?this._decodeBool(t):"int"===e||"enum"===e?this._decodeInt(t,r.args&&r.args[0]):null!==r.use?this._getUse(r.use,t._reporterState.obj)._decode(t):t.error("unknown tag: "+e)},Node.prototype._getUse=function(e,t){var r=this._baseState;return r.useDecoder=this._use(e,t),assert(null===r.useDecoder._baseState.parent),r.useDecoder=r.useDecoder._baseState.children[0],r.implicit!==r.useDecoder._baseState.implicit&&(r.useDecoder=r.useDecoder.clone(),r.useDecoder._baseState.implicit=r.implicit),r.useDecoder},Node.prototype._decodeChoice=function(e){var t=this._baseState,r=null,i=!1;return Object.keys(t.choice).some(function(o){var n=e.save(),s=t.choice[o];try{var a=s._decode(e);if(e.isError(a))return!1;r={type:o,value:a},i=!0}catch(c){return e.restore(n),!1}return!0},this),i?r:e.error("Choice not matched")},Node.prototype._createEncoderBuffer=function(e){return new EncoderBuffer(e,this.reporter)},Node.prototype._encode=function(e,t,r){var i=this._baseState;if(null===i["default"]||i["default"]!==e){var o=this._encodeValue(e,t,r);if(void 0!==o&&!this._skipDefault(o,t,r))return o}},Node.prototype._encodeValue=function(e,t,r){var i=this._baseState;if(null===i.parent)return i.children[0]._encode(e,t||new Reporter);var o=null;if(this.reporter=t,i.optional&&void 0===e){if(null===i["default"])return;e=i["default"]}var n=null,s=!1;if(i.any)o=this._createEncoderBuffer(e);else if(i.choice)o=this._encodeChoice(e,t);else if(i.children)n=i.children.map(function(r){if("null_"===r._baseState.tag)return r._encode(null,t,e);if(null===r._baseState.key)return t.error("Child should have a key");var i=t.enterKey(r._baseState.key);if("object"!=typeof e)return t.error("Child expected, but input is not object");var o=r._encode(e[r._baseState.key],t,e);return t.leaveKey(i),o},this).filter(function(e){return e}),n=this._createEncoderBuffer(n);else if("seqof"===i.tag||"setof"===i.tag){if(!i.args||1!==i.args.length)return t.error("Too many args for : "+i.tag);if(!Array.isArray(e))return t.error("seqof/setof, but data is not Array");var a=this.clone();a._baseState.implicit=null,n=this._createEncoderBuffer(e.map(function(r){var i=this._baseState;return this._getUse(i.args[0],e)._encode(r,t)},a))}else null!==i.use?o=this._getUse(i.use,r)._encode(e,t):(n=this._encodePrimitive(i.tag,e),s=!0);var o;if(!i.any&&null===i.choice){var c=null!==i.implicit?i.implicit:i.tag,l=null===i.implicit?"universal":"context";null===c?null===i.use&&t.error("Tag could be ommited only for .use()"):null===i.use&&(o=this._encodeComposite(c,s,l,n))}return null!==i.explicit&&(o=this._encodeComposite(i.explicit,!1,"context",o)),o},Node.prototype._encodeChoice=function(e,t){var r=this._baseState,i=r.choice[e.type];return i||assert(!1,e.type+" not found in "+JSON.stringify(Object.keys(r.choice))),i._encode(e.value,t)},Node.prototype._encodePrimitive=function(e,t){var r=this._baseState;if("octstr"===e||"bitstr"===e||"ia5str"===e)return this._encodeStr(t,e);if("objid"===e&&r.args)return this._encodeObjid(t,r.reverseArgs[0],r.args[1]);if("objid"===e)return this._encodeObjid(t,null,null);if("gentime"===e||"utctime"===e)return this._encodeTime(t,e);if("null_"===e)return this._encodeNull();if("int"===e||"enum"===e)return this._encodeInt(t,r.args&&r.reverseArgs[0]);if("bool"===e)return this._encodeBool(t);throw new Error("Unsupported tag: "+e)}; -},{"../base":58,"minimalistic-assert":67}],60:[function(require,module,exports){ -function Reporter(r){this._reporterState={obj:null,path:[],options:r||{},errors:[]}}function ReporterError(r,t){this.path=r,this.rethrow(t)}var inherits=require("inherits");exports.Reporter=Reporter,Reporter.prototype.isError=function(r){return r instanceof ReporterError},Reporter.prototype.enterKey=function(r){return this._reporterState.path.push(r)},Reporter.prototype.leaveKey=function(r,t,e){var o=this._reporterState;o.path=o.path.slice(0,r-1),null!==o.obj&&(o.obj[t]=e)},Reporter.prototype.enterObject=function(){var r=this._reporterState,t=r.obj;return r.obj={},t},Reporter.prototype.leaveObject=function(r){var t=this._reporterState,e=t.obj;return t.obj=r,e},Reporter.prototype.error=function(r){var t,e=this._reporterState,o=r instanceof ReporterError;if(t=o?r:new ReporterError(e.path.map(function(r){return"["+JSON.stringify(r)+"]"}).join(""),r.message||r,r.stack),!e.options.partial)throw t;return o||e.errors.push(t),t},Reporter.prototype.wrapResult=function(r){var t=this._reporterState;return t.options.partial?{result:this.isError(r)?null:r,errors:t.errors}:r},inherits(ReporterError,Error),ReporterError.prototype.rethrow=function(r){return this.message=r+" at: "+(this.path||"(shallow)"),Error.captureStackTrace(this,ReporterError),this}; -},{"inherits":142}],61:[function(require,module,exports){ -var constants=require("../constants");exports.tagClass={0:"universal",1:"application",2:"context",3:"private"},exports.tagClassByName=constants._reverse(exports.tagClass),exports.tag={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str",21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},exports.tagByName=constants._reverse(exports.tag); -},{"../constants":62}],62:[function(require,module,exports){ -var constants=exports;constants._reverse=function(r){var e={};return Object.keys(r).forEach(function(n){(0|n)==n&&(n=0|n);var t=r[n];e[t]=n}),e},constants.der=require("./der"); -},{"./der":61}],63:[function(require,module,exports){ -function DERDecoder(r){this.enc="der",this.name=r.name,this.entity=r,this.tree=new DERNode,this.tree._init(r.body)}function DERNode(r){base.Node.call(this,"der",r)}function derDecodeTag(r,e){var t=r.readUInt8(e);if(r.isError(t))return t;var i=der.tagClass[t>>6],o=0===(32&t);if(31===(31&t)){var n=t;for(t=0;128===(128&n);){if(n=r.readUInt8(e),r.isError(n))return n;t<<=7,t|=127&n}}else t&=31;var d=der.tag[t];return{cls:i,primitive:o,tag:t,tagStr:d}}function derDecodeLen(r,e,t){var i=r.readUInt8(t);if(r.isError(i))return i;if(!e&&128===i)return null;if(0===(128&i))return i;var o=127&i;if(o>=4)return r.error("length octect is too long");i=0;for(var n=0;o>n;n++){i<<=8;var d=r.readUInt8(t);if(r.isError(d))return d;i|=d}return i}var inherits=require("inherits"),asn1=require("../../asn1"),base=asn1.base,bignum=asn1.bignum,der=asn1.constants.der;module.exports=DERDecoder,DERDecoder.prototype.decode=function(r,e){return r instanceof base.DecoderBuffer||(r=new base.DecoderBuffer(r,e)),this.tree._decode(r,e)},inherits(DERNode,base.Node),DERNode.prototype._peekTag=function(r,e){if(r.isEmpty())return!1;var t=r.save(),i=derDecodeTag(r,'Failed to peek tag: "'+e+'"');return r.isError(i)?i:(r.restore(t),i.tag===e||i.tagStr===e)},DERNode.prototype._decodeTag=function(r,e,t){var i=derDecodeTag(r,'Failed to decode tag of "'+e+'"');if(r.isError(i))return i;var o=derDecodeLen(r,i.primitive,'Failed to get length of "'+e+'"');if(r.isError(o))return o;if(!t&&i.tag!==e&&i.tagStr!==e&&i.tagStr+"of"!==e)return r.error('Failed to match tag: "'+e+'"');if(i.primitive||null!==o)return r.skip(o,'Failed to match body of: "'+e+'"');var n=r.start(),d=this._skipUntilEnd(r,'Failed to skip indefinite length body: "'+this.tag+'"');return r.isError(d)?d:r.cut(n)},DERNode.prototype._skipUntilEnd=function(r,e){for(;;){var t=derDecodeTag(r,e);if(r.isError(t))return t;var i=derDecodeLen(r,t.primitive,e);if(r.isError(i))return i;var o;if(o=t.primitive||null!==i?r.skip(i):this._skipUntilEnd(r,e),r.isError(o))return o;if("end"===t.tagStr)break}},DERNode.prototype._decodeList=function(r,e,t){for(var i=[];!r.isEmpty();){var o=this._peekTag(r,"end");if(r.isError(o))return o;var n=t.decode(r,"der");if(r.isError(n)&&o)break;i.push(n)}return i},DERNode.prototype._decodeStr=function(r,e){if("octstr"===e)return r.raw();if("bitstr"===e){var t=r.readUInt8();return r.isError(t)?t:{unused:t,data:r.raw()}}return"ia5str"===e?r.raw().toString():this.error("Decoding of string type: "+e+" unsupported")},DERNode.prototype._decodeObjid=function(r,e,t){for(var i=[],o=0;!r.isEmpty();){var n=r.readUInt8();o<<=7,o|=127&n,0===(128&n)&&(i.push(o),o=0)}128&n&&i.push(o);var d=i[0]/40|0,a=i[0]%40;return t?result=i:result=[d,a].concat(i.slice(1)),e&&(result=e[result.join(" ")]),result},DERNode.prototype._decodeTime=function(r,e){var t=r.raw().toString();if("gentime"===e)var i=0|t.slice(0,4),o=0|t.slice(4,6),n=0|t.slice(6,8),d=0|t.slice(8,10),a=0|t.slice(10,12),s=0|t.slice(12,14);else{if("utctime"!==e)return this.error("Decoding "+e+" time is not supported yet");var i=0|t.slice(0,2),o=0|t.slice(2,4),n=0|t.slice(4,6),d=0|t.slice(6,8),a=0|t.slice(8,10),s=0|t.slice(10,12);i=70>i?2e3+i:1900+i}return Date.UTC(i,o-1,n,d,a,s,0)},DERNode.prototype._decodeNull=function(r){return null},DERNode.prototype._decodeBool=function(r){var e=r.readUInt8();return r.isError(e)?e:0!==e},DERNode.prototype._decodeInt=function(r,e){var t=0,i=r.raw();if(i.length>3)return new bignum(i);for(;!r.isEmpty();){t<<=8;var o=r.readUInt8();if(r.isError(o))return o;t|=o}return e&&(t=e[t]||t),t},DERNode.prototype._use=function(r,e){return"function"==typeof r&&(r=r(e)),r._getDecoder("der").tree}; -},{"../../asn1":55,"inherits":142}],64:[function(require,module,exports){ -var decoders=exports;decoders.der=require("./der"); -},{"./der":63}],65:[function(require,module,exports){ -function DEREncoder(e){this.enc="der",this.name=e.name,this.entity=e,this.tree=new DERNode,this.tree._init(e.body)}function DERNode(e){base.Node.call(this,"der",e)}function two(e){return 10>=e?"0"+e:e}function encodeTag(e,r,t,n){var o;if("seqof"===e?e="seq":"setof"===e&&(e="set"),der.tagByName.hasOwnProperty(e))o=der.tagByName[e];else{if("number"!=typeof e||(0|e)!==e)return n.error("Unknown tag: "+e);o=e}return o>=31?n.error("Multi-octet tag encoding unsupported"):(r||(o|=32),o|=der.tagClassByName[t||"universal"]<<6)}var inherits=require("inherits"),Buffer=require("buffer").Buffer,asn1=require("../../asn1"),base=asn1.base,bignum=asn1.bignum,der=asn1.constants.der;module.exports=DEREncoder,DEREncoder.prototype.encode=function(e,r){return this.tree._encode(e,r).join()},inherits(DERNode,base.Node),DERNode.prototype._encodeComposite=function(e,r,t,n){var o=encodeTag(e,r,t,this.reporter);if(n.length<128){var i=new Buffer(2);return i[0]=o,i[1]=n.length,this._createEncoderBuffer([i,n])}for(var f=1,u=n.length;u>=256;u>>=8)f++;var i=new Buffer(2+f);i[0]=o,i[1]=128|f;for(var u=1+f,s=n.length;s>0;u--,s>>=8)i[u]=255&s;return this._createEncoderBuffer([i,n])},DERNode.prototype._encodeStr=function(e,r){return"octstr"===r?this._createEncoderBuffer(e):"bitstr"===r?this._createEncoderBuffer([0|e.unused,e.data]):"ia5str"===r?this._createEncoderBuffer(e):this.reporter.error("Encoding of string type: "+r+" unsupported")},DERNode.prototype._encodeObjid=function(e,r,t){if("string"==typeof e){if(!r)return this.reporter.error("string objid given, but no values map found");if(!r.hasOwnProperty(e))return this.reporter.error("objid not found in values map");e=r[e].split(/\s+/g);for(var n=0;n=40)return this.reporter.error("Second objid identifier OOB");e.splice(0,2,40*e[0]+e[1])}for(var o=0,n=0;n=128;i>>=7)o++}for(var f=new Buffer(o),u=f.length-1,n=e.length-1;n>=0;n--){var i=e[n];for(f[u--]=127&i;(i>>=7)>0;)f[u--]=128|127&i}return this._createEncoderBuffer(f)},DERNode.prototype._encodeTime=function(e,r){var t,n=new Date(e);return"gentime"===r?t=[n.getFullYear(),two(n.getUTCMonth()+1),two(n.getUTCDate()),two(n.getUTCHours()),two(n.getUTCMinutes()),two(n.getUTCSeconds()),"Z"].join(""):"utctime"===r?t=[n.getFullYear()%100,two(n.getUTCMonth()+1),two(n.getUTCDate()),two(n.getUTCHours()),two(n.getUTCMinutes()),two(n.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+r+" time is not supported yet"),this._encodeStr(t,"octstr")},DERNode.prototype._encodeNull=function(){return this._createEncoderBuffer("")},DERNode.prototype._encodeInt=function(e,r){if("string"==typeof e){if(!r)return this.reporter.error("String int or enum given, but no values map");if(!r.hasOwnProperty(e))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(e));e=r[e]}if(null!==bignum&&e instanceof bignum){var t=e.toArray();e.sign===!1&&128&t[0]&&t.unshift(0),e=new Buffer(t)}if(Buffer.isBuffer(e)){var n=e.length;0===e.length&&n++;var o=new Buffer(n);return e.copy(o),0===e.length&&(o[0]=0),this._createEncoderBuffer(o)}if(128>e)return this._createEncoderBuffer(e);if(256>e)return this._createEncoderBuffer([0,e]);for(var n=1,i=e;i>=256;i>>=8)n++;for(var o=new Array(n),i=o.length-1;i>=0;i--)o[i]=255&e,e>>=8;return 128&o[0]&&o.unshift(0),this._createEncoderBuffer(new Buffer(o))},DERNode.prototype._encodeBool=function(e){return this._createEncoderBuffer(e?255:0)},DERNode.prototype._use=function(e,r){return"function"==typeof e&&(e=e(r)),e._getEncoder("der").tree},DERNode.prototype._skipDefault=function(e,r,t){var n,o=this._baseState;if(null===o["default"])return!1;var i=e.join();if(void 0===o.defaultBuffer&&(o.defaultBuffer=this._encodeValue(o["default"],r,t).join()),i.length!==o.defaultBuffer.length)return!1;for(n=0;n0&&bits.ishrn(r),bits}function bits2octets(e,t){e=bits2int(e,t),e=e.mod(t);var r=new Buffer(e.toArray());if(r.length=r)throw new Error("invalid sig")}var parseKeys=require("parse-asn1"),elliptic=require("elliptic"),bn=require("bn.js");module.exports=verify; -}).call(this,require("buffer").Buffer) - -},{"bn.js":27,"buffer":2,"elliptic":29,"parse-asn1":53}],71:[function(require,module,exports){ -(function (Buffer){ -function ECDH(e){this.curveType=aliases[e],this.curveType||(this.curveType={name:e}),this.curve=new elliptic.ec(this.curveType.name),this.keys=void 0}function formatReturnValue(e,t,r){Array.isArray(e)||(e=e.toArray());var i=new Buffer(e);if(r&&i.length>5]|=128<<_%32,d[(_+64>>>9<<4)+14]=_;for(var m=1732584193,f=-271733879,i=-1732584194,h=271733878,r=0;r>16)+(_>>16)+(m>>16);return f<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_}var helpers=require("./helpers");module.exports=function(d){return helpers.hash(d,core_md5,16)}; -},{"./helpers":95}],97:[function(require,module,exports){ -(function (Buffer){ -function bytesToWords(r){for(var f=[],n=0,t=0;n>>5]|=r[n]<<24-t%32;return f}function wordsToBytes(r){for(var f=[],n=0;n<32*r.length;n+=8)f.push(r[n>>>5]>>>24-n%32&255);return f}function processBlock(r,f,n){for(var t=0;16>t;t++){var o=n+t,e=f[o];f[o]=16711935&(e<<8|e>>>24)|4278255360&(e<<24|e>>>8)}var u,l,s,h,c,a,i,v,d,p;a=u=r[0],i=l=r[1],v=s=r[2],d=h=r[3],p=c=r[4];for(var g,t=0;80>t;t+=1)g=u+f[n+zl[t]]|0,g+=16>t?f1(l,s,h)+hl[0]:32>t?f2(l,s,h)+hl[1]:48>t?f3(l,s,h)+hl[2]:64>t?f4(l,s,h)+hl[3]:f5(l,s,h)+hl[4],g=0|g,g=rotl(g,sl[t]),g=g+c|0,u=c,c=h,h=rotl(s,10),s=l,l=g,g=a+f[n+zr[t]]|0,g+=16>t?f5(i,v,d)+hr[0]:32>t?f4(i,v,d)+hr[1]:48>t?f3(i,v,d)+hr[2]:64>t?f2(i,v,d)+hr[3]:f1(i,v,d)+hr[4],g=0|g,g=rotl(g,sr[t]),g=g+p|0,a=p,p=d,d=rotl(v,10),v=i,i=g;g=r[1]+s+d|0,r[1]=r[2]+h+p|0,r[2]=r[3]+c+a|0,r[3]=r[4]+u+i|0,r[4]=r[0]+l+v|0,r[0]=g}function f1(r,f,n){return r^f^n}function f2(r,f,n){return r&f|~r&n}function f3(r,f,n){return(r|~f)^n}function f4(r,f,n){return r&n|f&~n}function f5(r,f,n){return r^(f|~n)}function rotl(r,f){return r<>>32-f}function ripemd160(r){var f=[1732584193,4023233417,2562383102,271733878,3285377520];"string"==typeof r&&(r=new Buffer(r,"utf8"));var n=bytesToWords(r),t=8*r.length,o=8*r.length;n[t>>>5]|=128<<24-t%32,n[(t+64>>>9<<4)+14]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8);for(var e=0;ee;e++){var u=f[e];f[e]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var l=wordsToBytes(f);return new Buffer(l)}var zl=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],zr=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],sl=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],sr=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],hl=[0,1518500249,1859775393,2400959708,2840853838],hr=[1352829926,1548603684,1836072691,2053994217,0];module.exports=ripemd160; -}).call(this,require("buffer").Buffer) - -},{"buffer":2}],98:[function(require,module,exports){ -(function (Buffer){ -function Hash(t,i){this._block=new Buffer(t),this._finalSize=i,this._blockSize=t,this._len=0,this._s=0}Hash.prototype.update=function(t,i){"string"==typeof t&&(i=i||"utf8",t=new Buffer(t,i));for(var s=this._len+=t.length,e=this._s||0,h=0,o=this._block;s>e;){for(var l=Math.min(t.length,h+this._blockSize-e%this._blockSize),_=l-h,n=0;_>n;n++)o[e%this._blockSize+n]=t[n+h];e+=_,h+=_,e%this._blockSize===0&&this._update(o)}return this._s=e,this},Hash.prototype.digest=function(t){var i=8*this._len;this._block[this._len%this._blockSize]=128,this._block.fill(0,this._len%this._blockSize+1),i%(8*this._blockSize)>=8*this._finalSize&&(this._update(this._block),this._block.fill(0)),this._block.writeInt32BE(i,this._blockSize-4);var s=this._update(this._block)||this._hash();return t?s.toString(t):s},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},module.exports=Hash; -}).call(this,require("buffer").Buffer) - -},{"buffer":2}],99:[function(require,module,exports){ -var exports=module.exports=function(e){var r=exports[e.toLowerCase()];if(!r)throw new Error(e+" is not supported (we accept pull requests)");return new r};exports.sha1=require("./sha1"),exports.sha224=require("./sha224"),exports.sha256=require("./sha256"),exports.sha384=require("./sha384"),exports.sha512=require("./sha512"); -},{"./sha1":100,"./sha224":101,"./sha256":102,"./sha384":103,"./sha512":104}],100:[function(require,module,exports){ -(function (Buffer){ -function Sha1(){this.init(),this._w=W,Hash.call(this,64,56)}function rol(t,i){return t<>>32-i}var inherits=require("inherits"),Hash=require("./hash"),W=new Array(80);inherits(Sha1,Hash),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(t){function i(){return rol(s[u-3]^s[u-8]^s[u-14]^s[u-16],1)}function h(t,i){s[u]=t;var h=rol(e,5)+i+o+t+r;o=a,a=_,_=rol(n,30),n=e,e=h,u++}var r,s=this._w,e=this._a,n=this._b,_=this._c,a=this._d,o=this._e,u=0;for(r=1518500249;16>u;)h(t.readInt32BE(4*u),n&_|~n&a);for(;20>u;)h(i(),n&_|~n&a);for(r=1859775393;40>u;)h(i(),n^_^a);for(r=-1894007588;60>u;)h(i(),n&_|n&a|_&a);for(r=-899497514;80>u;)h(i(),n^_^a);this._a=e+this._a|0,this._b=n+this._b|0,this._c=_+this._c|0,this._d=a+this._d|0,this._e=o+this._e|0},Sha1.prototype._hash=function(){var t=new Buffer(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},module.exports=Sha1; -}).call(this,require("buffer").Buffer) - -},{"./hash":98,"buffer":2,"inherits":142}],101:[function(require,module,exports){ -(function (Buffer){ -function Sha224(){this.init(),this._w=W,Hash.call(this,64,56)}var inherits=require("inherits"),SHA256=require("./sha256"),Hash=require("./hash"),W=new Array(64);inherits(Sha224,SHA256),Sha224.prototype.init=function(){return this._a=-1056596264,this._b=914150663,this._c=812702999,this._d=-150054599,this._e=-4191439,this._f=1750603025,this._g=1694076839,this._h=-1090891868,this},Sha224.prototype._hash=function(){var t=new Buffer(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},module.exports=Sha224; -}).call(this,require("buffer").Buffer) - -},{"./hash":98,"./sha256":102,"buffer":2,"inherits":142}],102:[function(require,module,exports){ -(function (Buffer){ -function Sha256(){this.init(),this._w=W,Hash.call(this,64,56)}function S(t,i){return t>>>i|t<<32-i}function R(t,i){return t>>>i}function Ch(t,i,h){return t&i^~t&h}function Maj(t,i,h){return t&i^t&h^i&h}function Sigma0256(t){return S(t,2)^S(t,13)^S(t,22)}function Sigma1256(t){return S(t,6)^S(t,11)^S(t,25)}function Gamma0256(t){return S(t,7)^S(t,18)^R(t,3)}function Gamma1256(t){return S(t,17)^S(t,19)^R(t,10)}var inherits=require("inherits"),Hash=require("./hash"),K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],W=new Array(64);inherits(Sha256,Hash),Sha256.prototype.init=function(){return this._a=1779033703,this._b=-1150833019,this._c=1013904242,this._d=-1521486534,this._e=1359893119,this._f=-1694144372,this._g=528734635,this._h=1541459225,this},Sha256.prototype._update=function(t){function i(){return Gamma1256(n[S-2])+n[S-7]+Gamma0256(n[S-15])+n[S-16]}function h(t){n[S]=t;var i=f+Sigma1256(a)+Ch(a,u,o)+K[S]+t,h=Sigma0256(s)+Maj(s,r,_);f=o,o=u,u=a,a=e+i,e=_,_=r,r=s,s=i+h,S++}for(var n=this._w,s=0|this._a,r=0|this._b,_=0|this._c,e=0|this._d,a=0|this._e,u=0|this._f,o=0|this._g,f=0|this._h,S=0;16>S;)h(t.readInt32BE(4*S));for(;64>S;)h(i());this._a=s+this._a|0,this._b=r+this._b|0,this._c=_+this._c|0,this._d=e+this._d|0,this._e=a+this._e|0,this._f=u+this._f|0,this._g=o+this._g|0,this._h=f+this._h|0},Sha256.prototype._hash=function(){var t=new Buffer(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},module.exports=Sha256; -}).call(this,require("buffer").Buffer) - -},{"./hash":98,"buffer":2,"inherits":142}],103:[function(require,module,exports){ -(function (Buffer){ -function Sha384(){this.init(),this._w=W,Hash.call(this,128,112)}var inherits=require("inherits"),SHA512=require("./sha512"),Hash=require("./hash"),W=new Array(160);inherits(Sha384,SHA512),Sha384.prototype.init=function(){return this._a=-876896931,this._b=1654270250,this._c=-1856437926,this._d=355462360,this._e=1731405415,this._f=-1900787065,this._g=-619958771,this._h=1203062813,this._al=-1056596264,this._bl=914150663,this._cl=812702999,this._dl=-150054599,this._el=-4191439,this._fl=1750603025,this._gl=1694076839,this._hl=-1090891868,this},Sha384.prototype._hash=function(){function t(t,h,s){i.writeInt32BE(t,s),i.writeInt32BE(h,s+4)}var i=new Buffer(48);return t(this._a,this._al,0),t(this._b,this._bl,8),t(this._c,this._cl,16),t(this._d,this._dl,24),t(this._e,this._el,32),t(this._f,this._fl,40),i},module.exports=Sha384; -}).call(this,require("buffer").Buffer) - -},{"./hash":98,"./sha512":104,"buffer":2,"inherits":142}],104:[function(require,module,exports){ -(function (Buffer){ -function Sha512(){this.init(),this._w=W,Hash.call(this,128,112)}function S(t,h,i){return t>>>i|h<<32-i}function Ch(t,h,i){return t&h^~t&i}function Maj(t,h,i){return t&h^t&i^h&i}var inherits=require("inherits"),Hash=require("./hash"),K=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],W=new Array(160);inherits(Sha512,Hash),Sha512.prototype.init=function(){return this._a=1779033703,this._b=-1150833019,this._c=1013904242,this._d=-1521486534,this._e=1359893119,this._f=-1694144372,this._g=528734635,this._h=1541459225,this._al=-205731576,this._bl=-2067093701,this._cl=-23791573,this._dl=1595750129,this._el=-1377402159,this._fl=725511199,this._gl=-79577749,this._hl=327033209,this},Sha512.prototype._update=function(t){function h(){var t=l[I-30],h=l[I-30+1],i=S(t,h,1)^S(t,h,8)^t>>>7,a=S(h,t,1)^S(h,t,8)^S(h,t,7);t=l[I-4],h=l[I-4+1];var r=S(t,h,19)^S(h,t,29)^t>>>6,e=S(h,t,19)^S(t,h,29)^S(h,t,6),n=l[I-14],f=l[I-14+1],c=l[I-32],o=l[I-32+1];_=a+f,s=i+n+(a>>>0>_>>>0?1:0),_+=e,s=s+r+(e>>>0>_>>>0?1:0),_+=o,s=s+c+(o>>>0>_>>>0?1:0)}function i(){l[I]=s,l[I+1]=_;var t=Maj(a,r,e),h=Maj(d,b,g),i=S(a,d,28)^S(d,a,2)^S(d,a,7),j=S(d,a,28)^S(a,d,2)^S(a,d,7),C=S(f,v,14)^S(f,v,18)^S(v,f,9),H=S(v,f,14)^S(v,f,18)^S(f,v,9),M=K[I],q=K[I+1],W=Ch(f,c,o),m=Ch(v,w,B),x=y+H,A=u+C+(y>>>0>x>>>0?1:0);x+=m,A=A+W+(m>>>0>x>>>0?1:0),x+=q,A=A+M+(q>>>0>x>>>0?1:0),x+=_,A=A+s+(_>>>0>x>>>0?1:0);var k=j+h,z=i+t+(j>>>0>k>>>0?1:0);u=o,y=B,o=c,B=w,c=f,w=v,v=p+x|0,f=n+A+(p>>>0>v>>>0?1:0)|0,n=e,p=g,e=r,g=b,r=a,b=d,d=x+k|0,a=A+z+(x>>>0>d>>>0?1:0)|0,E++,I+=2}for(var s,_,l=this._w,a=0|this._a,r=0|this._b,e=0|this._c,n=0|this._d,f=0|this._e,c=0|this._f,o=0|this._g,u=0|this._h,d=0|this._al,b=0|this._bl,g=0|this._cl,p=0|this._dl,v=0|this._el,w=0|this._fl,B=0|this._gl,y=0|this._hl,E=0,I=0;16>E;)s=t.readInt32BE(4*I),_=t.readInt32BE(4*I+4),i();for(;80>E;)h(),i();this._al=this._al+d|0,this._bl=this._bl+b|0,this._cl=this._cl+g|0,this._dl=this._dl+p|0,this._el=this._el+v|0,this._fl=this._fl+w|0,this._gl=this._gl+B|0,this._hl=this._hl+y|0,this._a=this._a+a+(this._al>>>0>>0?1:0)|0,this._b=this._b+r+(this._bl>>>0>>0?1:0)|0,this._c=this._c+e+(this._cl>>>0>>0?1:0)|0,this._d=this._d+n+(this._dl>>>0

      >>0?1:0)|0,this._e=this._e+f+(this._el>>>0>>0?1:0)|0,this._f=this._f+c+(this._fl>>>0>>0?1:0)|0,this._g=this._g+o+(this._gl>>>0>>0?1:0)|0,this._h=this._h+u+(this._hl>>>0>>0?1:0)|0},Sha512.prototype._hash=function(){function t(t,i,s){h.writeInt32BE(t,s),h.writeInt32BE(i,s+4)}var h=new Buffer(64);return t(this._a,this._al,0),t(this._b,this._bl,8),t(this._c,this._cl,16),t(this._d,this._dl,24),t(this._e,this._el,32),t(this._f,this._fl,40),t(this._g,this._gl,48),t(this._h,this._hl,56),h},module.exports=Sha512; -}).call(this,require("buffer").Buffer) - -},{"./hash":98,"buffer":2,"inherits":142}],105:[function(require,module,exports){ -(function (Buffer){ -"use strict";function Hmac(t,e){Transform.call(this),"string"==typeof e&&(e=new Buffer(e));var r="sha512"===t||"sha384"===t?128:64;this._alg=t,this._key=e,e.length>r?e=createHash(t).update(e).digest():e.lengthi;i++)a[i]=54^e[i],s[i]=92^e[i];this._hash=createHash(t).update(a)}var createHash=require("create-hash/browser"),inherits=require("inherits"),Transform=require("stream").Transform,ZEROS=new Buffer(128);ZEROS.fill(0),inherits(Hmac,Transform),Hmac.prototype.update=function(t,e){return this._hash.update(t,e),this},Hmac.prototype._transform=function(t,e,r){this._hash.update(t),r()},Hmac.prototype._flush=function(t){this.push(this.digest()),t()},Hmac.prototype.digest=function(t){var e=this._hash.digest();return createHash(this._alg).update(this._opad).update(e).digest(t)},module.exports=function(t,e){return new Hmac(t,e)}; -}).call(this,require("buffer").Buffer) - -},{"buffer":2,"create-hash/browser":94,"inherits":142,"stream":156}],106:[function(require,module,exports){ -(function (Buffer){ -function getDiffieHellman(e){var r=new Buffer(primes[e].prime,"hex"),f=new Buffer(primes[e].gen,"hex");return new DH(r,f)}function createDiffieHellman(e,r,f,i){return(Buffer.isBuffer(r)||"string"==typeof r&&-1===["hex","binary","base64"].indexOf(r))&&(i=f,f=r,r=void 0),r=r||"binary",i=i||"binary",f=f||new Buffer([2]),Buffer.isBuffer(f)||(f=new Buffer(f,i)),"number"==typeof e?new DH(generatePrime(e,f),f,!0):(Buffer.isBuffer(e)||(e=new Buffer(e,r)),new DH(e,f,!0))}var generatePrime=require("./lib/generatePrime"),primes=require("./lib/primes"),DH=require("./lib/dh");exports.DiffieHellmanGroup=exports.createDiffieHellmanGroup=exports.getDiffieHellman=getDiffieHellman,exports.createDiffieHellman=exports.DiffieHellman=createDiffieHellman; -}).call(this,require("buffer").Buffer) - -},{"./lib/dh":107,"./lib/generatePrime":108,"./lib/primes":109,"buffer":2}],107:[function(require,module,exports){ -(function (Buffer){ -function setPublicKey(e,r){return r=r||"utf8",Buffer.isBuffer(e)||(e=new Buffer(e,r)),this._pub=new BN(e),this}function setPrivateKey(e,r){return r=r||"utf8",Buffer.isBuffer(e)||(e=new Buffer(e,r)),this._priv=new BN(e),this}function checkPrime(e,r){var t=r.toString("hex"),i=[t,e.toString(16)].join("_");if(i in primeCache)return primeCache[i];var n=0;if(e.isEven()||!primes.simpleSieve||!primes.fermatTest(e)||!millerRabin.test(e))return n+=1,n+="02"===t||"05"===t?8:4,primeCache[i]=n,n;millerRabin.test(e.shrn(1))||(n+=2);var u;switch(t){case"02":e.mod(TWENTYFOUR).cmp(ELEVEN)&&(n+=8);break;case"05":u=e.mod(TEN),u.cmp(THREE)&&u.cmp(SEVEN)&&(n+=8);break;default:n+=4}return primeCache[i]=n,n}function defineError(e,r){try{Object.defineProperty(e,"verifyError",{enumerable:!0,value:r,writable:!1})}catch(t){e.verifyError=r}}function DH(e,r,t){this.setGenerator(r),this.__prime=new BN(e),this._prime=BN.mont(this.__prime),this._primeLen=e.length,this._pub=void 0,this._priv=void 0,t?(this.setPublicKey=setPublicKey,this.setPrivateKey=setPrivateKey,defineError(this,checkPrime(this.__prime,r))):defineError(this,8)}function formatReturnValue(e,r){var t=new Buffer(e.toArray());return r?t.toString(r):t}var BN=require("bn.js"),MillerRabin=require("miller-rabin"),millerRabin=new MillerRabin,TWENTYFOUR=new BN(24),ELEVEN=new BN(11),TEN=new BN(10),THREE=new BN(3),SEVEN=new BN(7),primes=require("./generatePrime"),randomBytes=require("randombytes");module.exports=DH;var primeCache={};DH.prototype.generateKeys=function(){return this._priv||(this._priv=new BN(randomBytes(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},DH.prototype.computeSecret=function(e){e=new BN(e),e=e.toRed(this._prime);var r=e.redPow(this._priv).fromRed(),t=new Buffer(r.toArray()),i=this.getPrime();if(t.lengthi;i+=2){for(var m=Math.ceil(Math.sqrt(i)),t=0;n>t&&r[t]<=m&&i%r[t]!==0;t++);n!==t&&r[t]<=m||(r[n++]=i)}return primes=r,r}function simpleSieve(e){for(var r=_getPrimes(),n=0;ne;)n.ishrn(1);if(n.isEven()&&n.iadd(ONE),n.testn(1)||n.iadd(TWO),r.cmp(TWO))if(r.cmp(FIVE))m={major:[FOUR],minor:[TWO]};else{for(rem=n.mod(TEN);rem.cmp(THREE);)n.iadd(FOUR),rem=n.mod(TEN);m={major:[FOUR,SIXTEEN],minor:[TWO,EIGHT]}}else{for(;n.mod(TWENTYFOUR).cmp(ELEVEN);)n.iadd(FOUR);m={major:[TWENTYFOUR],minor:[TWELVE]}}return n}if(16>e)return new BN(2===r||5===r?[140,123]:[140,39]);r=new BN(r);for(var i,m,t=n(e),a=t.shrn(1);;){for(;t.bitLength()>e;)t=n(e),a=t.shrn(1);if(i++,simpleSieve(a)&&simpleSieve(t)&&fermatTest(a)&&fermatTest(t)&&millerRabin.test(a)&&millerRabin.test(t))return t;t.iadd(m.major[i%m.major.length]),a.iadd(m.minor[i%m.minor.length])}}var randomBytes=require("randombytes");module.exports=findPrime,findPrime.simpleSieve=simpleSieve,findPrime.fermatTest=fermatTest;var BN=require("bn.js"),TWENTYFOUR=new BN(24),MillerRabin=require("miller-rabin"),millerRabin=new MillerRabin,ONE=new BN(1),TWO=new BN(2),FIVE=new BN(5),SIXTEEN=new BN(16),EIGHT=new BN(8),TEN=new BN(10),THREE=new BN(3),SEVEN=new BN(7),ELEVEN=new BN(11),FOUR=new BN(4),TWELVE=new BN(12),primes=null; -},{"bn.js":110,"miller-rabin":111,"randombytes":140}],109:[function(require,module,exports){ -module.exports={"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}} -},{}],110:[function(require,module,exports){ -arguments[4][27][0].apply(exports,arguments) -},{"dup":27}],111:[function(require,module,exports){ -function MillerRabin(r){this.rand=r||new brorand.Rand}var bn=require("bn.js"),brorand=require("brorand");module.exports=MillerRabin,MillerRabin.create=function(r){return new MillerRabin(r)},MillerRabin.prototype._rand=function(r){var n=r.bitLength(),e=this.rand.generate(Math.ceil(n/8));e[0]|=3;var t=7&n;return 0!==t&&(e[e.length-1]>>=7-t),new bn(e)},MillerRabin.prototype.test=function(r,n,e){var t=r.bitLength(),a=bn.mont(r),i=new bn(1).toRed(a);n||(n=Math.max(1,t/48|0));for(var o=r.subn(1),b=o.subn(1),d=0;!o.testn(d);d++);for(var u=r.shrn(d),f=o.toRed(a),c=!0;n>0;n--){var s=this._rand(b);e&&e(s);var l=s.toRed(a).redPow(u);if(0!==l.cmp(i)&&0!==l.cmp(f)){for(var m=1;d>m;m++){if(l=l.redSqr(),0===l.cmp(i))return!1;if(0===l.cmp(f))break}if(m===d)return!1}}return c},MillerRabin.prototype.getDivisor=function(r,n){var e=r.bitLength(),t=bn.mont(r),a=new bn(1).toRed(t);n||(n=Math.max(1,e/48|0));for(var i=r.subn(1),o=i.subn(1),b=0;!i.testn(b);b++);for(var d=r.shrn(b),u=i.toRed(t),f=!0;n>0;n--){var c=this._rand(o),s=r.gcd(c);if(0!==s.cmpn(1))return s;var l=c.toRed(t).redPow(d);if(0!==l.cmp(a)&&0!==l.cmp(u)){for(var m=1;b>m;m++){if(l=l.redSqr(),0===l.cmp(a))return l.fromRed().subn(1).gcd(r);if(0===l.cmp(u))break}if(m===b)return l=l.redSqr(),l.fromRed().subn(1).gcd(r)}}return f}; -},{"bn.js":110,"brorand":112}],112:[function(require,module,exports){ -arguments[4][41][0].apply(exports,arguments) -},{"crypto":6,"dup":41}],113:[function(require,module,exports){ -(function (Buffer){ -function pbkdf2(e,r,t,f,n,o){if("function"==typeof n&&(o=n,n=void 0),"function"!=typeof o)throw new Error("No callback provided to pbkdf2");var a=pbkdf2Sync(e,r,t,f,n);setTimeout(function(){o(void 0,a)})}function pbkdf2Sync(e,r,t,f,n){if("number"!=typeof t)throw new TypeError("Iterations not a number");if(0>t)throw new TypeError("Bad iterations");if("number"!=typeof f)throw new TypeError("Key length not a number");if(0>f)throw new TypeError("Bad key length");n=n||"sha1",Buffer.isBuffer(e)||(e=new Buffer(e)),Buffer.isBuffer(r)||(r=new Buffer(r));var o,a=1,i=new Buffer(f),p=new Buffer(r.length+4);r.copy(p,0,0,r.length);for(var c,u,d=1;a>=d;d++){p.writeUInt32BE(d,r.length);var w=createHmac(n,e).update(p).digest();if(!o&&(o=w.length,u=new Buffer(o),a=Math.ceil(f/o),c=f-(a-1)*o,f>(Math.pow(2,32)-1)*o))throw new TypeError("keylen exceeds maximum length");w.copy(u,0,0,o);for(var y=1;t>y;y++){w=createHmac(n,e).update(w).digest();for(var h=0;o>h;h++)u[h]^=w[h]}var b=(d-1)*o,m=d===a?c:o;u.copy(i,b,0,m)}return i}var createHmac=require("create-hmac");exports.pbkdf2=pbkdf2,exports.pbkdf2Sync=pbkdf2Sync; -}).call(this,require("buffer").Buffer) - -},{"buffer":2,"create-hmac":105}],114:[function(require,module,exports){ -exports.publicEncrypt=require("./publicEncrypt"),exports.privateDecrypt=require("./privateDecrypt"),exports.privateEncrypt=function(r,p){return exports.publicEncrypt(r,p,!0)},exports.publicDecrypt=function(r,p){return exports.privateDecrypt(r,p,!0)}; -},{"./privateDecrypt":136,"./publicEncrypt":137}],115:[function(require,module,exports){ -(function (Buffer){ -function i2ops(e){var r=new Buffer(4);return r.writeUInt32BE(e,0),r}var createHash=require("create-hash");module.exports=function(e,r){for(var t,a=new Buffer(""),n=0;a.length=0||!r.mod(e.prime1)||!r.mod(e.prime2);)r=new bn(randomBytes(n));return r}var bn=require("bn.js"),randomBytes=require("randombytes");module.exports=crt,crt.getr=getr; -}).call(this,require("buffer").Buffer) - -},{"bn.js":116,"buffer":2,"randombytes":140}],118:[function(require,module,exports){ -(function (Buffer){ -var createHash=require("create-hash");module.exports=function(e,r,a){a/=8;for(var t,f,u,i=0,d=new Buffer(a),h=0;;){if(t=createHash("md5"),h++>0&&t.update(f),t.update(e),t.update(r),f=t.digest(),u=0,a>0)for(;;){if(0===a)break;if(u===f.length)break;d[i++]=f[u++],a--}if(0===a)break}for(u=0;u=e.length){o++;break}{var u=e.slice(2,i-1);e.slice(i-1,i)}if(("0002"!==t.toString("hex")&&!n||"0001"!==t.toString("hex")&&n)&&o++,u.length<8&&o++,o)throw new Error("decryption error");return e.slice(i)}function compare(r,e){r=new Buffer(r),e=new Buffer(e);var n=0,t=r.length;r.length!==e.length&&(n++,t=Math.min(r.length,e.length));for(var i=-1;++io||new bn(e).cmp(i.modulus)>=0)throw new Error("decryption error");var u;u=n?withPublic(new bn(e),i):crt(e,i);var a=new Buffer(o-u.length);if(a.fill(0),u=Buffer.concat([a,u],o),4===t)return oaep(i,u);if(1===t)return pkcs1(i,u,n);if(3===t)return u;throw new Error("unknown padding")}; -}).call(this,require("buffer").Buffer) - -},{"./mgf":115,"./withPublic":138,"./xor":139,"bn.js":116,"browserify-rsa":117,"buffer":2,"create-hash":94,"parse-asn1":122}],137:[function(require,module,exports){ -(function (Buffer){ -function oaep(e,r){var n=e.modulus.byteLength(),o=r.length,t=createHash("sha1").update(new Buffer("")).digest(),f=t.length,u=2*f;if(o>n-u-2)throw new Error("message too long");var a=new Buffer(n-o-u-2);a.fill(0);var s=n-f-1,i=randomBytes(f),w=xor(Buffer.concat([t,a,new Buffer([1]),r],s),mgf(i,s)),c=xor(i,mgf(w,f));return new bn(Buffer.concat([new Buffer([0]),c,w],n))}function pkcs1(e,r,n){var o=r.length,t=e.modulus.byteLength();if(o>t-11)throw new Error("message too long");var f;return n?(f=new Buffer(t-o-3),f.fill(255)):f=nonZero(t-o-3),new bn(Buffer.concat([new Buffer([0,n?1:2]),f,new Buffer([0]),r],t))}function nonZero(e,r){for(var n,o=new Buffer(e),t=0,f=randomBytes(2*e),u=0;e>t;)u===f.length&&(f=randomBytes(2*e),u=0),n=f[u++],n&&(o[t++]=n);return o}var parseKeys=require("parse-asn1"),randomBytes=require("randombytes"),createHash=require("create-hash"),mgf=require("./mgf"),xor=require("./xor"),bn=require("bn.js"),withPublic=require("./withPublic"),crt=require("browserify-rsa"),constants={RSA_PKCS1_OAEP_PADDING:4,RSA_PKCS1_PADDIN:1,RSA_NO_PADDING:3};module.exports=function(e,r,n){var o;o=e.padding?e.padding:n?1:4;var t,f=parseKeys(e);if(4===o)t=oaep(f,r);else if(1===o)t=pkcs1(f,r,n);else{if(3!==o)throw new Error("unknown padding");if(t=new bn(r),t.cmp(f.modulus)>=0)throw new Error("data too long for modulus")}return n?crt(t,f):withPublic(t,f)}; -}).call(this,require("buffer").Buffer) - -},{"./mgf":115,"./withPublic":138,"./xor":139,"bn.js":116,"browserify-rsa":117,"buffer":2,"create-hash":94,"parse-asn1":122,"randombytes":140}],138:[function(require,module,exports){ -(function (Buffer){ -function withPublic(e,n){return new Buffer(e.toRed(bn.mont(n.modulus)).redPow(new bn(n.publicExponent)).fromRed().toArray())}var bn=require("bn.js");module.exports=withPublic; -}).call(this,require("buffer").Buffer) - -},{"bn.js":116,"buffer":2}],139:[function(require,module,exports){ -module.exports=function(r,e){for(var n=r.length,o=-1;++oe||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},EventEmitter.prototype.emit=function(e){var t,n,s,i,r,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(n=this._events[e],isUndefined(n))return!1;if(isFunction(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:for(s=arguments.length,i=new Array(s-1),r=1;s>r;r++)i[r-1]=arguments[r];n.apply(this,i)}else if(isObject(n)){for(s=arguments.length,i=new Array(s-1),r=1;s>r;r++)i[r-1]=arguments[r];for(o=n.slice(),s=o.length,r=0;s>r;r++)o[r].apply(this,i)}return!0},EventEmitter.prototype.addListener=function(e,t){var n;if(!isFunction(t))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,isFunction(t.listener)?t.listener:t),this._events[e]?isObject(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,isObject(this._events[e])&&!this._events[e].warned){var n;n=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())}return this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(e,t){function n(){this.removeListener(e,n),s||(s=!0,t.apply(this,arguments))}if(!isFunction(t))throw TypeError("listener must be a function");var s=!1;return n.listener=t,this.on(e,n),this},EventEmitter.prototype.removeListener=function(e,t){var n,s,i,r;if(!isFunction(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],i=n.length,s=-1,n===t||isFunction(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(isObject(n)){for(r=i;r-->0;)if(n[r]===t||n[r].listener&&n[r].listener===t){s=r;break}if(0>s)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},EventEmitter.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],isFunction(n))this.removeListener(e,n);else for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},EventEmitter.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?isFunction(this._events[e])?[this._events[e]]:this._events[e].slice():[]},EventEmitter.listenerCount=function(e,t){var n;return n=e._events&&e._events[t]?isFunction(e._events[t])?1:e._events[t].length:0}; -},{}],142:[function(require,module,exports){ -"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; -},{}],143:[function(require,module,exports){ -module.exports=Array.isArray||function(r){return"[object Array]"==Object.prototype.toString.call(r)}; -},{}],144:[function(require,module,exports){ -function drainQueue(){if(!draining){draining=!0;for(var e,o=queue.length;o;){e=queue,queue=[];for(var r=-1;++ri;i++)t(e[i],i)}module.exports=Duplex;var objectKeys=Object.keys||function(e){var t=[];for(var i in e)t.push(i);return t},util=require("core-util-is");util.inherits=require("inherits");var Readable=require("./_stream_readable"),Writable=require("./_stream_writable");util.inherits(Duplex,Readable),forEach(objectKeys(Writable.prototype),function(e){Duplex.prototype[e]||(Duplex.prototype[e]=Writable.prototype[e])}); -}).call(this,require('_process')) - -},{"./_stream_readable":148,"./_stream_writable":150,"_process":144,"core-util-is":151,"inherits":142}],147:[function(require,module,exports){ -function PassThrough(r){return this instanceof PassThrough?void Transform.call(this,r):new PassThrough(r)}module.exports=PassThrough;var Transform=require("./_stream_transform"),util=require("core-util-is");util.inherits=require("inherits"),util.inherits(PassThrough,Transform),PassThrough.prototype._transform=function(r,s,i){i(null,r)}; -},{"./_stream_transform":149,"core-util-is":151,"inherits":142}],148:[function(require,module,exports){ -(function (process){ -function ReadableState(e,t){e=e||{};var n=e.highWaterMark;this.highWaterMark=n||0===n?n:16384,this.highWaterMark=~~this.highWaterMark,this.buffer=[],this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=!1,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.calledRead=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.objectMode=!!e.objectMode,this.defaultEncoding=e.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this.decoder=new StringDecoder(e.encoding),this.encoding=e.encoding)}function Readable(e){return this instanceof Readable?(this._readableState=new ReadableState(e,this),this.readable=!0,void Stream.call(this)):new Readable(e)}function readableAddChunk(e,t,n,r,i){var a=chunkInvalid(t,n);if(a)e.emit("error",a);else if(null===n||void 0===n)t.reading=!1,t.ended||onEofChunk(e,t);else if(t.objectMode||n&&n.length>0)if(t.ended&&!i){var d=new Error("stream.push() after EOF");e.emit("error",d)}else if(t.endEmitted&&i){var d=new Error("stream.unshift() after end event");e.emit("error",d)}else!t.decoder||i||r||(n=t.decoder.write(n)),t.length+=t.objectMode?1:n.length,i?t.buffer.unshift(n):(t.reading=!1,t.buffer.push(n)),t.needReadable&&emitReadable(e),maybeReadMore(e,t);else i||(t.reading=!1);return needMoreData(t)}function needMoreData(e){return!e.ended&&(e.needReadable||e.length=MAX_HWM)e=MAX_HWM;else{e--;for(var t=1;32>t;t<<=1)e|=e>>t;e++}return e}function howMuchToRead(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=roundUpToNextPowerOf2(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function chunkInvalid(e,t){var n=null;return Buffer.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(n=new TypeError("Invalid non-string/buffer chunk")),n}function onEofChunk(e,t){if(t.decoder&&!t.ended){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,t.length>0?emitReadable(e):endReadable(e)}function emitReadable(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,t.sync?process.nextTick(function(){emitReadable_(e)}):emitReadable_(e))}function emitReadable_(e){e.emit("readable")}function maybeReadMore(e,t){t.readingMore||(t.readingMore=!0,process.nextTick(function(){maybeReadMore_(e,t)}))}function maybeReadMore_(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length0)return;return 0===r.pipesCount?(r.flowing=!1,void(EE.listenerCount(e,"data")>0&&emitDataEvents(e))):void(r.ranOut=!0)}function pipeOnReadable(){this._readableState.ranOut&&(this._readableState.ranOut=!1,flow(this))}function emitDataEvents(e,t){var n=e._readableState;if(n.flowing)throw new Error("Cannot switch to old mode now.");var r=t||!1,i=!1;e.readable=!0,e.pipe=Stream.prototype.pipe,e.on=e.addListener=Stream.prototype.on,e.on("readable",function(){i=!0;for(var t;!r&&null!==(t=e.read());)e.emit("data",t);null===t&&(i=!1,e._readableState.needReadable=!0)}),e.pause=function(){r=!0,this.emit("pause")},e.resume=function(){r=!1,i?process.nextTick(function(){e.emit("readable")}):this.read(0),this.emit("resume")},e.emit("readable")}function fromList(e,t){var n,r=t.buffer,i=t.length,a=!!t.decoder,d=!!t.objectMode;if(0===r.length)return null;if(0===i)n=null;else if(d)n=r.shift();else if(!e||e>=i)n=a?r.join(""):Buffer.concat(r,i),r.length=0;else if(es&&e>l;s++){var o=r[0],h=Math.min(e-l,o.length);a?n+=o.slice(0,h):o.copy(n,l,0,h),h0)throw new Error("endReadable called on non-empty stream");!t.endEmitted&&t.calledRead&&(t.ended=!0,process.nextTick(function(){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}))}function forEach(e,t){for(var n=0,r=e.length;r>n;n++)t(e[n],n)}function indexOf(e,t){for(var n=0,r=e.length;r>n;n++)if(e[n]===t)return n;return-1}module.exports=Readable;var isArray=require("isarray"),Buffer=require("buffer").Buffer;Readable.ReadableState=ReadableState;var EE=require("events").EventEmitter;EE.listenerCount||(EE.listenerCount=function(e,t){return e.listeners(t).length});var Stream=require("stream"),util=require("core-util-is");util.inherits=require("inherits");var StringDecoder;util.inherits(Readable,Stream),Readable.prototype.push=function(e,t){var n=this._readableState;return"string"!=typeof e||n.objectMode||(t=t||n.defaultEncoding,t!==n.encoding&&(e=new Buffer(e,t),t="")),readableAddChunk(this,n,e,t,!1)},Readable.prototype.unshift=function(e){var t=this._readableState;return readableAddChunk(this,t,e,"",!0)},Readable.prototype.setEncoding=function(e){StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this._readableState.decoder=new StringDecoder(e),this._readableState.encoding=e};var MAX_HWM=8388608;Readable.prototype.read=function(e){var t=this._readableState;t.calledRead=!0;var n,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return emitReadable(this),null;if(e=howMuchToRead(e,t),0===e&&t.ended)return n=null,t.length>0&&t.decoder&&(n=fromList(e,t),t.length-=n.length),0===t.length&&endReadable(this),n;var i=t.needReadable;return t.length-e<=t.highWaterMark&&(i=!0),(t.ended||t.reading)&&(i=!1),i&&(t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1),i&&!t.reading&&(e=howMuchToRead(r,t)),n=e>0?fromList(e,t):null,null===n&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),t.ended&&!t.endEmitted&&0===t.length&&endReadable(this),n},Readable.prototype._read=function(e){this.emit("error",new Error("not implemented"))},Readable.prototype.pipe=function(e,t){function n(e){e===s&&i()}function r(){e.end()}function i(){e.removeListener("close",d),e.removeListener("finish",o),e.removeListener("drain",p),e.removeListener("error",a),e.removeListener("unpipe",n),s.removeListener("end",r),s.removeListener("end",i),(!e._writableState||e._writableState.needDrain)&&p()}function a(t){l(),e.removeListener("error",a),0===EE.listenerCount(e,"error")&&e.emit("error",t)}function d(){e.removeListener("finish",o),l()}function o(){e.removeListener("close",d),l()}function l(){s.unpipe(e)}var s=this,u=this._readableState;switch(u.pipesCount){case 0:u.pipes=e;break;case 1:u.pipes=[u.pipes,e];break;default:u.pipes.push(e)}u.pipesCount+=1;var h=(!t||t.end!==!1)&&e!==process.stdout&&e!==process.stderr,f=h?r:i;u.endEmitted?process.nextTick(f):s.once("end",f),e.on("unpipe",n);var p=pipeOnDrain(s);return e.on("drain",p),e._events&&e._events.error?isArray(e._events.error)?e._events.error.unshift(a):e._events.error=[a,e._events.error]:e.on("error",a),e.once("close",d),e.once("finish",o),e.emit("pipe",s),u.flowing||(this.on("readable",pipeOnReadable),u.flowing=!0,process.nextTick(function(){flow(s)})),e},Readable.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,this.removeListener("readable",pipeOnReadable),t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var n=t.pipes,r=t.pipesCount;t.pipes=null,t.pipesCount=0,this.removeListener("readable",pipeOnReadable),t.flowing=!1;for(var i=0;r>i;i++)n[i].emit("unpipe",this);return this}var i=indexOf(t.pipes,e);return-1===i?this:(t.pipes.splice(i,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},Readable.prototype.on=function(e,t){var n=Stream.prototype.on.call(this,e,t);if("data"!==e||this._readableState.flowing||emitDataEvents(this),"readable"===e&&this.readable){var r=this._readableState;r.readableListening||(r.readableListening=!0,r.emittedReadable=!1,r.needReadable=!0,r.reading?r.length&&emitReadable(this,r):this.read(0))}return n},Readable.prototype.addListener=Readable.prototype.on,Readable.prototype.resume=function(){emitDataEvents(this),this.read(0),this.emit("resume")},Readable.prototype.pause=function(){emitDataEvents(this,!0),this.emit("pause")},Readable.prototype.wrap=function(e){var t=this._readableState,n=!1,r=this;e.on("end",function(){if(t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&r.push(e)}r.push(null)}),e.on("data",function(i){if(t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var a=r.push(i);a||(n=!0,e.pause())}});for(var i in e)"function"==typeof e[i]&&"undefined"==typeof this[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));var a=["error","close","destroy","pause","resume"];return forEach(a,function(t){e.on(t,r.emit.bind(r,t))}),r._read=function(t){n&&(n=!1,e.resume())},r},Readable._fromList=fromList; -}).call(this,require('_process')) - -},{"_process":144,"buffer":2,"core-util-is":151,"events":141,"inherits":142,"isarray":143,"stream":156,"string_decoder/":157}],149:[function(require,module,exports){ -function TransformState(r,t){this.afterTransform=function(r,e){return afterTransform(t,r,e)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null}function afterTransform(r,t,e){var n=r._transformState;n.transforming=!1;var a=n.writecb;if(!a)return r.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==e&&void 0!==e&&r.push(e),a&&a(t);var i=r._readableState;i.reading=!1,(i.needReadable||i.length=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&56319>=h)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,h=t.charCodeAt(i);if(h>=55296&&56319>=h){var c=this.surrogateSize;return this.charLength+=c,this.charReceived+=c,this.charBuffer.copy(this.charBuffer,c,0,c),e.copy(this.charBuffer,0,0,c),t.substring(0,i)}return t},StringDecoder.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},StringDecoder.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,h=this.charBuffer,i=this.encoding;t+=h.slice(0,r).toString(i)}return t}; -},{"buffer":2}],158:[function(require,module,exports){ -function Context(){}var indexOf=require("indexof"),Object_keys=function(e){if(Object.keys)return Object.keys(e);var t=[];for(var r in e)t.push(r);return t},forEach=function(e,t){if(e.forEach)return e.forEach(t);for(var r=0;r

      '+n.data("caption")+"
      ";n.append(e);var o=n.find("."+a.cssClass),s=n.find(".Caption_Background"),c=n.find(".Caption_Content"),d=o.height();s.height(d),c.css("top","-"+d+"px"),n.bind({mouseenter:function(i){o.animate({top:-1*d},{duration:a.speed,queue:!1})},mouseleave:function(i){o.animate({top:0},{duration:a.speed,queue:!1})}})}}),this})}}(jQuery); -},{}],161:[function(require,module,exports){ -!function(e){e.fn.removeWhitespace=function(){return this.contents().filter(function(){return 3==this.nodeType&&!/\S/.test(this.nodeValue)}).remove(),this}}(jQuery); -},{}],162:[function(require,module,exports){ -!function(t){t.fn.collagePlus=function(e){function a(e,a,l,d){for(var n=l.padding*(e.length-1)+e.length*e[0][3],r=l.albumWidth-n,h=r/(a-n),o=n,s=a=d?d:10;else var e=9>=g?g+1:10;t.removeClass(function(t,e){return(e.match(/\beffect-\S+/g)||[]).join(" ")}),t.addClass(l.effect),t.addClass("effect-duration-"+e)}}}(f)).each(function(){this.complete&&t(this).trigger("load")})}}function i(t,e,a){var i={"margin-bottom":a.padding+"px","margin-right":e?a.padding+"px":"0px",display:a.display,"vertical-align":"bottom",overflow:"hidden"};return t.css(i)}function l(e){$img=t(e);var a=new Array;return a.w=parseFloat($img.css("border-left-width"))+parseFloat($img.css("border-right-width")),a.h=parseFloat($img.css("border-top-width"))+parseFloat($img.css("border-bottom-width")),a}return this.each(function(){var i=0,d=[],n=1,r=t(this);t.fn.collagePlus.defaults.albumWidth=r.width(),t.fn.collagePlus.defaults.padding=parseFloat(r.css("padding-left")),t.fn.collagePlus.defaults.images=r.children();var h=t.extend({},t.fn.collagePlus.defaults,e);h.images.each(function(e){var r=t(this),o=r.is("img")?r:t(this).find("img"),s="undefined"!=typeof o.data("width")?o.data("width"):o.width(),g="undefined"!=typeof o.data("height")?o.data("height"):o.height(),f=l(o);o.data("width",s),o.data("height",g);var c=Math.ceil(s/g*h.targetHeight),u=Math.ceil(h.targetHeight);d.push([this,c,u,f.w,f.h]),i+=c+f.w+h.padding,i>h.albumWidth&&0!=d.length&&(a(d,i-h.padding,h,n),delete i,delete d,i=0,d=[],n+=1),h.images.length-1==e&&0!=d.length&&(a(d,i,h,n),delete i,delete d,i=0,d=[],n+=1)})})},t.fn.collagePlus.defaults={targetHeight:400,fadeSpeed:"fast",display:"inline-block",effect:"default",direction:"vertical",allowPartialLastRow:!1}}(jQuery); -},{}],163:[function(require,module,exports){ -!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t="length"in e&&e.length,n=Z.type(e);return"function"===n||Z.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(Z.isFunction(t))return Z.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return Z.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(ae.test(t))return Z.filter(t,e,n);t=Z.filter(t,e)}return Z.grep(e,function(e){return U.call(t,e)>=0!==n})}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function o(e){var t=he[e]={};return Z.each(e.match(de)||[],function(e,n){t[n]=!0}),t}function s(){J.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1),Z.ready()}function a(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=Z.expando+a.uid++}function u(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(be,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:xe.test(n)?Z.parseJSON(n):n}catch(i){}ye.set(e,t,n)}else n=void 0;return n}function l(){return!0}function c(){return!1}function f(){try{return J.activeElement}catch(e){}}function p(e,t){return Z.nodeName(e,"table")&&Z.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function d(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function h(e){var t=Pe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function g(e,t){for(var n=0,r=e.length;r>n;n++)ve.set(e[n],"globalEval",!t||ve.get(t[n],"globalEval"))}function m(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(ve.hasData(e)&&(o=ve.access(e),s=ve.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)Z.event.add(t,i,l[i][n])}ye.hasData(e)&&(a=ye.access(e),u=Z.extend({},a),ye.set(t,u))}}function v(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&Z.nodeName(e,t)?Z.merge([e],n):n}function y(e,t){var n=t.nodeName.toLowerCase();"input"===n&&Ne.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}function x(t,n){var r,i=Z(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:Z.css(i[0],"display");return i.detach(),o}function b(e){var t=J,n=$e[e];return n||(n=x(e,t),"none"!==n&&n||(We=(We||Z("