diff --git a/README.md b/README.md
deleted file mode 100644
index 7d3a73f52..000000000
--- a/README.md
+++ /dev/null
@@ -1,126 +0,0 @@
-# Making collaborative editing the standard on the web
-
-# About
-Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad.
-We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite
-is based on node.js ergo is much lighter and more stable than the original Etherpad. Our hope
-is that this will encourage more users to use and install a realtime collaborative editor. A smaller, manageable and well
-documented codebase makes it easier for developers to improve the code and contribute towards the project.
-
-**Etherpad vs Etherpad lite**
-
-
-
Etherpad
Etherpad Lite
-
-
-
Size of the folder (without git history)
30 MB
1.5 MB
-
-
-
Languages used server side
Javascript (Rhino), Java, Scala
Javascript (node.js)
-
-
-
Lines of server side Javascript code
~101k
~9k
-
-
-
RAM Usage immediately after start
257 MB (grows to ~1GB)
16 MB (grows to ~30MB)
-
-
-
-
-Etherpad Lite is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API)
-that allows your web application to manage pads, users and groups. It is recommended to use the client implementations available for this API, listed on [this wiki page](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries).
-There is also a [jQuery plugin](https://github.com/johnyma22/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website
-
-**Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live**
-
-Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, really!
-
-# Installation
-
-## Windows
-
-### Prebuilt windows package
-This package works out of the box on any windows machine, but it's not very useful for developing purposes...
-
-1. Download the windows package
-2. Extract the folder
-
-Now, run `start.bat` and open in your browser. You like it? [Next steps](#next-steps).
-
-### Fancy install
-You'll need [node.js](http://nodejs.org) and (optionally, though recommended) git.
-
-1. Grab the source, either
- - download
- - or `git clone https://github.com/ether/etherpad-lite.git` (for this you need git, obviously)
-2. start `bin\installOnWindows.bat`
-
-Now, run `start.bat` and open in your browser.
-
-Update to the latest version with `git pull origin`, then run `bin\installOnWindows.bat`, again.
-
-[Next steps](#next-steps).
-
-## Linux
-You'll need gzip, git, curl, libssl develop libraries, python and gcc.
-*For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential`
-*For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"`
-
-Additionally, you'll need [node.js](http://nodejs.org).
-
-**As any user (we recommend creating a separate user called etherpad-lite):**
-
-1. Move to a folder where you want to install Etherpad Lite. Clone the git repository `git clone git://github.com/ether/etherpad-lite.git`
-2. Change into the new directory containing the cloned source code `cd etherpad-lite`
-
-Now, run `bin/run.sh` and open in your browser.
-
-Update to the latest version with `git pull origin`. The next start with bin/run.sh will update the dependencies.
-
-You like it? [Next steps](#next-steps).
-
-# Next Steps
-
-## Tweak the settings
-You can modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad Lite instances from the same installation.)
-
-You should use a dedicated database such as "mysql", if you are planning on using etherpad-lite in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes.
-
-## Helpful resources
-The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages.
-
-Documentation can be found in `docs/`.
-
-# Development
-
-## Things you should know
-Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Lite Development](http://youtu.be/67-Q26YH97E).
-
-If you're new to node.js, start with Ryan Dahl's [Introduction to Node.js](http://youtu.be/jo_B4LTHi3I).
-
-You can debug Etherpad lite using `bin/debugRun.sh`.
-
-If you want to find out how Etherpad's `Easysync` works (the library that makes it really realtime), start with this [PDF](https://github.com/ether/etherpad-lite/raw/master/doc/easysync/easysync-full-description.pdf) (complex, but worth reading).
-
-## Getting started
-You know all this and just want to know how you can help?
-
-Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and our [Issue tracker](https://github.com/ether/etherpad-lite/issues). (Please consider using [jshint](http://www.jshint.com/about/), if you plan to contribute code.)
-
-Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/wiki/Developer-Guidelines), really!
-
-# Get in touch
-Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)!
-
-# Modules created for this project
-
-* [ueberDB](https://github.com/ether/ueberDB) "transforms every database into a object key value store" - manages all database access
-* [channels](https://github.com/ether/channels) "Event channels in node.js" - ensures that ueberDB operations are atomic and in series for each key
-* [async-stacktrace](https://github.com/ether/async-stacktrace) "Improves node.js stacktraces and makes it easier to handle errors"
-
-# Donate!
-* [Flattr] (http://flattr.com/thing/71378/Etherpad-Foundation)
-* Paypal - Press the donate button on [etherpad.org](http://etherpad.org)
-
-# License
-[Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html)
diff --git a/src/locales/en.ini b/src/locales/en.ini
index a110583ea..e542594da 100644
--- a/src/locales/en.ini
+++ b/src/locales/en.ini
@@ -74,4 +74,19 @@ timeslider.pageTitle = {{appTitle}} Timeslider
timeslider.toolbar.returnbutton = Return to pad
timeslider.toolbar.authors = Authors:
timeslider.toolbar.authorsList = No Authors
-timeslider.exportCurrent = Export current version as:
\ No newline at end of file
+timeslider.exportCurrent = Export current version as:
+timeslider.version = Version {{version}}
+timeslider.saved = Saved {{month}} {{day}}, {{year}}
+timeslider.dateformat = {{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}
+timeslider.month.january = January
+timeslider.month.february = February
+timeslider.month.march = March
+timeslider.month.april = April
+timeslider.month.may = May
+timeslider.month.june = June
+timeslider.month.july = July
+timeslider.month.august = August
+timeslider.month.september = September
+timeslider.month.october = October
+timeslider.month.november = November
+timeslider.month.december = December
diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js
index 546ba2af6..c2b9ff6c7 100644
--- a/src/node/hooks/express/socketio.js
+++ b/src/node/hooks/express/socketio.js
@@ -36,13 +36,10 @@ exports.expressCreateServer = function (hook_name, args, cb) {
});
});
- // the following has been successfully tested with the following browsers
- // works also behind reverse proxy
- // Firefox 14.0.1
- // IE8 with Native XMLHTTP support
- // IE8 without Native XMLHTTP support
- // Chrome 21.0.1180.79
- io.set('transports', ['jsonp-polling']);
+ // there shouldn#t be a browser that isn't compatible to all
+ // transports in this list at once
+ // e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling
+ io.set('transports', ['xhr-polling', 'jsonp-polling', 'htmlfile']);
var socketIOLogger = log4js.getLogger("socket.io");
io.set('logger', {
diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js
index 9caa2b0be..fb2a592cb 100644
--- a/src/node/utils/Settings.js
+++ b/src/node/utils/Settings.js
@@ -38,6 +38,8 @@ exports.title = "Etherpad Lite";
* The app favicon fully specified url, visible e.g. in the browser window
*/
exports.favicon = "favicon.ico";
+exports.faviconPad = "../" + exports.favicon;
+exports.faviconTimeslider = "../../" + exports.favicon;
/**
* The IP ep-lite should listen to
diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css
index 1dd0ca913..d786d89ba 100644
--- a/src/static/css/timeslider.css
+++ b/src/static/css/timeslider.css
@@ -113,7 +113,7 @@
background-position: -29px -22px;
right: 5px;
top: 20px;
- width: 29px;
+ width: 30px;
}
#timeslider .star {
background-image: url(../../static/img/star.png);
diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js
index 661ea0119..f7c4cc5c8 100644
--- a/src/static/js/ace2_inner.js
+++ b/src/static/js/ace2_inner.js
@@ -333,14 +333,6 @@ function Ace2Inner(){
return colorutils.triple2css(color);
}
- function doAlert(str)
- {
- scheduler.setTimeout(function()
- {
- alert(str);
- }, 0);
- }
-
editorInfo.ace_getRep = function()
{
return rep;
@@ -1624,7 +1616,7 @@ function Ace2Inner(){
if (linesWrapped > 0)
{
- doAlert("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines.");
+ // console.log("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines.");
}
if (ss[0] >= 0) selStart = [ss[0] + a + netNumLinesChangeSoFar, ss[1]];
@@ -3569,7 +3561,6 @@ function Ace2Inner(){
inCallStackIfNecessary("handleKeyEvent", function()
{
-
if (type == "keypress" || (isTypeForSpecialKey && keyCode == 13 /*return*/ ))
{
// in IE, special keys don't send keypress, the keydown does the action
@@ -3583,7 +3574,6 @@ function Ace2Inner(){
{
outsideKeyDown(evt);
}
-
if (!stopped)
{
var specialHandledInHook = hooks.callAll('aceKeyEvent', {
@@ -3622,6 +3612,12 @@ function Ace2Inner(){
}, 0);
specialHandled = true;
}
+ if ((!specialHandled) && isTypeForSpecialKey && keyCode == 83)
+ {
+ evt.preventDefault();
+ parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */
+ specialHandled = true;
+ }
if ((!specialHandled) && isTypeForSpecialKey && keyCode == 9 && !(evt.metaKey || evt.ctrlKey))
{
// tab
diff --git a/src/static/js/broadcast.js b/src/static/js/broadcast.js
index 86e63f93f..d67398fbc 100644
--- a/src/static/js/broadcast.js
+++ b/src/static/js/broadcast.js
@@ -304,7 +304,14 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro
var hours = zpad(date.getHours(), 2);
var minutes = zpad(date.getMinutes(), 2);
var seconds = zpad(date.getSeconds(), 2);
- return ([month, '/', day, '/', year, ' ', hours, ':', minutes, ':', seconds].join(""));
+ return (document.webL10n.get("timeslider.dateformat", {
+ "day": day,
+ "month": month,
+ "year": year,
+ "hours": hours,
+ "minutes": minutes,
+ "seconds": seconds
+ }));
}
@@ -313,7 +320,24 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro
$('#timer').html(dateFormat());
- var revisionDate = ["Saved", ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"][date.getMonth()], date.getDate() + ",", date.getFullYear()].join(" ")
+ var revisionDate = document.webL10n.get("timeslider.saved", {
+ "day": date.getDate(),
+ "month": [
+ document.webL10n.get("timeslider.month.january"),
+ document.webL10n.get("timeslider.month.february"),
+ document.webL10n.get("timeslider.month.march"),
+ document.webL10n.get("timeslider.month.april"),
+ document.webL10n.get("timeslider.month.may"),
+ document.webL10n.get("timeslider.month.june"),
+ document.webL10n.get("timeslider.month.july"),
+ document.webL10n.get("timeslider.month.august"),
+ document.webL10n.get("timeslider.month.september"),
+ document.webL10n.get("timeslider.month.october"),
+ document.webL10n.get("timeslider.month.november"),
+ document.webL10n.get("timeslider.month.december")
+ ][date.getMonth()],
+ "year": date.getFullYear()
+ });
$('#revision_date').html(revisionDate)
}
diff --git a/src/static/js/broadcast_slider.js b/src/static/js/broadcast_slider.js
index fed9f2e79..a597c926d 100644
--- a/src/static/js/broadcast_slider.js
+++ b/src/static/js/broadcast_slider.js
@@ -112,7 +112,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded)
{
$(this).attr('href', $(this).attr('thref').replace("%revision%", newpos));
});
- $("#revision_label").html("Version " + newpos);
+ $("#revision_label").html(document.webL10n.get("timeslider.version", { "version": newpos}));
if (newpos == 0)
{
@@ -215,7 +215,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded)
}
if (authors.length == 0)
{
- authorsList.append("No Authors");
+ authorsList.append(document.webL10n.get("timeslider.toolbar.authorsList"));
}
fixPadHeight();
@@ -346,7 +346,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded)
var newloc = self.currentLoc + (evt2.clientX - self.startLoc);
if (newloc < 0) newloc = 0;
if (newloc > ($("#ui-slider-bar").width() - 2)) newloc = ($("#ui-slider-bar").width() - 2);
- $("#revision_label").html("Version " + Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2)));
+ $("#revision_label").html(document.webL10n.get("timeslider.version", { "version": Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))}));
$(self).css('left', newloc);
if (getSliderPosition() != Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))) _callSliderCallbacks(Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2)))
});
diff --git a/src/templates/pad.html b/src/templates/pad.html
index ed98a2e7f..78605657b 100644
--- a/src/templates/pad.html
+++ b/src/templates/pad.html
@@ -32,7 +32,7 @@
-
+