From 65ec8a1b47dfb1bd6cbb24ec20ddb29636aeed9c Mon Sep 17 00:00:00 2001 From: Dominik Rodler Date: Mon, 20 Feb 2012 23:16:25 +0100 Subject: [PATCH] UI refactoring and code clean-up - Improved maintainability of UI (very much work still remaining) - Improved performance of UI - Consistent coding style --- static/css/iframe_editor.css | 6 +- static/css/pad.css | 1767 +++++++-------------- static/css/timeslider.css | 137 +- static/favicon.ico | Bin 1150 -> 1150 bytes static/favicon.psd | Bin 0 -> 30000 bytes static/img/ajax-loader.gif | Bin 0 -> 3208 bytes static/img/crushed_button_depressed.png | Bin 4134 -> 0 bytes static/img/crushed_button_undepressed.png | Bin 4166 -> 0 bytes static/img/crushed_current_location.png | Bin 1009 -> 0 bytes static/img/etherpad_lite_icons.png | Bin 5541 -> 13118 bytes static/img/etherpad_lite_icons.psd | Bin 0 -> 233616 bytes static/img/pause.png | Bin 2883 -> 0 bytes static/img/play.png | Bin 3017 -> 0 bytes static/img/stepper_buttons.png | Bin 4858 -> 0 bytes static/img/timeslider-sprite.png | Bin 0 -> 2690 bytes static/img/timeslider-sprite.psd | Bin 0 -> 61735 bytes static/img/timeslider_background.png | Bin 182 -> 0 bytes static/img/timeslider_left.png | Bin 686 -> 0 bytes static/img/timeslider_right.png | Bin 517 -> 0 bytes static/js/broadcast_slider.js | 595 +++---- static/js/chat.js | 168 +- static/js/pad.js | 909 ++++------- static/js/pad_editbar.js | 289 ++-- static/js/pad_userlist.js | 680 +++----- static/js/pad_utils.js | 2 +- static/js/plugins.js | 47 +- static/js/timeslider.js | 152 +- static/pad.html | 522 +++--- static/timeslider.html | 327 ++-- 29 files changed, 2069 insertions(+), 3532 deletions(-) create mode 100644 static/favicon.psd create mode 100644 static/img/ajax-loader.gif delete mode 100644 static/img/crushed_button_depressed.png delete mode 100644 static/img/crushed_button_undepressed.png delete mode 100644 static/img/crushed_current_location.png create mode 100644 static/img/etherpad_lite_icons.psd delete mode 100644 static/img/pause.png delete mode 100644 static/img/play.png delete mode 100644 static/img/stepper_buttons.png create mode 100644 static/img/timeslider-sprite.png create mode 100644 static/img/timeslider-sprite.psd delete mode 100644 static/img/timeslider_background.png delete mode 100644 static/img/timeslider_left.png delete mode 100644 static/img/timeslider_right.png diff --git a/static/css/iframe_editor.css b/static/css/iframe_editor.css index 6a483c07b..d0c56de10 100644 --- a/static/css/iframe_editor.css +++ b/static/css/iframe_editor.css @@ -104,7 +104,7 @@ body.doesWrap { font-family: monospace; line-height: 16px; /* overridden by sideDiv.style */ padding-top: 8px; /* EDIT_BODY_PADDING_TOP */ - padding-right: 3px; /* LINE_NUMBER_PADDING_RIGHT - 1 */ + padding-right: 4px; /* LINE_NUMBER_PADDING_RIGHT - 1 */ position: absolute; width: 20px; /* MIN_LINEDIV_WIDTH */ top: 0; @@ -119,8 +119,8 @@ body.doesWrap { .sidedivdelayed { /* class set after sizes are set */ background-color: #eee; - color: #888 !important; - border-right: 1px solid #999; + color: #aaa !important; + border-right: 1px solid #d5d5d5; } .sidedivhidden { display: none; diff --git a/static/css/pad.css b/static/css/pad.css index e407b3a4f..23a165391 100644 --- a/static/css/pad.css +++ b/static/css/pad.css @@ -1,1264 +1,649 @@ -*,html,body,p{ margin: 0; padding: 0; } -.clear { clear: both; } -html { font-size: 62.5%; width: 100%; } -body, textarea { font-family: Helvetica, Arial, sans-serif; } -iframe {position:absolute;} +*, HTML, BODY, P {margin:0; padding:0;} +HTML {font-size:62.5%; width:100%;} +BODY, TEXTAREA {font-family:Arial, Helvetica, sans-serif;} +IFRAME {position:absolute;} -#users -{ - position: absolute; - z-index:500; - background-color: #000; - background-color: rgba(0,0,0,0.7); - width: 160px; - right: 20px; - top: 40px; - color: #fff; - padding: 5px; - border-radius: 6px; -} +.clear {clear:both;} +.left {float:left;} +.right {float:right;} +.rtl {direction:RTL;} +.inactive {opacity:.2;} -a img -{ - border: 0; -} +A {text-decoration:none;} +A:hover {color:#00b7ed;} +A:focus {outline:none;} -/* menu */ -#editbar ul -{ - position: relative; - list-style: none; - padding-right: 3px; - padding-left: 1px; - z-index: 2; - overflow: hidden; - -} - -#editbar -{ - background: #f7f7f7; - background: linear-gradient(#f7f7f7, #f1f1f1 80%); - border-bottom: 1px solid #ccc; - height: 32px; - overflow: hidden; - padding-top: 3px; - width: 100%; -} - -#editbar ul li -{ - background: #fff; - background: linear-gradient(#fff, #f0f0f0); - border: 1px solid #ccc; - border-radius: 4px; - cursor: pointer; - float: left; - height: 18px; - margin-left: 2px; - overflow: hidden; - padding: 4px 5px; - width: 18px; -} - -#editbar ul li a -{ - text-decoration: none; - color: #ccc; -} - -#editbar ul li a span -{ - position: relative; - top:-2px -} - -#editbar ul li:hover { - background: #fff; -} - -#editbar ul li:active { - background: #eee; - background: linear-gradient(#ddd, #fff); -} - -#editbar ul li.separator -{ - border: inherit; - background: inherit; - visibility:hidden; - width: 0px; -} -#editbar ul li a -{ - display: block; -} -#editbar ul li a img -{ - padding: 1px; -} - - -#editbar ul -{ - float: left; -} -#editbar ul#menu_right -{ - float: right; -} - -#users -{ - display: none; -} - -#editorcontainer -{ - position: absolute; - - width: 100%; - - top: 36px; - left: 0px; - bottom: 0px; - - z-index: 1; -} - -#editorcontainer iframe { - height: 100%; - width: 100%; - padding: 0; - margin: 0; -} - -#editorloadingbox { padding-top: 100px; padding-bottom: 100px; font-size: 2.5em; color: #aaa; - text-align: center; position: absolute; width: 100%; height: 30px; z-index: 100; } - -#editorcontainerbox{ - position:absolute; - bottom:0; - top:0; - width:100%; -} - - -#padpage { - position: absolute; - top: 0px; - bottom: 0px; - width: 100%; -} - -.maximized #padpage { - left: 8px; - right: 8px; - width: auto; - margin-left: 0; -} - -body.fullwidth #padpage { width: auto; margin-left: 6px; margin-right: 6px; } -body.squish1width #padpage { width: 800px; } -body.squish2width #padpage { width: 700px; } - -a#backtoprosite, #accountnav { - display: block; position: absolute; height: 15px; line-height: 15px; - width: auto; top: 5px; font-size: 1.2em; display:none; -} -a#backtoprosite, #accountnav a { color: #cde7ff; text-decoration: underline; } - -a#backtoprosite { padding-left: 20px; left: 6px; - background: url(static/img/protop.gif) no-repeat -5px -6px; } -#accountnav { right: 30px; color: #fff; } - -.propad a#topbaretherpad { background: url(static/img/protop.gif) no-repeat -397px -3px; } - -#specialkeyarea { top: 5px; left: 250px; color: yellow; font-weight: bold; - font-size: 1.5em; position: absolute; } - -#alertbar { - margin-top: 6px; - opacity: 0; - display: none; - position:absolute; - left:0; - right:0; - z-index:53; -} - -#servermsg { position: relative; zoom: 1; border: 1px solid #992; - background: #ffc; padding: 0.8em; font-size: 1.2em; } -#servermsg h3 { font-weight: bold; margin-right: 10px; - margin-bottom: 1em; float: left; width: auto; } -#servermsg #servermsgdate { font-style: italic; font-weight: normal; color: #666; } -a#hidetopmsg { position: absolute; right: 5px; bottom: 5px; } - -#shuttingdown { position: relative; zoom: 1; border: 1px solid #992; - background: #ffc; padding: 0.6em; font-size: 1.2em; margin-top: 6px; } - -#docbar { margin-top: 6px; height: 25px; position: relative; zoom: 1; - background: #fbfbfb url(static/img/padtopback2.gif) repeat-x 0 -31px; } - -.docbarbutton -{ - padding-top: 2px; - padding-bottom: 2px; - padding-left: 4px; - padding-right: 4px; - border-left: 1px solid #CCC; - white-space: nowrap; -} - -.docbarbutton img -{ - border: 0px; - width: 13px; - margin-right: 2px; - vertical-align: middle; - margin-top: 3px; - margin-bottom: 2px; -} - -.menu, -.menu ul { - font-size: 10pt; - list-style-type: none; -} - -.menu ul { - padding-left: 20px; -} - -.menu a { - font-size: 10px; - line-height: 18px; - text-decoration: none; - color: #444; - font-weight: bold; -} - -.docbarbutton.highlight -{ - background-color: #fef2bd; - border: 1px solid #CCC; - border-right: 0px; -} - -#docbarleft { position: absolute; left: 0; top: 0; height: 100%; - overflow: hidden; - background: url(static/img/padtop5.gif) no-repeat left -31px; width: 7px; } - - - -#docbarpadtitle { position: absolute; height: auto; left: 9px; - width: 280px; font-size: 1.6em; color: #444; font-weight: normal; - line-height: 22px; margin-left: 2px; height: 22px; top: 2px; - overflow: hidden; text-overflow: ellipsis /*not supported in FF*/; - white-space:nowrap; } -.docbar-public #docbarpadtitle { padding-left: 22px; - background: url(static/img/public.gif) no-repeat left center; } - -#docbarrenamelink { position: absolute; top: 6px; - font-size: 1.1em; display: none; } -#docbarrenamelink a { color: #999; } -#docbarrenamelink a:hover { color: #48d; } -#padtitlebuttons { position: absolute; width: 74px; zoom: 1; - height: 17px; top: 4px; left: 170px; display: none; - background: url(static/img/ok_or_cancel.gif) 0px 0px; } -#padtitlesave { position: absolute; display: block; - height: 0; padding-top: 17px; overflow: hidden; - width: 23px; left: 0; top: 0; } -#padtitlecancel { position: absolute; display: block; - height: 0; padding-top: 17px; overflow: hidden; - width: 35px; right: 0; top: 0; } -#padtitleedit { position: absolute; top: 2px; left: 5px; - height: 15px; padding: 2px; font-size: 1.4em; - background: white; border-left: 1px solid #c3c3c3; - border-top: 1px solid #c3c3c3; - border-right: 1px solid #e6e6e6; border-bottom: 1px solid #e6e6e6; - width: 150px; display: none; -} - -#padmain { - margin-top: 0px; - position: absolute; - top: 63px !important; - left: 0px; - right: 0px; - bottom: 0px; - zoom: 1; -} - -#padeditor { - bottom:0px; - left:0; - position:absolute; - right:0px; - top:0; - zoom: 1; -} -.hidesidebar #padeditor { right: 0; } - -#vdraggie { -/* background: url(static/img/vdraggie.gif) no-repeat top center;*/ - width:16px; - height:16px; - background-image:url('../../static/img/etherpad_lite_icons.png'); - background-repeat: no-repeat; - background-position: 0px -300px; - - cursor: W-resize; - bottom:0; - position:absolute; - right:268px; - top:0; - width:56px; - z-index: 10; -} - -#editbarsavetable -{ - position:absolute; - top: 6px; - right: 8px; - height: 24px; -} - -#editbarsavetable td, #editbartable td -{ - white-space: nowrap; -} - -#myswatchbox { - position: absolute; - left: 5px; - top: 5px; - width: 24px; - height: 24px; - border: 1px solid #000; - background: transparent; - cursor: pointer; -} - -#myswatch { width: 100%; height: 100%; background: transparent;/*...initially*/ } - -#mycolorpicker { - width: 232px; height: 265px; - position: absolute; - left: -250px; top: 0px; z-index: 101; - display: none; - border-radius: 5px; - background: rgba(0, 0, 0, 0.7); - padding-left:10px; - padding-top:10px; -} -/* -#mycolorpicker ul li -{ - float: left; -} -#mycolorpicker .picked { border: 1px solid #000 !important; } - -#mycolorpicker .picked .pickerswatch { border: 1px solid #fff; } -*/ -#mycolorpickersave { - left: 10px; - font-weight: bold; -} - -#mycolorpickercancel { - left: 85px; -} - -#mycolorpickersave, #mycolorpickercancel { - background: #fff; - background: linear-gradient(#fff, #ccc); - border: 1px solid #ccc; - border-radius: 4px; - font-size:12px; - cursor: pointer; - color:#000; - overflow: hidden; - padding: 4px; - top: 240px; +INPUT[type=text] {border:2px solid #eaeaea; border-radius:5px; padding:3px 4px;} +INPUT[type=text]:focus {border-color:#00b7ed;} +BUTTON {background:none; border:0 none; color:#999; cursor:pointer; font-size:12px; margin-right:5px;} +BUTTON:hover, .button:hover {color:#00b7ed;} +.button { + background:linear-gradient(#eee, #c5c5c5); + border:1px solid #d5d5d5; + border-radius:3px; + color:#888; + cursor:pointer; + font-weight:700; + overflow:hidden; + padding:4px; text-align:center; - position: absolute; - width: 60px; + text-shadow:0 1px 0 #f5f5f5; } -#mycolorpickerpreview { - position: absolute; - left: 207px; - top: 240px; - width:16px; - height:16px; - padding:4px; - overflow: hidden; - color: #fff; - border-radius:5px; +/* editor toolbar */ +#editbar { + background:#f5f5f5; + background:linear-gradient(#f5f5f5, #eee 80%); + border-bottom:1px solid #d5d5d5; + overflow:hidden; + padding:3px 0 2px; + position:absolute; + width:100%; + z-index:2; +} +#editbar UL {list-style:none; overflow:hidden; padding:1px 3px 1px 2px; position:relative; z-index:2;} +#editbar .left {margin-left:22px;} +#editbar LI { + background:url(../../static/img/etherpad_lite_icons.png) 0 0 no-repeat; + border-radius:3px; + border:1px solid #d5d5d5; + box-shadow:0 1px 0 #fff; + color:#999; + cursor:pointer; + display:block; + float:left; + height:20px; + margin-left:2px; + overflow:hidden; + padding:2px; + width:20px; +} +#editbar .group-start {border-radius:3px 0 0 3px; border-width:1px 0 1px 1px;} +#editbar .group-mid {border-radius:0; border-width:1px 0 1px 1px; margin-left:0;} +#editbar .group-end {border-radius:0 3px 3px 0; margin:0 1em 0 0;} + +/* editbar icons */ +LI#bold {background-position:2px 2px;} +LI#italic {background-position:2px -18px;} +LI#underline {background-position:2px -38px;} +LI#strikethrough {background-position:2px -58px;} +LI#unorderedlist {background-position:2px -78px;} +LI#orderedlist {background-position:2px -98px;} +LI#indent {background-position:2px -118px;} +LI#outdent {background-position:2px -138px;} +LI#undo {background-position:2px -158px;} +LI#redo {background-position:2px -178px;} +LI#clearauthorship {background-position:2px -198px;} +LI#settings {background-position:2px -258px;} +LI#import_export {background-position:2px -278px;} +LI#history {background-position:2px -298px;} +LI#showusers {background-position:2px -318px; font-size:12px; text-align:right; width:32px;} +LI#embed {background-position:2px -338px;} +LI#bold:hover {background-position:-38px 2px;} +LI#italic:hover {background-position:-38px -18px;} +LI#underline:hover {background-position:-38px -38px;} +LI#strikethrough:hover {background-position:-38px -58px;} +LI#unorderedlist:hover {background-position:-38px -78px;} +LI#orderedlist:hover {background-position:-38px -98px;} +LI#indent:hover {background-position:-38px -118px;} +LI#outdent:hover {background-position:-38px -138px;} +LI#undo:hover {background-position:-38px -158px;} +LI#redo:hover {background-position:-38px -178px;} +LI#clearauthorship:hover {background-position:-38px -198px;} +LI#settings:hover, +#settings.selected {background-position:-38px -258px;} +LI#import_export:hover, +#import_export.selected {background-position:-38px -278px;} +LI#history:hover, +#history.selected {background-position:-38px -298px;} +LI#showusers:hover, +#showusers.selected {background-position:-38px -318px; color:#00b7ed;} +LI#embed:hover, +#embed.selected {background-position:-38px -338px;} + +#editorcontainer {bottom:0; left:0; position:absolute; top:34px; width:100%; z-index:1;} +.chat-visible #editorcontainer {right:192px; width:auto;} +#editorcontainer IFRAME {height:100%; margin:0; padding:0; width:100%;} +#editorloadingbox { + background:url(../../static/img/ajax-loader.gif) 50% 0 no-repeat; + color:#aaa; + font-size:24px; + height:64px; + margin:200px auto 0; + padding-top:48px; + position:absolute; + text-align:center; + width:100%; + z-index:100; +} +#editorcontainerbox {bottom:0; position:absolute; top:0; width:100%;} + +#padpage.full-width {width:100%;} +.full-width #revision {position:absolute; right:20px; top:20px;} +.full-width #padmain {left:0; right:197px; width:auto;} +.full-width #rightbars {margin-right:0; right:7px;} +.full-width #timeslider {width:auto;} + +#padcontent {font-size:12px; padding:10px;} + +#padpage {bottom:0; position:absolute; top:0; width:100%;} +.maximized #padpage {left:8px; margin-left:0; right:8px; width:auto;} +.fullwidth #padpage {margin-left:6px; margin-right:6px; width:auto;} +.squish1width #padpage {width:800px;} +.squish2width #padpage {width:700px;} + +#padmain {bottom:0; left:0; margin-top:0; position:absolute; right:0; top:30px; zoom:1;} +#padeditor {bottom:0; left:0; position:absolute; right:0; top:0; zoom:1;} +.hidesidebar #padeditor {right:0;} + +#specialkeyarea {color:yellow; font-size:1.5em; font-weight:700; left:250px; position:absolute; top:5px;} + +#alertbar {display:none; left:0; margin-top:6px; opacity:0; position:absolute; right:0; z-index:53;} + +#servermsg {background:#ffc; border:1px solid #992; font-size:1.2em; padding:.8em; position:relative; zoom:1;} +#servermsg H3 {float:left; font-weight:700; margin-bottom:1em; margin-right:10px; width:auto;} +#servermsg #servermsgdate {color:#666; font-style:italic; font-weight:400;} +#hidetopmsg {bottom:5px; position:absolute; right:5px;} +#shuttingdown {background:#ffc; border:1px solid #992; font-size:1.2em; margin-top:6px; padding:.6em; position:relative; zoom:1;} + +#editbarsavetable {height:24px; position:absolute; right:8px; top:6px;} +#editbarsavetable TD, #editbartable TD {white-space:nowrap;} + +/* modal windows for settings ################################################# */ +.popup { + background:#222; + background:rgba(0,0,0,.6); + border-radius:0 0 5px 5px; + box-shadow:0 0 8px #999; + color:#ddd; + display:none; + font-size:12px; + padding:6px 10px; + position:absolute; + right:3px; + top:34px; + width:450px; + z-index:2; +} +.popup H2, .popup H3 {font-size:14px; margin:.5em 0 2px;} +.popup INPUT[type=text] {box-sizing:border-box; display:block; width:100px;} +.popup INPUT[type=checkbox] {margin-right:2px;} +.popup A {text-decoration:none;} +.popup P {margin:4px 0 0 0;} +.left_popup {float:left; width:50%;} +.right_popup {box-sizing:border-box; float:left; width:50%;} + +/* users modal */ +#usersmenu {width:120px; z-index:500;} + +#myswatchbox {cursor:pointer; height:24px; left:6px; position:absolute; width:24px;} +#myswatch {background:transparent; border-radius:3px; height:100%; width:100%;} + +#myusernameform {margin-left:25px;} +#myusernameedit {background:transparent; color:#fff; margin:0; padding:3px 4px;} + +#mystatusform {margin-left:35px; margin-top:5px;} +#mystatusedit {background:transparent; border:1px solid #bbb; color:#777; display:none; height:14px; margin:0; padding:2px; width:199px;} + +#otheruserstable {display:none;} +#otheruserstable TD {border-top:1px solid #555; color:#fff; height:26px; padding:0 2px; vertical-align:middle;} +#otheruserstable .swatch {border:1px solid #000; height:13px; margin:0 4px; overflow:hidden; width:13px;} +.usertdswatch {width:1%;} +.usertdname {font-size:1.3em; color:#444;} +.usertdname .editempty {color:#888; font-style:italic;} +.usertdstatus {font-size:1.1em; font-style:italic; color:#999;} +.usertdactivity {font-size:1.1em; color:#777;} + +#nootherusers {color:#eee; font-size:1.2em; font-weight:700; padding:10px;} +#nootherusers A {color:#3c88ff;} + +/* colorpicker and swatches modal */ +#mycolorpicker {background:rgba(0, 0, 0, 0.7); border-radius:0 0 5px 5px; display:none; left:-250px; padding:10px; position:absolute; top:0; z-index:101;} +#colorpicker {margin-bottom:10px;} +#mycolorpickerpreview {display:none;} /*#mycolorpickerpreview {border-radius:3px; display:block; float:right; height:24px; width:24px;}*/ +#colorpickerswatches {padding-left:3px; padding-top:5px;} +#colorpickerswatches LI {border:1px solid #ccc; height:14px; margin:3px 6px; overflow:hidden; padding:0; width:14px;} +#colorpickerswatches LI:hover {border:1px solid #000; cursor:pointer;} + +/* export formats */ +.exporttype {background:url(../../static/img/etherpad_lite_icons.png) 0 0 no-repeat; color:#fff; margin-top:2px; padding-left:25px; text-decoration:none;} +#exporthtml {background-position:-40px -484px} +#exportplain {background-position:-40px -564px} +#exportword {background-position:-40px -464px} +#exportpdf {background-position:-40px -544px} +#exportopen {background-position:-40px -524px} +#exportwordle {background-position:-40px -564px} +#exportdokuwiki {background-position:-40px -504px} + +#importexportline {border-left:1px solid #fff; height:190px; left:260px; opacity:.8; position:absolute; width:0;} +.impexpbutton {background-image:linear-gradient(50% top, #ddd, #fff 20%, #fff 20%); padding:3px;} +#importmessagesuccess {display:none;} +#importsubmitinput {margin-top:12px;} + +#focusprotector {background-color:#fff; bottom:0; display:none; left:0; opacity:0.01; position:absolute; right:0; top:0; z-index:100;} + +/* embed / share pad */ +#embedmenu INPUT[type=text] {width:100%;} +#embedreadonly {margin-top:9px;} +#qr_center {margin:10px 10px auto 0; text-align:center;} +#embedreadonlyqr {box-shadow:0 0 10px #000; transition:all .2s ease-in-out;} +#embedreadonlyqr:hover {cursor:none; transform:scale(1.5);} + + +/* chat ####################################################################### */ +#chaticon { + background-color:#eee; + border-radius:3px 3px 0 0; + bottom:0; + color:#999; + cursor:pointer; + font-size:12px; + padding:6px 5px 3px 4px; + position:absolute; + right:4px; + text-shadow:0 1px 0 #fff; + z-index:1; +} +#chaticon A, #chatlabel {padding:3px 0 0;} +#chaticon A {background:url(../../static/img/etherpad_lite_icons.png) -40px -381px no-repeat; margin-right:5px; padding-left:22px; text-decoration:none;} +#chaticon:hover A, #chaticon:hover SPAN {color:#00b7ed;} +#chaticon:hover A {background-position:-40px -401px;} +#chaticon SPAN {font-weight:700;} + +#chatbox { + background-color:#eee; + border:2px solid #eee; + border-bottom-width:0; + border-radius:3px 3px 0 0; + bottom:0; + display:none; + height:300px; + padding-bottom:10px; + padding:3px; + position:absolute; + right:3px; + width:260px; + z-index:1; +} +.chat-visible #chatbox {border-color:#d5d5d5; border-radius:0; border-width:0 0 0 1px; height:auto; right:0; top:34px;} +#titlebar {bottom:2px; color:#999; font-size:12px; font-weight:700; padding:2px 1px; position:relative; text-shadow:0 1px 0 #fff;} +#titlelabel {position:absolute;} +#titlecross {background:url(../../static/img/etherpad_lite_icons.png) 0 -440px; cursor:pointer; float:right; height:16px; margin:-1px -4px 0 0; width:16px;} +#titlecross:hover {background-position:-40px -440px;} +#chattext { + background-color:#fff; + bottom:30px; + font-size:12px; + left:0; + overflow-y:scroll; + position:absolute; + right:0; + top:20px; + z-index:1002; +} +.chat-visible #chattext {top:0;} +#chattext P {overflow-x:hidden; padding:3px; word-wrap:break-word;} +.time {color:#eee; float:right; margin:0 1px;} +#chatinputbox {bottom:0; left:0; padding:2px 1px; position:absolute; right:0;} +#chatinputbox INPUT {font-size:12px; width:94%;} + +#chatthrob { + background-color:#000; + background-color:rgb(0,0,0); + background-color:rgba(0,0,0,0.7); + border-radius:6px; + bottom:40px; + color:#fff; + display:none; + font-size:14px; + height:40px; + opacity:.8; + padding:10px; + position:absolute; + right:20px; + width:150px; + z-index:200; +} + +/* resizable stuff for chat */ +.ui-resizable {position:relative;} +.ui-resizable-handle {display:block; font-size:0.1px; position:absolute; z-index:99999;} +.ui-resizable-nw { + background-image:url(../../static/img/etherpad_lite_icons.png) 0 -416px no-repeat; + background-size:100% auto; + cursor:nw-resize; + height:17px; + left:3px; + top:3px; + width:17px; +} +.ui-resizable-ne {cursor:ne-resize; height:9px; right:-5px; top:-5px; width:9px;} + + +/* pad content styles ######################################################### */ +/* lists */ +.list-bullet2, .list-indent2, .list-number2 {margin-left:3em;} +.list-bullet3, .list-indent3, .list-number3 {margin-left:4.5em;} +.list-bullet4, .list-indent4, .list-number4 {margin-left:6em;} +.list-bullet5, .list-indent5, .list-number5 {margin-left:7.5em;} +.list-bullet6, .list-indent6, .list-number6 {margin-left:9em;} +.list-bullet7, .list-indent7, .list-number7 {margin-left:10.5em;} +.list-bullet8, .list-indent8, .list-number8 {margin-left:12em;} + +/* unordered lists */ +UL {list-style-type:disc; margin-left:1.5em;} +UL UL {margin-left:0 !important;} + +.list-bullet2, .list-bullet5, .list-bullet8 {list-style-type:circle;} +.list-bullet3, .list-bullet6 {list-style-type:square;} + +.list-indent1, .list-indent2, .list-indent3, .list-indent5, .list-indent5, .list-indent6, .list-indent7, .list-indent8 {list-style-type:none;} + +/* ordered lists */ +OL {list-style-type:decimal; margin-left:1.5em;} +.list-number2, .list-number5, .list-number8 {list-style-type:lower-latin;} +.list-number3, .list-number6 {list-style-type:lower-roman;} + + +/* media-specific styles ###################################################### */ +@media screen and (max-width:960px) { + .modaldialog {left:0; margin:0 auto; position:relative; top:40px; width:80%;} +} + +@media screen and (max-width:600px) { + #editbar UL LI {padding:4px 1px;} +} + +@media only screen and (min-device-width:320px) and (max-device-width:720px) { + #editbar UL LI {padding:4px 3px;} + #editbar #menu_right > LI {padding:4px 8px;margin-top:2px; padding:4px 8px;} + #editbar #menu_right { + background:#f7f7f7; + background:linear-gradient(#f7f7f7, #f1f1f1 80%); + border-top:1px solid #ccc; + bottom:0; + height:32px; + overflow:hidden; + position:fixed; + width:100%; + } + #editbar #menu_right LI:not(:last-child) {display:none;} + #editbar #menu_right LI:last-child {border-radius:0; border:0; float:right; height:24px; margin-top:0;} + #chaticon {opacity:.8;} + #users {right:4px;} + #mycolorpicker {left:-72px;} /* #mycolorpicker:width - #users:width */ + #editorcontainer {margin-bottom:33px;} + #chaticon { + background:#f7f7f7; + background:linear-gradient(#f7f7f7, #f1f1f1 80%); + border:0; + border-radius:0; + border-right:none; + bottom:0; + right:55px; + } + #chatbox {bottom:32px; right:0;} + #editbar UL LI A SPAN {top:-3px;} + #usericonback {margin-top:4px;} } -#myusernameform { margin-left: 35px; } -#myusernameedit { font-size: 1.3em; color: #fff; - padding: 3px; height: 18px; margin: 0; border: 0; - width: 117px; background: transparent; } -#myusernameform input.editable { border: 1px solid #444; } -#myuser .myusernameedithoverable:hover { background: white; color: black} -#mystatusform { margin-left: 35px; margin-top: 5px; } -#mystatusedit { font-size: 1.2em; color: #777; - font-style: italic; display: none; - padding: 2px; height: 14px; margin: 0; border: 1px solid #bbb; - width: 199px; background: transparent; } -#myusernameform .editactive, #myusernameform .editempty { - background: white; border-left: 1px solid #c3c3c3; - border-top: 1px solid #c3c3c3; - border-right: 1px solid #e6e6e6; border-bottom: 1px solid #e6e6e6; - color: #000 -} -#myusernameform .editempty { color: #333; } - -table#otheruserstable { display: none; } -#nootherusers { padding: 10px; font-size: 1.2em; color: #eee; font-weight: bold;} -#nootherusers a { color: #3C88FF; } - -#otheruserstable td { - border-top: 1px solid #555; - height: 26px; - vertical-align: middle; - padding: 0 2px; - color: #fff; +/* IE fixes ################################################################### */ +* HTML #modaloverlay {/* for IE 6+ */ + background-image:none; + background-repeat:no-repeat; + opacity:1; /* in case this is looked at */ } -#otheruserstable .swatch { - border: 1px solid #000; width: 13px; height: 13px; overflow: hidden; - margin: 0 4px; -} -.usertdswatch { width: 1%; } -.usertdname { font-size: 1.3em; color: #444; } -.usertdstatus { font-size: 1.1em; font-style: italic; color: #999; } -.usertdactivity { font-size: 1.1em; color: #777; } -.usertdname input { border: 1px solid #bbb; width: 80px; padding: 2px; } -.usertdname input.editactive, .usertdname input.editempty { - background: white; border-left: 1px solid #c3c3c3; - border-top: 1px solid #c3c3c3; - border-right: 1px solid #e6e6e6; border-bottom: 1px solid #e6e6e6; -} -.usertdname input.editempty { color: #888; font-style: italic;} - + + +/* unclear, if any functionality for those styles exists ###################### */ .modaldialog.cboxreconnecting .modaldialog-inner, -.modaldialog.cboxconnecting .modaldialog-inner { - background: url(../../static/img/connectingbar.gif) no-repeat center 60px; - height: 100px; -} -.modaldialog.cboxreconnecting, -.modaldialog.cboxconnecting, -.modaldialog.cboxdisconnected { - background: #8FCDE0; -} -.cboxdisconnected #connectionboxinner div { display: none; } -.cboxdisconnected_userdup #connectionboxinner #disconnected_userdup { display: block; } -.cboxdisconnected_deleted #connectionboxinner #disconnected_deleted { display: block; } -.cboxdisconnected_initsocketfail #connectionboxinner #disconnected_initsocketfail { display: block; } -.cboxdisconnected_looping #connectionboxinner #disconnected_looping { display: block; } -.cboxdisconnected_slowcommit #connectionboxinner #disconnected_slowcommit { display: block; } -.cboxdisconnected_unauth #connectionboxinner #disconnected_unauth { display: block; } -.cboxdisconnected_unknown #connectionboxinner #disconnected_unknown { display: block; } +.modaldialog.cboxconnecting .modaldialog-inner + {background:url(../../static/img/ajax-loader.gif) no-repeat 50% 0; height:100px;} +.modaldialog.cboxreconnecting, .modaldialog.cboxconnecting, .modaldialog.cboxdisconnected {background:#8fcde0;} + +.cboxdisconnected #connectionboxinner DIV, +.cboxdisconnected .disconnected H2, +.cboxdisconnected_userdup .disconnected .h2_disconnect, +.cboxdisconnected_unauth .disconnected .h2_disconnect + {display:none;} + +.cboxdisconnected_userdup #connectionboxinner #disconnected_userdup, +.cboxdisconnected_deleted #connectionboxinner #disconnected_deleted, +.cboxdisconnected_initsocketfail #connectionboxinner #disconnected_initsocketfail, +.cboxdisconnected_looping #connectionboxinner #disconnected_looping, +.cboxdisconnected_slowcommit #connectionboxinner #disconnected_slowcommit, +.cboxdisconnected_unauth #connectionboxinner #disconnected_unauth, +.cboxdisconnected_unknown #connectionboxinner #disconnected_unknown, .cboxdisconnected_initsocketfail #connectionboxinner #reconnect_advise, .cboxdisconnected_looping #connectionboxinner #reconnect_advise, .cboxdisconnected_slowcommit #connectionboxinner #reconnect_advise, -.cboxdisconnected_unknown #connectionboxinner #reconnect_advise { display: block; } -.cboxdisconnected div#reconnect_form { display: block; } -.cboxdisconnected .disconnected h2 { display: none; } -.cboxdisconnected .disconnected .h2_disconnect { display: block; } -.cboxdisconnected_userdup .disconnected h2.h2_disconnect { display: none; } -.cboxdisconnected_userdup .disconnected h2.h2_userdup { display: block; } -.cboxdisconnected_unauth .disconnected h2.h2_disconnect { display: none; } -.cboxdisconnected_unauth .disconnected h2.h2_unauth { display: block; } +.cboxdisconnected_unknown #connectionboxinner #reconnect_advise, +.cboxdisconnected #reconnect_form, +.cboxdisconnected .disconnected .h2_disconnect, +.cboxdisconnected_userdup .disconnected .h2_userdup, +.cboxdisconnected_unauth .disconnected .h2_unauth + {display:block;} -#connectionstatus { - position: absolute; width: 37px; height: 41px; overflow: hidden; - right: 0; - z-index: 11; -} +#connectionstatus {height:41px; overflow:hidden; position:absolute; right:0; width:37px; z-index:11;} #connectionboxinner .connecting { - margin-top: 20px; - font-size: 2.0em; color: #555; - text-align: center; display: none; + margin-top:20px; + font-size:2em; + color:#555; + text-align:center; + display:none; } -.cboxconnecting #connectionboxinner .connecting { display: block; } +.cboxconnecting #connectionboxinner .connecting {display:block;} #connectionboxinner .disconnected h2 { - font-size: 1.8em; color: #333; - text-align: left; - margin-top: 10px; margin-left: 10px; margin-right: 10px; - margin-bottom: 10px; + font-size:1.8em; color:#333; + text-align:left; + margin-top:10px; margin-left:10px; margin-right:10px; + margin-bottom:10px; } #connectionboxinner .disconnected p { - margin: 10px 10px; - font-size: 1.2em; - line-height: 1.1; - color: #333; + margin:10px 10px; + font-size:1.2em; + line-height:1.1; + color:#333; } -#connectionboxinner .disconnected { display: none; } -.cboxdisconnected #connectionboxinner .disconnected { display: block; } +#connectionboxinner .disconnected {display:none;} +.cboxdisconnected #connectionboxinner .disconnected {display:block;} -#connectionboxinner .reconnecting { - margin-top: 20px; - font-size: 1.6em; color: #555; - text-align: center; display: none; -} -.cboxreconnecting #connectionboxinner .reconnecting { display: block; } +#connectionboxinner .reconnecting {color:#555; display:none; font-size:1.6em; margin-top:20px; text-align:center;} +.cboxreconnecting #connectionboxinner .reconnecting {display:block;} -#reconnect_form button { - font-size: 12pt; - padding: 5px; -} +#reconnect_form BUTTON {font-size:12px; padding:5px;} /* We give docbar a higher z-index than its descendant impexp-wrapper in order to allow the Import/Export panel to be on top of stuff lower down on the page in IE. Strange but it works! */ -#docbar { z-index: 52; } +#docbar {z-index:52;} -#impexp-wrapper { width: 650px; right: 10px; } -#impexp-panel { height: 160px; } -.docbarimpexp-closing #impexp-wrapper { z-index: 50; } +#impexp-wrapper {width:650px; right:10px;} +#impexp-panel {height:160px;} +.docbarimpexp-closing #impexp-wrapper {z-index:50;} -#savedrevs-wrapper { width: 100%; left: 0; } -#savedrevs-panel { height: 79px; } -.docbarsavedrevs-closing #savedrevs-wrapper { z-index: 50; } -#savedrevs-wrapper .dbpanel-rightedge { background-position: 0 -10px; } +#savedrevs-wrapper {width:100%; left:0;} +#savedrevs-panel {height:79px;} +.docbarsavedrevs-closing #savedrevs-wrapper {z-index:50;} +#savedrevs-wrapper .dbpanel-rightedge {background-position:0 -10px;} -#options-wrapper { width: 340px; right: 200px; } -#options-panel { height: 114px; } -.docbaroptions-closing #options-wrapper { z-index: 50; } +#options-wrapper {width:340px; right:200px;} +#options-panel {height:114px;} +.docbaroptions-closing #options-wrapper {z-index:50;} -#security-wrapper { width: 320px; right: 300px; } -#security-panel { height: 130px; } -.docbarsecurity-closing #security-wrapper { z-index: 50; } +#security-wrapper {width:320px; right:300px;} +#security-panel {height:130px;} +.docbarsecurity-closing #security-wrapper {z-index:50;} -#revision-notifier { position: absolute; right: 8px; top: 25px; - width: auto; height: auto; font-size: 1.2em; background: #ffc; - border: 1px solid #aaa; color: #444; padding: 3px 5px; - display: none; z-index: 55; } -#revision-notifier .label { color: #777; font-weight: bold; } +#revision-notifier {position:absolute; right:8px; top:25px; + width:auto; height:auto; font-size:1.2em; background:#ffc; + border:1px solid #aaa; color:#444; padding:3px 5px; + display:none; z-index:55;} +#revision-notifier .label {color:#777; font-weight:700;} -#mainmodals { z-index: 600; /* higher than the modals themselves - so that modals are on top in IE */ } -.modalfield { font-size: 1.2em; padding: 1px; border: 1px solid #bbb;} -#mainmodals .editempty { color: #aaa; } - -.expand-collapse { - height: 22px; - background-image: url(static/img/sharedistri.gif); - background-repeat: no-repeat; - background-position: 0 3px; - padding-left: 17px; - text-decoration: none; -} -.expand-collapse.expanded { - background-position: 0 -31px; -} +#mainmodals {z-index:600;} /* higher than the modals themselves so that modals are on top in IE */ +.modalfield {font-size:1.2em; padding:1px; border:1px solid #bbb;} +#mainmodals .editempty {color:#aaa;} +.expand-collapse {background:url(static/img/sharedistri.gif) 0 3px no-repeat; height:22px; padding-left:17px; text-decoration:none;} +.expand-collapse.expanded {background-position:0 -31px;} .modaldialog { - position: absolute; - top: 100px; + position:absolute; + top:100px; left:50%; margin-left:-243px; - width: 485px; - display: none; - z-index: 501; - zoom: 1; - overflow: hidden; - background: white; - border: 1px solid #999; + width:485px; + display:none; + z-index:501; + zoom:1; + overflow:hidden; + background:#fff; + border:1px solid #999; } -.modaldialog .modaldialog-inner { padding: 10pt; } +.modaldialog .modaldialog-inner {padding:10px;} .modaldialog .modaldialog-hide { - float: right; - background-repeat: no-repeat; - background-image: url(static/img/sharebox4.gif); - display: block; - width: 22px; height: 22px; - background-position: -454px -6px; + background:url(static/img/sharebox4.gif) -454px -6px no-repeat; + display:block; + float:right; + height:22px; margin-right:-5px; margin-top:-5px; + width:22px; } -.modaldialog label, -.modaldialog h1 { - color:#222222; - font-size:125%; - font-weight:bold; -} +.modaldialog LABEL, .modaldialog H1 {color:#222; font-size:125%; font-weight:700;} -.modaldialog th { - vertical-align: top; - text-align: left; -} +.modaldialog th {text-align:left; vertical-align:top;} -.nonprouser #sharebox-stripe { display: none; } +.nonprouser #sharebox-stripe {display:none;} -.sharebox-url { - width: 440px; height: 18px; - text-align: left; - font-size: 1.3em; - line-height: 18px; - padding: 2px; -} +.sharebox-url {height:18px; font-size:1.3em; line-height:18px; padding:2px; text-align:left; width:440px;} +#sharebox-send {background:url(static/img/sharebox4.gif) -383px -289px no-repeat; display:block; float:right; height:22px; width:87px;} -#sharebox-send { - float: right; - background-repeat: no-repeat; - background-image: url(static/img/sharebox4.gif); - display: block; - width: 87px; height: 22px; - background-position: -383px -289px; -} - - -#viewbarcontents { display: none; } -#viewzoomtitle { - position: absolute; left: 10px; top: 4px; height: 20px; line-height: 20px; - width: auto; -} -#viewzoommenu { - width: 65px; -} +#viewbarcontents {display:none;} #bottomarea { - height: 28px; - overflow: hidden; - position: absolute; - height: 28px; - bottom: 0px; - left: 0px; - right: 0px; - font-size: 1.2em; - color: #444; + height:28px; + overflow:hidden; + position:absolute; + height:28px; + bottom:0; + left:0; + right:0; + font-size:1.2em; + color:#444; } -#widthprefcheck { position: absolute; - background-image: url(static/img/layoutbuttons.gif); - background-repeat: no-repeat; cursor: pointer; - width: 86px; height: 20px; top: 4px; right: 2px; } -.widthprefunchecked { background-position: -1px -1px; } -.widthprefchecked { background-position: -1px -23px; } -#sidebarcheck { position: absolute; - background-image: url(static/img/layoutbuttons.gif); - background-repeat: no-repeat; cursor: pointer; - width: 86px; height: 20px; top: 4px; right: 90px; } -.sidebarunchecked { background-position: -1px -45px; } -.sidebarchecked { background-position: -1px -67px; } -#feedbackbutton { display: block; position: absolute; width: 68px; - height: 0; padding-top: 17px; overflow: hidden; - background: url(static/img/bottomareagfx.gif); - top: 5px; right: 220px; +#widthprefcheck { + background-image:url(static/img/layoutbuttons.gif); + background-repeat:no-repeat; + cursor:pointer; + height:20px; + position:absolute; + right:2px; + top:4px; + width:86px; } +.widthprefunchecked {background-position:-1px -1px;} +.widthprefchecked {background-position:-1px -23px;} +#sidebarcheck { + background-image:url(static/img/layoutbuttons.gif); + background-repeat:no-repeat; + cursor:pointer; + height:20px; + position:absolute; + right:90px; + top:4px; + width:86px; +} +.sidebarunchecked {background-position:-1px -45px;} +.sidebarchecked {background-position:-1px -67px;} #modaloverlay { - z-index: 500; display: none; - background-repeat: repeat-both; - width: 100%; position: absolute; - height: 100%; left: 0; top: 0; -} - -* html #modaloverlay { /* for IE 6+ */ - opacity: 1; /* in case this is looked at */ - background-image: none; - background-repeat: no-repeat; - /* scale the image */ -} - -a#topbarmaximize { - float: right; - width: 16px; - height: 16px; - margin-right:-143px; - margin-top:4px; - background: url(static/img/maximize_normal.png); -} - -.maximized a#topbarmaximize { - background: url(static/img/maximize_maximized.png); -} - -#editbarinner h1 { - line-height: 29px; - font-size: 16px; - padding-left: 6pt; - margin-top: 0; -} - -#editbarinner h1 a { - font-size: 12px; -} - -.bigbutton { - display: block; - background-color: #a3bde0; - color: #555555; - border-style: solid; - border-width: 2px; - border-left-color: #d6e2f1; - border-right-color: #86aee1; - border-top-color: #d6e2f1; - border-bottom-color: #86aee1; - margin: 10pt; - text-align: center; - text-decoration: none; - padding: 50pt; - font-size: 20pt; - border-radius: 3pt; -} - -.modaldialog .bigbutton { - padding-left: 0; - padding-right: 0; - width: 100%; -} - -} - - -ul#colorpickerswatches -{ - padding-left: 3px; - padding-top: 5px; -} - -ul#colorpickerswatches li -{ - border: 1px solid #ccc; - width: 14px; - height: 14px; - overflow: hidden; - margin: 3px 6px; - padding: 0px; -} - -ul#colorpickerswatches li:hover -{ - border: 1px solid #000; - cursor: pointer; -} - - - -#chatbox -{ - position:absolute; - bottom:0px; - right: 20px; - width: 180px; - height: 200px; - z-index: 400; - background-color:#f7f7f7; - border-left: 1px solid #999; - border-right: 1px solid #999; - border-top: 1px solid #999; - padding: 3px; - padding-bottom: 10px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; + background-repeat:repeat; display:none; -} - -#chattext -{ - background-color: white; - border: 1px solid white; - overflow-y:scroll; - font-size: 12px; + height:100%; + left:0; position:absolute; - right:0px; - left:0px; - top:25px; - bottom:25px; - z-index:1002; + top:0; + width:100%; + z-index:500; } -#chattext p -{ - padding: 3px; - overflow-x: hidden; -} -#chatinputbox -{ - padding: 3px 2px; - position: absolute; - bottom:0px; - right:0px; - left:3px; -} +/* to be removed ############################################################## */ +/*// the top bar is currently hidden! +#docbar {background-color:#fbfbfb; height:25px; margin-top:6px; position:relative; zoom:1;} +.docbarbutton {border-left:1px solid #ccc; padding-top:2px 4px; white-space:nowrap;} +.docbarbutton.highlight {background-color:#fef2bd; border:1px solid #ccc; border-right:0;} -#chatlabel -{ - font-size:13px; - line-height:16px; - font-weight:bold; - color:#555; - text-decoration: none; - position: relative; - bottom: 3px; -} - -#chatinput -{ - border: 1px solid #BBBBBB; - width: 100%; - float:right; -} - -#chaticon -{ - z-index: 400; +#docbarpadtitle { + color:#444; + font-size:1.6em; + font-weight:400; + height:22px; + left:9px; + line-height:22px; + margin-left:2px; + overflow:hidden; position:absolute; - bottom:0px; - right: 20px; - padding: 5px; - border-left: 1px solid #999; - border-right: 1px solid #999; - border-top: 1px solid #999; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - background-color:#fff; - cursor: pointer; + text-overflow:ellipsis; + top:2px; + white-space:nowrap; + width:280px; } +.docbar-public #docbarpadtitle {background:url(static/img/public.gif) 0 50% no-repeat; padding-left:22px;} -#chaticon a -{ - text-decoration: none; -} - -#chatcounter -{ - color:#555; - font-size:9px; - position:relative; - bottom: 2px; -} - -#titlebar -{ - line-height:16px; - font-weight:bold; - color:#555; - position: relative; - bottom: 2px; -} - -#titlelabel -{ - font-size:13px; - margin:4px 0 0 4px; +#docbarrenamelink {display:none; font-size:1.1em; position:absolute; top:6px;} +#docbarrenamelink A {color:#999;} +#docbarrenamelink A:hover {color:#48d;} +#padtitlebuttons { + background:url(static/img/ok_or_cancel.gif) 0 0 no-repeat; + display:none; + height:17px; + left:170px; position:absolute; -} - -#titlecross -{ - font-size:25px; - float:right; - text-align: right; - text-decoration: none; - cursor: pointer; - color:#555; + top:4px; + width:74px; + zoom:1; } - -.time -{ - float:right; - color:#333; - font-style:italic; - font-size: 10px; - margin-left: 3px; - margin-right: 3px; - margin-top:2px; -} - - -/* resizable stuff for chat */ -.ui-resizable { -position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - z-index: 99999; - display: block; - -} - -.ui-resizable-nw { - background-image: url("../../static/img/etherpad_lite_icons.png"); - background-position: 0 -416px; - background-repeat: no-repeat; - background-size: 100% auto; - cursor: nw-resize; - height: 17px; - left: 3px; - top: 3px; - width: 17px; -} - -.ui-resizable-ne -{ - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} - -.exporttype{ - margin-top: 2px; - background-repeat:no-repeat; - padding-left:25px; - background-image: url("../../static/img/etherpad_lite_icons.png"); - color:#fff; - text-decoration:none; -} - -#importexportline{ - border-left: 1px solid #fff; - height: 190px; +#padtitlesave { + display:block; + height:0; + left:0; + overflow:hidden; + padding-top:17px; position:absolute; - width:0px; - left:260px; - opacity:.8; + top:0; + width:23px; } - -.impexpbutton{ - background-image: linear-gradient(center top , #EEEEEE, white 20%, white 20%); - padding:3px; +#padtitlecancel { + display:block; + height:0; + overflow:hidden; + padding-top:17px; + position:absolute; + right:0; + top:0; + width:35px; } - -#exporthtml{ - background-position: 0px -299px; -} - -#exportplain{ - background-position: 0px -395px; -} - -#exportword{ - background-position: 0px -275px; -} - -#exportpdf{ - background-position: 0px -371px; -} - -#exportopen{ - background-position: 0px -347px; -} - -#exportwordle{ - background-position: 0px -323px; -} - -#exportdokuwiki{ - background-position: 0px -459px; -} - -#importstatusball{ +#padtitleedit { + background:#fff; + border: 1px solid #c3c3c3; + border-color:#c3c3c3 #e6e6e6 #e6e6e6 #c3c3c3; display:none; + font-size:1.4em; + height:15px; + left:5px; + padding:2px; + position:absolute; + top:2px; + width:150px; } - -#importarrow{ - display:none; -} - -#importmessagesuccess{ - display:none; -} - -#importsubmitinput{ - height:25px; - width:85px; - margin-top:12px; -} - -#importstatusball{ - height:50px; -} - -#chatthrob{ -display:none; -position:absolute; -bottom:40px; -font-size:14px; -width:150px; -height:40px; -right: 20px; -z-index: 200; -background-color: #000; -color: white; -background-color: rgb(0,0,0); -background-color: rgba(0,0,0,0.7); -padding: 10px; -border-radius: 6px; -opacity:.8; -} - -.buttonicon{ -width:16px; -height:16px; -background-image:url('../../static/img/etherpad_lite_icons.png'); -background-repeat: no-repeat; -margin-left: 1px; -margin-top: 1px; -} -.buttonicon-bold { - background-position: 0px -116px; -} -.buttonicon-italic { - background-position: 0px 0px; -} -.buttonicon-underline { - background-position: 0px -236px; -} -.buttonicon-strikethrough { - background-position: 0px -200px; -} -.buttonicon-insertorderedlist { - background-position: 0px -477px -} -.buttonicon-insertunorderedlist { - background-position: 0px -34px; -} -.buttonicon-indent { - background-position: 0px -52px; -} -.buttonicon-outdent { - background-position: 0px -134px; -} -.buttonicon-undo { - background-position: 0px -255px; -} -.buttonicon-redo { - background-position :0px -166px; -} -.buttonicon-clearauthorship { - background-position: 0px -86px; -} -.buttonicon-settings { - background-position: 0px -436px; -} -.buttonicon-import_export { - background-position: 0px -68px; -} -.buttonicon-embed { - background-position: 0px -18px; -} -.buttonicon-history { - background-position: 0px -218px; -} -.buttonicon-chat { - background-position: 0px -102px; - display: inline-block; -} -.buttonicon-showusers { - background-position: 0px -183px; - display: inline-block; -} - -#usericon -{ -width:33px !important; -} - -#focusprotector -{ - z-index: 100; - position: absolute; - bottom: 0px; - top: 0px; - left: 0px; - right: 0px; - background-color: white; - opacity:0.01; - display:none; -} - -#online_count{ - color: #999; -} - -#qr_center { - margin: 10px 10px auto 0; - text-align: center; -} - -#embedreadonlyqr { - box-shadow: 0 0 10px #000; - border-radius: 3px; - transition: all .2s ease-in-out; -} - -#embedreadonlyqr:hover { - cursor: none; - transform: scale(1.5); -} - -@media screen and (max-width: 960px) { - .modaldialog { - position: relative; - margin: 0 auto; - width: 80%; - top: 40px; - left: 0; - } -} - -@media screen and (max-width: 600px) { - #editbar ul li { - padding: 4px 1px; - } -} - -@media only screen and (min-device-width: 320px) and (max-device-width: 720px) { - #editbar ul li { - padding: 4px 3px; - } - #editbar ul#menu_right > li { - padding: 4px 8px; - margin-top: 2px; - } - #chaticon { - opacity: .8; - } - #users { - right: 4px; - } - #mycolorpicker { - left: -72px; /* #mycolorpicker:width - #users:width */ - } - #editorcontainer { - margin-bottom: 33px; - } - #editbar ul#menu_right { - background: #f7f7f7; - background: linear-gradient(#f7f7f7, #f1f1f1 80%); - width: 100%; - overflow: hidden; - height: 32px; - position: fixed; - bottom: 0; - border-top: 1px solid #ccc; - } - #editbar ul#menu_right li:not(:last-child) { - display: none; - } - #editbar ul#menu_right li:last-child { - height: 24px; - border-radius: 0; - margin-top: 0; - border: 0; - float: right; - } - #chaticon { - bottom: 0; - right: 55px; - border-right: none; - border-radius: 0; - background: #f7f7f7; - background: linear-gradient(#f7f7f7, #f1f1f1 80%); - border: 0; - } - #chatbox { - bottom: 32px; - right: 0; - border-top-right-radius: 0; - } - #editbar ul li a span { - top: -3px; - } - #usericonback { - margin-top: 4px; - } -} -.rtl{ - direction:RTL; -} - -#chattext p { - word-wrap: break-word; -} - -/* fix for misaligned labels */ -label { - position: relative; - bottom: 1px; -} - -.right { - float:right; -} - -.popup { - font-size: 14px; - width: 450px; - z-index: 500; - padding: 10px; - border-radius: 6px; - background: #222; - background: rgba(0,0,0,.7); - background: linear-gradient(rgba(0,0,0,.6), rgba(0,0,0,.7) 35px, rgba(0,0,0,.6)); - box-shadow: 0 0 8px #888; - color: #fff; -} - -.popup input[type=text] { - width: 100%; - padding: 5px; - box-sizing: border-box; - display:block; - margin-top: 10px; -} - -.popup a { - text-decoration: none; -} - -.popup h1 { - font-size: 18px; -} -.popup h2 { - font-size: 15px; -} -.popup p { - margin: 5px 0; -} - -.left_popup { - float: left; - width: 50%; -} - -.right_popup { - float: left; - width: 50%; - box-sizing: border-box; -} - -#settingsmenu, #importexport, #embed { - position: absolute; - top: 55px; - right: 20px; - display: none; -} - -.note { - color: #ddd; - font-size: 11px; - font-weight: bold; -} - -.selected { - background: #eee !important; - background: linear-gradient(#EEE, #F0F0F0) !important; -} +#topbarmaximize {background:url(../../static/img/etherpad_lite_icons.png) 0 -420px no-repeat; float:right; height:20; margin-right:-143px; margin-top:4px; width:20px;} +.maximized #topbarmaximize {background-position:-40px -420px;} +*/ \ No newline at end of file diff --git a/static/css/timeslider.css b/static/css/timeslider.css index 926c80123..447c04e6c 100644 --- a/static/css/timeslider.css +++ b/static/css/timeslider.css @@ -1,106 +1,51 @@ -#editorcontainerbox {overflow:auto; top:40px;} +/* adjust page layout to show timeslider */ +.maximized #padpage {left:8px; margin-left:0; right:8px; width:auto;} +.fullwidth #padpage {margin-left:6px; margin-right:6px; width:auto;} +.squish1width #padpage {width:800px;} +.squish2width #padpage {width:700px;} -#padcontent {font-size:12px; padding:10px;} +#padmain {top:59px;} +#editorcontainerbox {overflow:auto; top:34px;} /* #FIXME: the HTML structure is fucking destroyed! */ -#timeslider-wrapper {left:0; position:relative; right:0; top:0;} -#timeslider-left {background-image:url(../../static/img/timeslider_left.png); height:63px; left:0; position:absolute; width:134px;} -#timeslider-right {background-image:url(../../static/img/timeslider_right.png); height:63px; position:absolute; right:0; top:0; width:155px;} -#timeslider {background-image:url(../../static/img/timeslider_background.png); height:63px; margin:0 9px;} -#timeslider #timeslider-slider {height:61px; left:0; position:absolute; top:1px; width:100%;} -#ui-slider-handle { - -khtml-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - -webkit-user-select:none; - background-image:url(../../static/img/crushed_current_location.png); - cursor:pointer; - height:61px; - left:0; - position:absolute; - top:0; - user-select:none; - width:13px; -} -#ui-slider-bar { - -khtml-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - -webkit-user-select:none; - cursor:pointer; - height:35px; - margin-left:5px; - margin-right:148px; - position:relative; - top:20px; - user-select:none; -} +/* timeslider sprite */ +#ui-slider-handle, #playpause_button, #steppers A {background:url(../../static/img/timeslider-sprite.png) 0 0 no-repeat;} -#playpause_button, #playpause_button_icon {height:47px; position:absolute; width:47px;} -#playpause_button {background-image:url(../../static/img/crushed_button_undepressed.png); right:77px; top:9px;} -#playpause_button_icon {background-image:url(../../static/img/play.png); left:0; top:0;} -.pause#playpause_button_icon {background-image:url(../../static/img/pause.png);} +#timeslider {background:#f5f5f5; border-bottom:1px solid #d5d5d5; padding:6px 0; position:absolute; top:0; width:100%;} +#timer {background-color:#aaa; border-radius:3px; color:#fff; font-family:Arial, sans-serif; font-size:11px; left:6px; min-width:101px; padding:2px 4px 1px; position:absolute; top:7px;} +#timeslider-wrapper {float:left; width:100%;} +#timeslider-slider {margin:0 164px 0 6px;} +#timeslider-slider DIV {cursor:pointer;} +#ui-slider-handle {background-position:-142px 0; height:22px; left:0; position:absolute; top:30px; width:13px;} +#ui-slider-bar {background:#ddd; height:6px; margin-top:40px;} -#leftstar, #rightstar, #leftstep, #rightstep - {background:url(../../static/img/stepper_buttons.png) 0 0 no-repeat; height:21px; overflow:hidden; position:absolute;} -#leftstar {background-position:0 44px; right:34px; top:8px; width:30px;} -#rightstar {background-position:29px 44px; right:5px; top:8px; width:29px;} -#leftstep {background-position:0 22px; right:34px; top:20px; width:30px;} -#rightstep {background-position:29px 22px; right:5px; top:20px; width:29px;} +#playpause_button {background-color:#ddd; background-position:-60px 0; border-radius:30px; float:right; height:46px; width:46px;} +#playpause_button:hover {background-position:-60px -40px;} +#playpause_button.pause {background-position:-100px 0;} +#playpause_button.pause:hover {background-position:-100px -40px;} -#timeslider .star { - background-image:url(../../static/img/star.png); - cursor:pointer; - height:16px; - position:absolute; - top:40px; - width:15px; -} +#steppers {float:right; margin:0 35px 0 10px; width:60px;} +#steppers A {border:1px solid #d5d5d5; box-shadow:0 1px 0 #fff; float:left; height:20px; margin:0 0 4px; width:28px;} +#steppers .group-start {border-radius:3px 0 0 3px;} +#steppers .group-end {border-radius:0 3px 3px 0; border-width:1px 1px 1px 0; width:29px;} -#timeslider #timer { - color:#fff; - font-family:Arial, sans-serif; - font-size:11px; - left:7px; - position:absolute; - text-align:center; - top:9px; - width:122px; -} +A#leftstar, #leftstar.inactive:hover {background-position:0 0;} +A#rightstar, #rightstar.inactive:hover {background-position:-30px 0;} +A#leftstep, #leftstep.inactive:hover {background-position:0 -20px;} +A#rightstep, #rightstep.inactive:hover {background-position:-30px -20px;} +A#leftstar:hover {background-position:0 -40px;} +A#rightstar:hover {background-position:-30px -40px;} +A#leftstep:hover {background-position:0 -60px;} +A#rightstep:hover {background-position:-30px -60px;} -.topbarcenter, #docbar {display:none;} -#padmain {top:30px;} -#editbarright {float:right;} -#returnbutton {color:#222; font-size:16px; line-height:29px; margin-top:0; padding-right:6px;} -#importexport {top:118px;} -#importexport .popup {width:185px;} +/* #TODO: this image does not exist */ +#timeslider .star {background-image:url(../../static/img/star.png); cursor:pointer; height:16px; position:absolute; top:40px; width:15px;} -/* lists */ -.list-bullet2, .list-indent2, .list-number2 {margin-left:3em;} -.list-bullet3, .list-indent3, .list-number3 {margin-left:4.5em;} -.list-bullet4, .list-indent4, .list-number4 {margin-left:6em;} -.list-bullet5, .list-indent5, .list-number5 {margin-left:7.5em;} -.list-bullet6, .list-indent6, .list-number6 {margin-left:9em;} -.list-bullet7, .list-indent7, .list-number7 {margin-left:10.5em;} -.list-bullet8, .list-indent8, .list-number8 {margin-left:12em;} +.topbarcenter, #docbar {display:none;} /* hide document title etc. */ +#editbarinner H1 {color:#999; font-size:16px; line-height:29px; margin-top:0; padding-left:6px;} +#editbarinner H1 A {font-size:12px;} +#revision_label {background-color:#aaa; border-radius:3px; color:#fff; padding:2px 5px;} -/* unordered lists */ -UL {list-style-type:disc; margin-left:1.5em;} -UL UL {margin-left:0 !important;} +#editbarright #returnbutton {background:0 none; border:0 none; box-shadow:none; padding:4px 6px; width:auto;} +#returnbutton A {color:#999; font-size:12px; line-height:20px;} -.list-bullet2, .list-bullet5, .list-bullet8 {list-style-type:circle;} -.list-bullet3, .list-bullet6 {list-style-type:square;} - -.list-indent1, .list-indent2, .list-indent3, .list-indent5, .list-indent5, .list-indent6, .list-indent7, .list-indent8 {list-style-type:none;} - -/* ordered lists */ -OL {list-style-type:decimal; margin-left:1.5em;} -.list-number2, .list-number5, .list-number8 {list-style-type:lower-latin;} -.list-number3, .list-number6 {list-style-type:lower-roman;} - - - -/* IE 6/7 fixes ################################################################ */ -* HTML #ui-slider-handle {background-image:url(../../static/img/current_location.gif);} -* HTML #timeslider .star {background-image:url(../../static/img/star.gif);} -* HTML #playpause_button_icon {background-image:url(../../static/img/play.gif);} -* HTML .pause#playpause_button_icon {background-image:url(../../static/img/pause.gif);} \ No newline at end of file +#importexport.popup {top:95px; width:140px;} \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico index 2529c923f30e7ad806630c1ec40c4ca9db439d64..2e0e60d7f010d34a7d888a6ec3477b485fb0fe71 100644 GIT binary patch literal 1150 zcmb_WEpNh56g?YD5Hkd^Y!12qfgxZ}h{>sWreS`60ZW3y0fvMhKnQaa7?Ld;rjWFO zA!xgMQ%-V29(jf~x97a`ar=NPc?$)|w}h7);10l}j7Xwnx&R>F>64}@IN`K92u4VK zqd9gg`g+#4J#zKQiPUVD8Z$)duB=OAk9euR-N&8O!f9oAs?npaXh(gX$=R`ZslIC` zHQ)VtPakrhMPJAIwnwhM-Y?$&+*7lty6^t+-}gf_Z}jZH$irE^ufCq`Uh?SUsjFOb z>{wJ?edgG6VRG2zgVA-o|LQ!i$Hl;v@oC%7*LU5qTfDW-WtTZXXHy1N$5}Up*Rt6N QXXZB&?KYca0witVA9c{^rvLx| literal 1150 zcmc)J&q@MO6vy$S1hx=!5ki9KvS?#%+GrSr&;ukPRNI#A16OVW-ABDZi(Vj6(kE!u zDk!3;Aczo+Bx?E|?p(O&6ye4rAJ6^cZ^ju%kr1zVTzJpO-jql}MCQQ~D`uVcTWzuN zjV9Wt;0ztux?*tZPr`H$m$-oDyKw72`Me((H?QA8jhio#P5+T^v$um=4A8?JmZ0Z- zgzo9>&cUrkCRrp=7!qT?=BzQCXsvK|y&mg;@q$064V4%5#AWXPC!Z=~7aLf|14hfu z>e%Gp>C0F}1VwzHfn%g#Dmbslxxo|Wp!rv9LyvI}Q^9%tZD*0e3^f0YB&v9Uso=c5 yciQ#;qu0^L7p}1hQ=@siGm(CHByxTN+oyRDxC*QOCelK4U!=|x-9nAA-Twi9>5l{e diff --git a/static/favicon.psd b/static/favicon.psd new file mode 100644 index 0000000000000000000000000000000000000000..0e870be1356a74d5a75abb929cfb0bedffee3dc3 GIT binary patch literal 30000 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 literal 0 HcmV?d00001 diff --git a/static/img/ajax-loader.gif b/static/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe2cd23b3a3c017ae6acfd291135a998e2f8ee74 GIT binary patch literal 3208 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 C|Ftdv literal 0 HcmV?d00001 diff --git a/static/img/crushed_button_depressed.png b/static/img/crushed_button_depressed.png deleted file mode 100644 index d75dcce289051293d69a9be79874492ef7959be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4134 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 diff --git a/static/img/crushed_button_undepressed.png b/static/img/crushed_button_undepressed.png deleted file mode 100644 index d86e3f39743bc7b5334c58442a000bd39f772b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4166 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 QNB{r;07*qoM6N<$f)X$A_5c6? diff --git a/static/img/crushed_current_location.png b/static/img/crushed_current_location.png deleted file mode 100644 index 76e08359e3cdef6b81bf1799de7d9d1333ced9e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmV4Tx07%D;lubw!VHn5%vyBL$L1eZG#n8bdR3?p50&~}|Y-L^6T}=^UoqczA za-5xJcGnb%5TaXI$LL~7bg+mH;h~^Y9U=tH>L5XMvIruGP=a!lflfp+G*2MVV=={I+u3*z&b%+znSNh? z@6wl(2Or&d>ig(^5$5psQ?64%fTIpj5x4n-$s;zOHF-RxrHF@3mJ*RDu|{00hk|Xy zcZv7J9X#UTC^ICWq?I@+X*%h+Du|mhQry&>Cl=MHtP-!9_NXC^Q4G!N`f2XMZZqWr zS`Gob-V|*^1~C5sI8a@*)wqHE1HeLK(Y7A6_QO>!8nMO(%fyv=si#lb?0Pj&dK=ih zmCgRTm(6b8ryA79OGQfSncR*z?k!;VYd@2IFi$(NJ(G2sfLYq(z;3{I4Y>0eIQkga z_Y4S>1EFTPt|EV>*k!9uTT+|Q<#-|`G>GCU!9%Z>3EiqxUn@iuMX+3kpfiK%85XU_ zn39%q_4d+L#?){h-Dy786=rngn46A9+G&@lC;l2`?H%TOBz_o^JG;#V(zP1XJHs|} z$K+IZ$Yxi+s`z_y>{dtoy*W)@OL>ENeIwJ?k+)xroC^?F5eG+;J~O70a$6@8p#hsY zWirv`&+$7w9W?76p_n;MvHtVao9h(@p@2b#O1~-u1knXA>YzbK5;5|~6d{w9Sur}X zfzdxkDhN1OApaWWtXVmikfv-is~=uJrfUldg7`uFF0P2P;+*(xrYc=i^i1m)WNGo{ z57IR&=XG=5Tu-*XM0GvnRS+lZSYal^(W#@mm^xEcR5EL@>;4VLl+0174kMP*s8uOr z`3(B?II8WmJ&Juj_1s;owZbn9FPFWZ+On(Uwy9WQs;$q(IA=cN5A(6$#NkC3M6+2gxWKJ~}`KYMUz8EMX|Kk@(Bqq`;~X>zMQMY^9n>Q4V> f7zLwX6p#V{MAqJ+{L9Q100000NkvXXu0mjf5AW6a diff --git a/static/img/etherpad_lite_icons.png b/static/img/etherpad_lite_icons.png index cadf5ed2b3717939e2f23dc0c24a5360f8e822d8..346d0269884e75bdaa191a1d40d2ff5a0fe42028 100644 GIT binary patch literal 13118 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 Ye<-N2bPDNB8 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 diff --git a/static/img/etherpad_lite_icons.psd b/static/img/etherpad_lite_icons.psd new file mode 100644 index 0000000000000000000000000000000000000000..e4e6ccaf315eeceb1ba6ef035fb7461883b57f6b GIT binary patch literal 233616 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 MJ$U#JwPT6@3r$0UB>(^b literal 0 HcmV?d00001 diff --git a/static/img/pause.png b/static/img/pause.png deleted file mode 100644 index 657782c0fac9f6e6058803bd276a36b73b83d1de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 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 diff --git a/static/img/timeslider-sprite.png b/static/img/timeslider-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..027e0ae82e0b9d56e77a37f469bf672ad265ec29 GIT binary patch literal 2690 zcmV-|3Vrp7P)smQ2B6IqIM z6NtvfiIyU0ww7(nmM!Vi_0n;B4xh&inFJX&ZQ5kmvW?B(ww?qF7aX^4k_(NWi~!N* zk2Q2?B$N|M|0GQUrKP1$VZrkp^@ARnsGF0hV-0ro&gZd6WPF|m<#J>q(KL|_NalsZ z8zm(ry=raTZucL6>6KXUJQok3N2a9P8&JG7^cJ~PAY2>?mztwRQUuIwBV2=MwJ_NG zU@+$hf{VTrM>0tK#waF_;#thFhP~ z@LNN;&i<3)uHGPLzZ0)=xsFMQ)(V6CA-FLmqJ@D7VW>XP#4acjhs-iHs=}vMbw=Is8EDa90aQ4nNH$msi(Oq^1I^9Nr@&GqRsLNR2OO-- zYifeA4%+~EqZ(JdIgyDvqwe?&_$)N~wlQpq3j`$Cw)*<|Ps_{8pBNk*TnH0yw-Vt_ zpFaJKnqaI8g+ft1dLoHxYHAG2goVuI*4Eac88c=)4zl*q$lKhF%CHXx?SZvx*A4~( zfr}~=zj@MX@XCS(3%PK~1HaSj!b-Ta4z5U7k`}g0K zSqT;|h-7GJXgCe?q#bw<&bz|l@Xcq=oCz9H)ridM>gsdLmoI-E77>2}qMgfg@4f)# zA?ekOT}=yDYbW~xgi|PPBG)uUeVl_q{Oy`GYrf2^= zgC-`ENfwL6zJ_Bv+&XHtJ_=;xTH5vW^ki+>y8Dlc|Lj}L_0HJ{8iDWkz~xuN@jbX) zSKP}3r=bM`LD%c0)cZY;AP76*@~_3(4^F{BWXl)fJRT2z?f5fX?qNk37?5O~$d*sw zr!^p52e{P_;IgKeo_!=qmM!nVzyKgz9T08^E|(U~{B@Eg29eGDg+n?p;NfC;=9eF> z<3u(K=W%6aWy0LKa~q2OKOfP-T)14Wk(Db~hTGcO-XgLYfI?1!lwV^CGG!M`zJbr@ zy96YAcjnBQzk&XGmB^-_XjkPV;HM9>K7VA&E|h$O%F4`YcHl(@8cdCt<6{<53M2x8k(|<{QLfu@DdrUF$Y0 z^})c+Wy_ZRr@FfOFBDH_aL%SBC&9|s3U+3KVEy} z$dP%;WYRXTOEBM{si_Iw)&Q7Gbu@MPWj^XLB_3Wb&o4-fk=*bW~g9f+qCq?dzN9}{HbHRcCh6EMv-?Ed%MCgq`R28!jAhHpNYy<+4jX-205ZMR>A{(KAkaYwk-}giMbiH)k zou-zySt=7TWKvHD073#+JEQlw^i71`NSeE-B=#?olwhD9| z0$nkXlJ-HcAymJO0-0K!ob5@7Y^uz^bEz&Y5km`*7+Ml^vynOW5TNq~(D@!_le`3) zvt7fD0+}`ft3q<3$?^TNa_1udwWmnf2HR>;Bv&#~XVjh1J_z=ov*BW3=`^8JoMb+C zgNxt3ztR8k`kPABmyuA1ZLqBtMRF+#z-wcUa?!HzzVtXVe{^A)hXSV9bpsp!9(idEh{kf8=K+s*D?c>3?z6OmD2y zN;Em)vXP0pqRyy0wCjVCpdl`dS0CG30>aYwoBiJ{_A4)1M?{8yC7T6YoNcZxO%*(s z*Xe~(nW!V`iaGUOqK+F`;`egoQq*ZkhL0xy9!fObJhM@^&EFS9$Kkg5C!qV+zHs zCL5wu>eQ}``}mi6(Czi7-5V&3@5%a*H*l}Rz*1bdOsL1rInZ@l@pm;u7@-eDo9u&d zJ&2$sUoYva0Qy-h{VgFw28}JLf5&Des zA@q_>%1QW0Dfz{sRo-mW2Toh<(wU{85C(2OIj`&~fwNyhpGApc;}A3w4RaE zlN}4auQ2NZHx-S8f_Ku?&TQxnp1kezpOXK&Hypk3=#N)Y!FJMvq=lFfe3vO(#C(ID z4c_m-n%oV)f0%4WZpmqjS08}G=q}#*r7w)`!z#Chzc0BhB3c2#Xjph=PC`B{TPoiG w3hm=rBxEBHOn0LM0+EeCWFrv9@P7dY04Sq0dH%0megFUf07*qoM6N<$f)Ec9Z2$lO literal 0 HcmV?d00001 diff --git a/static/img/timeslider-sprite.psd b/static/img/timeslider-sprite.psd new file mode 100644 index 0000000000000000000000000000000000000000..1914d1c141441ca21db64e0c032359020dd35af6 GIT binary patch literal 61735 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 literal 0 HcmV?d00001 diff --git a/static/img/timeslider_background.png b/static/img/timeslider_background.png deleted file mode 100644 index 851af4e8000a0de07f0bb2248eb73c0c817f0b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bU!OXzG*wuaWGms-$;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B?TXz$e7@-@kwV|Nl=*OFMJs%=ho#xni=90i|p`T^vIy zZY3q8B{VuKNGmi;efqJv}@+I#ZO?)Y#I} dG@OLk8TK(UUcVv{dJ$+4gQu&X%Q~loCIDe5JEZ^s diff --git a/static/img/timeslider_left.png b/static/img/timeslider_left.png deleted file mode 100644 index 48a9b0e1797c61874ac301fc2c518c3bc575b693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^Z9r_#!OXzGn3`J90pv)QxJHx&=ckpFCl;kLIHu$$ zr7C#lCZ?wbr6#6S7M@JC0V=8v@CkAK_wV22$&=I4(&FRemn~cN_3PJp^X7f{@L|P@ z6+eIeym8~k^5x6duV4TB_wQS`Zmn9iYQu&NFJ8P@vSi8m^XIQ$zkcrAxuZvqo;Y#h z-Me=`e*F0L>(|AL7oRva#N!CE=vZ+BMQ9>-DJ-emF6f(JQGlD$`rR^;80*oEOlad!TIIG!Gig# ztoRdET_Tov$*Qt2Fk3rrXJ8QkQqCN+7p~K5(f6@%(Bfc~E)5YVdwC(y(IQTx-?Gw4 zi-D=5F?Le$Tqg&YX$t3fm~IC1)+;T!!(*y7>!6myKEYKXJi%83jaTHer84BOF}FI* z;CkuY96QBn{R$=)fo8V(T1V3~PIv{q5!cjeX}6ksCgHJy^=s}<=d%wMEZ|6LoVCy_ zi|y)}2SA3`K0&56AwJ2A(|TqZ2Ax^3rB2c(Eg#0phTQN0!Mlk<>LSn-SP!miR^E*q3WToHk{**(JN!lZD$1S`>R? z+D@&l+1SnKEAjpQt^ILddQ%T}EZ%H9XCrf>@wTJIrPkfRNM-PJ^>bP0l+XkKhssVM diff --git a/static/img/timeslider_right.png b/static/img/timeslider_right.png deleted file mode 100644 index 1a1b2685b24a2e620a33d95f45ff6fe6867d20c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmeAS@N?(olHy`uVBq!ia0vp^vw_&2gPDPWal2{N1t3SV#5JNMI6tkVJh3R1!7(L2 zDOJHUH!(dmC^a#qvhZZ84N#F^fKQ0)@87@w{{8#o$B&;sf2O6SefaR z@80?I=dWMC{`KqEix)4xeEIU%uV0@(e}4Dw-K|@<&Ye5=@87>ur%v6zef$6a|7Xse z`TqSokg;8a>pak8sgfYSU?3MeU=UGaxCL~px~Gd{NX4xrf#WP|c!VMtd|8fmhH?rx z@I>4>>98b?O(|C`il@7hfwAT4#b&R$7Nu7^yMwRR0{OaihK&6x6Q30dt@Nu2k)3;` zbMn%@nSSq***O%FE^8V#%zLsC?!d<{lIHwaQP_OgqVUgD0pZSLhDJs~$2Ddx zu`bkNit}t>ShTFLX;R1+ZQ;cnq0W8%yFMCZ-CB{kcv_bUT3g62(&S+u-Lk3y2GiT|Lvn#Y}u76H&*X|u)%QKOlHHA zIfYueyDw~7sCejBh|xM<#$4?UzL|@A&2IfmEVeECIaxfKZJl)PmWyuDYtP0yZoOOo us$!eM0<(?x&oJdLY0Rl}-1@UpUwsi{&#~=IeanCW%i!ti=d#Wzp$PzhYXgh` diff --git a/static/js/broadcast_slider.js b/static/js/broadcast_slider.js index 0bdc2cabc..5604eb6dd 100644 --- a/static/js/broadcast_slider.js +++ b/static/js/broadcast_slider.js @@ -1,5 +1,5 @@ /** - * This code is mostly from the old Etherpad. Please help us to comment this code. + * This code is mostly from the old Etherpad. Please help us to comment this code. * This helps other people to understand this code better and helps them to improve it. * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED */ @@ -20,471 +20,367 @@ * limitations under the License. */ - // These parameters were global, now they are injected. A reference to the - // Timeslider controller would probably be more appropriate. -function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) -{ +// These parameters were global, now they are injected. A reference to the +// Timeslider controller would probably be more appropriate. +function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) { var BroadcastSlider; - (function() - { // wrap this code in its own namespace - var sliderLength = 1000; - var sliderPos = 0; - var sliderActive = false; - var slidercallbacks = []; - var savedRevisions = []; - var sliderPlaying = false; + (function() { // wrap this code in its own namespace + var sliderLength = 1000, + sliderPos = 0, + sliderActive = false, + slidercallbacks = [], + savedRevisions = [], + sliderPlaying = false; - function disableSelection(element) - { - element.onselectstart = function() - { + function disableSelection(element) { + element.onselectstart = function() { return false; }; - element.unselectable = "on"; + element.unselectable = "on"; element.style.MozUserSelect = "none"; - element.style.cursor = "default"; } - var _callSliderCallbacks = function(newval) - { - sliderPos = newval; - for (var i = 0; i < slidercallbacks.length; i++) - { - slidercallbacks[i](newval); - } - } - - - - - - var updateSliderElements = function() - { - for (var i = 0; i < savedRevisions.length; i++) - { - var position = parseInt(savedRevisions[i].attr('pos')); - savedRevisions[i].css('left', (position * ($("#ui-slider-bar").width() - 2) / (sliderLength * 1.0)) - 1); - } - $("#ui-slider-handle").css('left', sliderPos * ($("#ui-slider-bar").width() - 2) / (sliderLength * 1.0)); - } - - - - - - var addSavedRevision = function(position, info) - { - var newSavedRevision = $('
'); - newSavedRevision.addClass("star"); + var _callSliderCallbacks = function(newval) { + sliderPos = newval; + for (var i=0, l=slidercallbacks.length; i < l; i++) { + slidercallbacks[i](newval); + } + }; + var updateSliderElements = function() { + for (var i=0, l=savedRevisions.length; i < l; i++) { + var position = parseInt(savedRevisions[i].attr('pos'), 10); + savedRevisions[i].css('left', (position * ($('#ui-slider-bar').width() - 2) / (sliderLength * 1.0)) - 1); + } + $('#ui-slider-handle').css('left', sliderPos * ($('#ui-slider-bar').width() - 2) / (sliderLength * 1.0)); + }; + var addSavedRevision = function(position, info) { + var newSavedRevision = $('
'); + newSavedRevision + .addClass('star') + .attr('pos', position) + .css('position', 'absolute') + .css('left', (position * ($('#ui-slider-bar').width() - 2) / (sliderLength * 1.0)) - 1); + $('#timeslider-slider').append(newSavedRevision); + newSavedRevision.mouseup(function(evt) { + BroadcastSlider.setSliderPosition(position); + }); + savedRevisions.push(newSavedRevision); + }; - newSavedRevision.attr('pos', position); - newSavedRevision.css('position', 'absolute'); - newSavedRevision.css('left', (position * ($("#ui-slider-bar").width() - 2) / (sliderLength * 1.0)) - 1); - $("#timeslider-slider").append(newSavedRevision); - newSavedRevision.mouseup(function(evt) - { - BroadcastSlider.setSliderPosition(position); - }); - savedRevisions.push(newSavedRevision); - }; - - var removeSavedRevision = function(position) - { - var element = $("div.star [pos=" + position + "]"); - savedRevisions.remove(element); - element.remove(); - return element; - }; + var removeSavedRevision = function(position) { + var element = $('.star [pos=' + position + ']'); + savedRevisions.remove(element); + element.remove(); + return element; + }; /* Begin small 'API' */ - - function onSlider(callback) - { + function onSlider(callback) { slidercallbacks.push(callback); } - function getSliderPosition() - { + function getSliderPosition() { return sliderPos; } - function setSliderPosition(newpos) - { + function setSliderPosition(newpos) { newpos = Number(newpos); - if (newpos < 0 || newpos > sliderLength) return; - $("#ui-slider-handle").css('left', newpos * ($("#ui-slider-bar").width() - 2) / (sliderLength * 1.0)); - $("a.tlink").map(function() - { - $(this).attr('href', $(this).attr('thref').replace("%revision%", newpos)); + if (newpos < 0 || newpos > sliderLength) + return; + $('#ui-slider-handle').css('left', newpos * ($('#ui-slider-bar').width() - 2) / (sliderLength * 1.0)); + $('.tlink').map(function() { + $(this).attr('href', $(this).attr('thref').replace('%revision%', newpos)); }); - $("#revision_label").html("Version " + newpos); + $('#revision_label').html('Version ' + newpos); if (newpos == 0) - { - $("#leftstar").css('opacity', .5); - $("#leftstep").css('opacity', .5); - } + $('#leftstar, #leftstep').addClass('inactive'); else - { - $("#leftstar").css('opacity', 1); - $("#leftstep").css('opacity', 1); - } + $('#leftstar, #leftstep').removeClass('inactive'); if (newpos == sliderLength) - { - $("#rightstar").css('opacity', .5); - $("#rightstep").css('opacity', .5); - } + $('#rightstar, #rightstep').addClass('inactive'); else - { - $("#rightstar").css('opacity', 1); - $("#rightstep").css('opacity', 1); - } + $('#rightstar, #rightstep').removeClass('inactive'); sliderPos = newpos; _callSliderCallbacks(newpos); } - function getSliderLength() - { + function getSliderLength() { return sliderLength; } - function setSliderLength(newlength) - { + function setSliderLength(newlength) { sliderLength = newlength; updateSliderElements(); } - // just take over the whole slider screen with a reconnect message - - function showReconnectUI() - { - if (!clientVars.sliderEnabled || !clientVars.supportsSlider) - { - $("#padmain, #rightbars").css('top', "130px"); - $("#timeslider").show(); - } + // take over the whole slider screen with a reconnect message + function showReconnectUI() { $('#error').show(); } - function setAuthors(authors) - { - $("#authorstable").empty(); - var numAnonymous = 0; - var numNamed = 0; - authors.forEach(function(author) - { - if (author.name) - { + function setAuthors(authors) { + $('#authorstable').empty(); + var numAnonymous = 0, + numNamed = 0, + html; + authors.forEach(function(author) { + if (author.name) { numNamed++; - var tr = $(''); - var swatchtd = $(''); - var swatch = $('
'); + var tr = $(''), + swatchtd = $(''), + swatch = $('
'), + nametd = $(''); swatch.css('background-color', clientVars.colorPalette[author.colorId]); swatchtd.append(swatch); tr.append(swatchtd); - var nametd = $(''); - nametd.text(author.name || "unnamed"); + nametd.text(author.name || 'unnamed'); tr.append(nametd); - $("#authorstable").append(tr); - } - else - { + $('#authorstable').append(tr); + } else { numAnonymous++; } }); - if (numAnonymous > 0) - { - var html = "" + (numNamed > 0 ? "...and " : "") + numAnonymous + " unnamed author" + (numAnonymous > 1 ? "s" : "") + ""; - $("#authorstable").append($(html)); + if (numAnonymous > 0) { + html = '' + + (numNamed > 0 ? '...and ' : '') + numAnonymous + ' unnamed author' + + (numAnonymous > 1 ? 's' : '') + ''; + $('#authorstable').append($(html)); } - if (authors.length == 0) - { - $("#authorstable").append($("No Authors")) + if (authors.length == 0) { + html = 'No Authors'; + $('#authorstable').append($(html)); } } BroadcastSlider = { - onSlider: onSlider, - getSliderPosition: getSliderPosition, - setSliderPosition: setSliderPosition, - getSliderLength: getSliderLength, - setSliderLength: setSliderLength, - isSliderActive: function() - { + onSlider : onSlider, + getSliderPosition : getSliderPosition, + setSliderPosition : setSliderPosition, + getSliderLength : getSliderLength, + setSliderLength : setSliderLength, + isSliderActive : function() { return sliderActive; }, - playpause: playpause, - addSavedRevision: addSavedRevision, - showReconnectUI: showReconnectUI, - setAuthors: setAuthors - } + playpause : playpause, + addSavedRevision : addSavedRevision, + showReconnectUI : showReconnectUI, + setAuthors : setAuthors + }; - function playButtonUpdater() - { - if (sliderPlaying) - { - if (getSliderPosition() + 1 > sliderLength) - { - $("#playpause_button_icon").toggleClass('pause'); + function playButtonUpdater() { + if (sliderPlaying) { + if (getSliderPosition() + 1 > sliderLength) { + $('#playpause_button').toggleClass('pause'); sliderPlaying = false; return; } setSliderPosition(getSliderPosition() + 1); - setTimeout(playButtonUpdater, 100); } } - function playpause() - { - $("#playpause_button_icon").toggleClass('pause'); - - if (!sliderPlaying) - { + function playpause() { + $('#playpause_button').toggleClass('pause'); + if (!sliderPlaying) { if (getSliderPosition() == sliderLength) setSliderPosition(0); sliderPlaying = true; playButtonUpdater(); - } - else - { + } else { sliderPlaying = false; } } // assign event handlers to html UI elements after page load - //$(window).load(function () - fireWhenAllScriptsAreLoaded.push(function() - { + fireWhenAllScriptsAreLoaded.push(function() { disableSelection($("#playpause_button")[0]); disableSelection($("#timeslider")[0]); - if (clientVars.sliderEnabled && clientVars.supportsSlider) - { - $(document).keyup(function(e) - { - var code = -1; - if (!e) var e = window.event; - if (e.keyCode) code = e.keyCode; - else if (e.which) code = e.which; + if (clientVars.sliderEnabled && clientVars.supportsSlider) { + $(document).keyup(function(e) { + var code = -1, + i, l, nextStar, pos; + if (!e) + var e = window.event; + code = (e.keyCode) ? e.keyCode : e.which; - if (code == 37) - { // left - if (!e.shiftKey) - { - setSliderPosition(getSliderPosition() - 1); - } - else - { - var nextStar = 0; // default to first revision in document - for (var i = 0; i < savedRevisions.length; i++) - { - var pos = parseInt(savedRevisions[i].attr('pos')); - if (pos < getSliderPosition() && nextStar < pos) nextStar = pos; + switch (code) { + case 37: // left + if (!e.shiftKey) { + setSliderPosition(getSliderPosition() - 1); + } else { + nextStar = 0; // default to first revision in document + for (i=0, l=savedRevisions.length; i < l; i++) { + pos = parseInt(savedRevisions[i].attr('pos'), 10); + if (pos < getSliderPosition() && nextStar < pos) + nextStar = pos; + } + setSliderPosition(nextStar); } - setSliderPosition(nextStar); - } - } - else if (code == 39) - { - if (!e.shiftKey) - { - setSliderPosition(getSliderPosition() + 1); - } - else - { - var nextStar = sliderLength; // default to last revision in document - for (var i = 0; i < savedRevisions.length; i++) - { - var pos = parseInt(savedRevisions[i].attr('pos')); - if (pos > getSliderPosition() && nextStar > pos) nextStar = pos; + break; + case 39: + if (!e.shiftKey) { + setSliderPosition(getSliderPosition() + 1); + } else { + nextStar = sliderLength; // default to last revision in document + for (i=0, l=savedRevisions.length; i < l; i++) { + pos = parseInt(savedRevisions[i].attr('pos'), 10); + if (pos > getSliderPosition() && nextStar > pos) + nextStar = pos; + } + setSliderPosition(nextStar); } - setSliderPosition(nextStar); - } + break; + case 32: + playpause(); + break; } - else if (code == 32) playpause(); - }); } - $(window).resize(function() - { + $(window).resize(function() { updateSliderElements(); }); - $("#ui-slider-bar").mousedown(function(evt) - { - setSliderPosition(Math.floor((evt.clientX - $("#ui-slider-bar").offset().left) * sliderLength / 742)); - $("#ui-slider-handle").css('left', (evt.clientX - $("#ui-slider-bar").offset().left)); - $("#ui-slider-handle").trigger(evt); + $('#ui-slider-bar') + .mousedown(function(evt) { + setSliderPosition(Math.floor((evt.clientX - $('#ui-slider-bar').offset().left) * sliderLength / 742)); + $('#ui-slider-handle') + .css('left', (evt.clientX - $('#ui-slider-bar').offset().left)) + .trigger(evt); }); // Slider dragging - $("#ui-slider-handle").mousedown(function(evt) - { - this.startLoc = evt.clientX; - this.currentLoc = parseInt($(this).css('left')); + $('#ui-slider-handle') + .mousedown(function(evt) { + this.startLoc = evt.clientX; + this.currentLoc = parseInt($(this).css('left'), 10); var self = this; sliderActive = true; - $(document).mousemove(function(evt2) - { - $(self).css('pointer', 'move') - 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))); + $(document).mousemove(function(evt2) { + var newloc = self.currentLoc + (evt2.clientX - self.startLoc), + adjustedWidth = $('#ui-slider-bar').width() - 2, + pos; + if (newloc < 0) + newloc = 0; + if (newloc > adjustedWidth) + newloc = adjustedWidth; + $('#revision_label').html('Version ' + Math.floor(newloc * sliderLength / adjustedWidth)); $(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))) + pos = Math.floor(newloc * sliderLength / adjustedWidth); + if (getSliderPosition() != pos) + _callSliderCallbacks(pos); }); - $(document).mouseup(function(evt2) - { - $(document).unbind('mousemove'); - $(document).unbind('mouseup'); + $(document).mouseup(function(evt2) { + $(document) + .unbind('mousemove') + .unbind('mouseup'); sliderActive = false; 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); + if (newloc < 0) + newloc = 0; + if (newloc > ($("#ui-slider-bar").width() - 2)) + newloc = ($("#ui-slider-bar").width() - 2); $(self).css('left', newloc); - // if(getSliderPosition() != Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width()-2))) - setSliderPosition(Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))) - self.currentLoc = parseInt($(self).css('left')); + setSliderPosition(Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))); + self.currentLoc = parseInt($(self).css('left'), 10); }); - }) + }); // play/pause toggling - $("#playpause_button").mousedown(function(evt) - { + $('#playpause_button').mousedown(function(evt) { var self = this; - - $(self).css('background-image', 'url(/static/img/crushed_button_depressed.png)'); - $(self).mouseup(function(evt2) - { - $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); + $(self) + .addClass('pressed') + .mouseup(function(evt2) { + $(self).removeClass('pressed'); $(self).unbind('mouseup'); BroadcastSlider.playpause(); }); - $(document).mouseup(function(evt2) - { - $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); + $(document).mouseup(function(evt2) { + $(self).removeClass('pressed'); $(document).unbind('mouseup'); }); }); - // next/prev saved revision and changeset - $('.stepper').mousedown(function(evt) - { + // next / prev saved revision and changeset + $('#steppers A').mousedown(function(evt) { var self = this; - var origcss = $(self).css('background-position'); - if (!origcss) - { - origcss = $(self).css('background-position-x') + " " + $(self).css('background-position-y'); - } - var origpos = parseInt(origcss.split(" ")[1]); - var newpos = (origpos - 43); - if (newpos < 0) newpos += 87; - - var newcss = (origcss.split(" ")[0] + " " + newpos + "px"); - if ($(self).css('opacity') != 1.0) newcss = origcss; - - $(self).css('background-position', newcss) - - $(self).mouseup(function(evt2) - { - $(self).css('background-position', origcss); - $(self).unbind('mouseup'); + $(self) + .addClass('clicked') + .mouseup(function(evt2) { + $(self) + .removeClass('clicked') + .unbind('mouseup'); $(document).unbind('mouseup'); - if ($(self).attr("id") == ("leftstep")) - { - setSliderPosition(getSliderPosition() - 1); - } - else if ($(self).attr("id") == ("rightstep")) - { - setSliderPosition(getSliderPosition() + 1); - } - else if ($(self).attr("id") == ("leftstar")) - { - var nextStar = 0; // default to first revision in document - for (var i = 0; i < savedRevisions.length; i++) - { - var pos = parseInt(savedRevisions[i].attr('pos')); - if (pos < getSliderPosition() && nextStar < pos) nextStar = pos; - } - setSliderPosition(nextStar); - } - else if ($(self).attr("id") == ("rightstar")) - { - var nextStar = sliderLength; // default to last revision in document - for (var i = 0; i < savedRevisions.length; i++) - { - var pos = parseInt(savedRevisions[i].attr('pos')); - if (pos > getSliderPosition() && nextStar > pos) nextStar = pos; - } - setSliderPosition(nextStar); + var id = $(self).attr('id'), + i, l, nextStar, pos; + switch (id) { + case 'leftstep': + setSliderPosition(getSliderPosition() - 1); + break; + case 'rightstep': + setSliderPosition(getSliderPosition() + 1); + break; + case 'leftstar': + nextStar = 0; // default to first revision in document + for (i=0, l=savedRevisions.length; i < l; i++) { + pos = parseInt(savedRevisions[i].attr('pos'), 10); + if (pos < getSliderPosition() && nextStar < pos) + nextStar = pos; + } + setSliderPosition(nextStar); + break; + case 'rightstar': + nextStar = sliderLength; // default to last revision in document + for (i=0, l=savedRevisions.length; i < l; i++) { + pos = parseInt(savedRevisions[i].attr('pos'), 10); + if (pos > getSliderPosition() && nextStar > pos) + nextStar = pos; + } + setSliderPosition(nextStar); + break; } }); - $(document).mouseup(function(evt2) - { - $(self).css('background-position', origcss); - $(self).unbind('mouseup'); + $(document).mouseup(function(evt2) { + $(self) + .removeClass('clicked') + .unbind('mouseup'); $(document).unbind('mouseup'); }); - }) + }); - if (clientVars) - { + if (clientVars) { if (clientVars.fullWidth) - { - $("#padpage").css('width', '100%'); - $("#revision").css('position', "absolute") - $("#revision").css('right', "20px") - $("#revision").css('top', "20px") - $("#padmain").css('left', '0px'); - $("#padmain").css('right', '197px'); - $("#padmain").css('width', 'auto'); - $("#rightbars").css('right', '7px'); - $("#rightbars").css('margin-right', '0px'); - $("#timeslider").css('width', 'auto'); - } - - if (clientVars.disableRightBar) - { - $("#rightbars").css('display', 'none'); + $('#padpage').addClass('full-width'); + if (clientVars.disableRightBar) { + $('#rightbars').css('display', 'none'); $('#padmain').css('width', 'auto'); - if (clientVars.fullWidth) $("#padmain").css('right', '7px'); - else $("#padmain").css('width', '860px'); - $("#revision").css('position', "absolute"); - $("#revision").css('right', "20px"); - $("#revision").css('top', "20px"); + if (clientVars.fullWidth) + $('#padmain').css({right: 7}); + else + $('#padmain').css('width', '860px'); + $('#revision').css({ + position: 'absolute', + right : 20, + top : 20 + }); } - - - if (clientVars.sliderEnabled) - { - if (clientVars.supportsSlider) - { - $("#padmain, #rightbars").css('top', "130px"); - $("#timeslider").show(); + if (clientVars.sliderEnabled) { + if (clientVars.supportsSlider) { setSliderLength(clientVars.totalRevs); setSliderPosition(clientVars.revNum); - clientVars.savedRevisions.forEach(function(revision) - { + clientVars.savedRevisions.forEach(function(revision) { addSavedRevision(revision.revNum, revision); - }) - } - else - { + }); + } else { // slider is not supported - $("#padmain, #rightbars").css('top', "130px"); - $("#timeslider").show(); - $("#error").html("The timeslider feature is not supported on this pad.
Why not?"); - $("#error").show(); + $('#error').html('The timeslider feature is not supported on this pad. Why not?').show(); } - } - else - { - if (clientVars.supportsSlider) - { + } else { + if (clientVars.supportsSlider) { setSliderLength(clientVars.totalRevs); setSliderPosition(clientVars.revNum); } @@ -493,10 +389,9 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) }); })(); - BroadcastSlider.onSlider(function(loc) - { - $("#viewlatest").html(loc == BroadcastSlider.getSliderLength() ? "Viewing latest content" : "View latest content"); - }) + BroadcastSlider.onSlider(function(loc) { + $('#viewlatest').html(loc == BroadcastSlider.getSliderLength() ? 'Viewing latest content' : 'View latest content'); + }); return BroadcastSlider; } diff --git a/static/js/chat.js b/static/js/chat.js index 9f0903cf5..61ca9fa23 100644 --- a/static/js/chat.js +++ b/static/js/chat.js @@ -20,143 +20,119 @@ * limitations under the License. */ -var padutils = require('/pad_utils').padutils; -var padcookie = require('/pad_cookie').padcookie; +var padutils = require('/pad_utils').padutils, + padcookie = require('/pad_cookie').padcookie; -var chat = (function() -{ - var isStuck = false; - var chatMentions = 0; - var title = document.title; +var chat = (function() { + var isStuck = false, + chatMentions = 0, + title = document.title; var self = { - show: function () - { - $("#chaticon").hide(); - $("#chatbox").show(); + show: function() { + $('#chaticon').hide(); + $('#chatbox').show(); self.scrollDown(); chatMentions = 0; document.title = title; }, - stickToScreen: function(fromInitialCall) // Make chat stick to right hand side of screen - { + stickToScreen: function(fromInitialCall) { // make chat stick to right hand side of screen chat.show(); - if(!isStuck || fromInitialCall) { // Stick it to - padcookie.setPref("chatAlwaysVisible", true); - $('#chatbox').css({"right":"0px", "top":"36px", "border-radius":"0px", "height":"auto", "border-right":"none", "border-left":"1px solid #ccc", "border-top":"none", "background-color":"#f1f1f1", "width":"185px"}); - $('#chattext').css({"top":"0px"}); - $('#editorcontainer').css({"right":"192px", "width":"auto"}); + if (!isStuck || fromInitialCall) { // do stick it + padcookie.setPref('chatAlwaysVisible', true); + $('BODY').addClass('chat-visible'); isStuck = true; - } else { // Unstick it - padcookie.setPref("chatAlwaysVisible", false); - $('#chatbox').css({"right":"20px", "top":"auto", "border-top-left-radius":"5px", "border-top-right-radius":"5px", "border-right":"1px solid #999", "height":"200px", "border-top":"1px solid #999", "background-color":"#f7f7f7"}); - $('#chattext').css({"top":"25px"}); - $('#editorcontainer').css({"right":"0px", "width":"100%"}); + } else { // unstick it + padcookie.setPref('chatAlwaysVisible', false); + $('BODY').removeClass('chat-visible'); isStuck = false; } }, - hide: function () - { - $("#chatcounter").text("0"); - $("#chaticon").show(); - $("#chatbox").hide(); + hide: function() { + $('#chatcounter').text('0'); + $('#chaticon').show(); + $('#chatbox').hide(); }, - scrollDown: function() - { - if($('#chatbox').css("display") != "none") - $('#chattext').animate({scrollTop: $('#chattext')[0].scrollHeight}, "slow"); + scrollDown: function() { + if ($('#chatbox').is(':visible')) + $('#chattext').animate({scrollTop: $('#chattext')[0].scrollHeight}, 600); }, - send: function() - { - var text = $("#chatinput").val(); - this._pad.collabClient.sendMessage({"type": "CHAT_MESSAGE", "text": text}); - $("#chatinput").val(""); + send: function() { + var text = $('#chatinput').val(); + this._pad.collabClient.sendMessage({ + 'type': 'CHAT_MESSAGE', + 'text': text + }); + $('#chatinput').val(''); }, - addMessage: function(msg, increment) - { - //correct the time + addMessage: function(msg, increment) { + // correct the time msg.time += this._pad.clientTimeOffset; - //create the time string - var minutes = "" + new Date(msg.time).getMinutes(); - var hours = "" + new Date(msg.time).getHours(); - if(minutes.length == 1) - minutes = "0" + minutes ; - if(hours.length == 1) - hours = "0" + hours ; - var timeStr = hours + ":" + minutes; + // create the time string + var minutes = '' + new Date(msg.time).getMinutes(), + hours = '' + new Date(msg.time).getHours(), + timeStr; + if (minutes.length == 1) + minutes = '0' + minutes; + if (hours.length == 1) + hours = '0' + hours; + timeStr = hours + ':' + minutes; - //create the authorclass - var authorClass = "author-" + msg.userId.replace(/[^a-y0-9]/g, function(c) - { - if (c == ".") return "-"; + // create the authorclass + var authorClass = 'author-' + msg.userId.replace(/[^a-y0-9]/g, function(c) { + if (c == '.') + return '-'; return 'z' + c.charCodeAt(0) + 'z'; }); - var text = padutils.escapeHtmlWithClickableLinks(padutils.escapeHtml(msg.text), "_blank"); + var text = padutils.escapeHtmlWithClickableLinks(padutils.escapeHtml(msg.text), '_blank'); - /* Performs an action if your name is mentioned */ - var myName = $('#myusernameedit').val(); - myName = myName.toLowerCase(); - var chatText = text.toLowerCase(); - var wasMentioned = false; - if (chatText.indexOf(myName) !== -1 && myName != "undefined"){ + // do something when your name is mentioned + var myName = $('#myusernameedit').val().toLowerCase(), + chatText = text.toLowerCase(), + wasMentioned = false; + if (chatText.indexOf(myName) !== -1 && myName != 'undefined') wasMentioned = true; - } - /* End of new action */ + // end of action - var authorName = msg.userName == null ? "unnamed" : padutils.escapeHtml(msg.userName); + var authorName = msg.userName == null ? 'unnamed' : padutils.escapeHtml(msg.userName), + html = '

' + authorName + ':' + timeStr + '' + text + '

'; + $('#chattext').append(html); - var html = "

" + authorName + ":" + timeStr + " " + text + "

"; - $("#chattext").append(html); - - //should we increment the counter?? - if(increment) - { - var count = Number($("#chatcounter").text()); + // should we increment the counter?? + if (increment) { + var count = Number($('#chatcounter').text()); count++; - $("#chatcounter").text(count); + $('#chatcounter').text(count); // chat throb stuff -- Just make it throw for twice as long - if(wasMentioned) - { // If the user was mentioned show for twice as long and flash the browser window - if (chatMentions == 0){ + if (wasMentioned) { // If the user was mentioned, show twice as long and flash the browser window + if (chatMentions == 0) title = document.title; - } - $('#chatthrob').html(""+authorName+"" + ": " + text).show().delay(4000).hide(400); + $('#chatthrob').html('' + authorName + '' + ': ' + text).show().delay(4000).hide(400); chatMentions++; - document.title = "("+chatMentions+") " + title; - } - else - { - $('#chatthrob').html(""+authorName+"" + ": " + text).show().delay(2000).hide(400); + document.title = '(' + chatMentions + ') ' + title; + } else { + $('#chatthrob').html('' + authorName + '' + ': ' + text).show().delay(2000).hide(400); } } - self.scrollDown(); - }, - init: function(pad) - { + init: function(pad) { this._pad = pad; - $("#chatinput").keypress(function(evt) - { - //if the user typed enter, fire the send - if(evt.which == 13) - { + $('#chatinput').keypress(function(evt) { + if (evt.which == 13) { // send on enter evt.preventDefault(); self.send(); } }); - - for(var i in clientVars.chatHistory) - { + for (var i in clientVars.chatHistory) { this.addMessage(clientVars.chatHistory[i], false); } - $("#chatcounter").text(clientVars.chatHistory.length); + $('#chatcounter').text(clientVars.chatHistory.length); } - } + }; return self; }()); -exports.chat = chat; - +exports.chat = chat; \ No newline at end of file diff --git a/static/js/pad.js b/static/js/pad.js index eb480080f..1999153b1 100644 --- a/static/js/pad.js +++ b/static/js/pad.js @@ -1,5 +1,5 @@ /** - * This code is mostly from the old Etherpad. Please help us to comment this code. + * This code is mostly from the old Etherpad. Please help us to comment this code. * This helps other people to understand this code better and helps them to improve it. * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED */ @@ -33,104 +33,80 @@ JSON = require('/json2'); require('/undo-xpopup'); require('/prefixfree'); -var chat = require('/chat').chat; -var getCollabClient = require('/collab_client').getCollabClient; -var padconnectionstatus = require('/pad_connectionstatus').padconnectionstatus; -var padcookie = require('/pad_cookie').padcookie; -var paddocbar = require('/pad_docbar').paddocbar; -var padeditbar = require('/pad_editbar').padeditbar; -var padeditor = require('/pad_editor').padeditor; -var padimpexp = require('/pad_impexp').padimpexp; -var padmodals = require('/pad_modals').padmodals; -var padsavedrevs = require('/pad_savedrevs').padsavedrevs; -var paduserlist = require('/pad_userlist').paduserlist; -var padutils = require('/pad_utils').padutils; +var chat = require('/chat').chat, + getCollabClient = require('/collab_client').getCollabClient, + padconnectionstatus = require('/pad_connectionstatus').padconnectionstatus, + padcookie = require('/pad_cookie').padcookie, + paddocbar = require('/pad_docbar').paddocbar, + padeditbar = require('/pad_editbar').padeditbar, + padeditor = require('/pad_editor').padeditor, + padimpexp = require('/pad_impexp').padimpexp, + padmodals = require('/pad_modals').padmodals, + padsavedrevs = require('/pad_savedrevs').padsavedrevs, + paduserlist = require('/pad_userlist').paduserlist, + padutils = require('/pad_utils').padutils, + createCookie = require('/pad_utils').createCookie, + readCookie = require('/pad_utils').readCookie, + randomString = require('/pad_utils').randomString; -var createCookie = require('/pad_utils').createCookie; -var readCookie = require('/pad_utils').readCookie; -var randomString = require('/pad_utils').randomString; +function getParams() { + var params = getUrlVars(), + showControls = params['showControls'], + showChat = params['showChat'], + userName = params['userName'], + showLineNumbers = params['showLineNumbers'], + useMonospaceFont = params['useMonospaceFont'], + IsnoColors = params['noColors'], + hideQRCode = params['hideQRCode'], + rtl = params['rtl'], + alwaysShowChat = params['alwaysShowChat']; -function getParams() -{ - var params = getUrlVars() - var showControls = params["showControls"]; - var showChat = params["showChat"]; - var userName = params["userName"]; - var showLineNumbers = params["showLineNumbers"]; - var useMonospaceFont = params["useMonospaceFont"]; - var IsnoColors = params["noColors"]; - var hideQRCode = params["hideQRCode"]; - var rtl = params["rtl"]; - var alwaysShowChat = params["alwaysShowChat"]; - - if(IsnoColors) - { - if(IsnoColors == "true") - { + if (IsnoColors) { + if (IsnoColors == 'true') { settings.noColors = true; - $('#clearAuthorship').hide(); + $('#buttonicon-clearauthorship').hide(); } } - if(showControls) - { - if(showControls == "false") - { + if (showControls) { + if (showControls == 'false') { $('#editbar').hide(); - $('#editorcontainer').css({"top":"0px"}); + $('#editorcontainer').css({top:0}); } } - if(showChat) - { - if(showChat == "false") - { + if (showChat) { + if (showChat == 'false') { $('#chaticon').hide(); } } - if(showLineNumbers) - { - if(showLineNumbers == "false") - { + if (showLineNumbers) { + if (showLineNumbers == 'false') settings.LineNumbersDisabled = true; - } } - if(useMonospaceFont) - { - if(useMonospaceFont == "true") - { + if (useMonospaceFont) { + if (useMonospaceFont == 'true') settings.useMonospaceFontGlobal = true; - } } - if(userName) - { - // If the username is set as a parameter we should set a global value that we can call once we have initiated the pad. + if (userName) { + // if the username is set as a parameter we should set a global value that we can call once we have initiated the pad settings.globalUserName = unescape(userName); } - if(hideQRCode) - { + if (hideQRCode) { $('#qrcode').hide(); } - if(rtl) - { - if(rtl == "true") - { - settings.rtlIsTrue = true - } + if (rtl) { + if (rtl == 'true') + settings.rtlIsTrue = true; } - if(alwaysShowChat) - { - if(alwaysShowChat == "true") - { + if (alwaysShowChat) { + if (alwaysShowChat == 'true') chat.stickToScreen(); - } } } -function getUrlVars() -{ - var vars = [], hash; - var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); - for(var i = 0; i < hashes.length; i++) - { +function getUrlVars() { + var vars = [], hash, + hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); + for (var i=0, l=hashes.length; i < l; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; @@ -138,283 +114,221 @@ function getUrlVars() return vars; } -function savePassword() -{ - //set the password cookie - createCookie("password",$("#passwordinput").val(),null,document.location.pathname); - //reload - document.location=document.location; +function savePassword() { + // set the password cookie + createCookie('password', $('#passwordinput').val(), null, document.location.pathname); + // reload + document.location = document.location; } -function handshake() -{ - var loc = document.location; - //get the correct port - var port = loc.port == "" ? (loc.protocol == "https:" ? 443 : 80) : loc.port; - //create the url - var url = loc.protocol + "//" + loc.hostname + ":" + port + "/"; - //find out in which subfolder we are - var resource = loc.pathname.substr(1, loc.pathname.indexOf("/p/")) + "socket.io"; - //connect +function handshake() { + var loc = document.location, + port = loc.port == '' ? (loc.protocol == 'https:' ? 443 : 80) : loc.port, // get the correct port + url = loc.protocol + '//' + loc.hostname + ':' + port + '/', // create the url + resource = loc.pathname.substr(1, loc.pathname.indexOf('/p/')) + 'socket.io'; // determine current subfolder + // connect socket = pad.socket = io.connect(url, { resource: resource, 'max reconnection attempts': 3 }); - function sendClientReady(isReconnect) - { - var padId = document.location.pathname.substring(document.location.pathname.lastIndexOf("/") + 1); + function sendClientReady(isReconnect) { + var padId = document.location.pathname.substring(document.location.pathname.lastIndexOf('/') + 1); padId = decodeURIComponent(padId); // unescape neccesary due to Safari and Opera interpretation of spaces - if(!isReconnect) + if (!isReconnect) document.title = padId.replace(/_+/g, ' ') + " | " + document.title; - var token = readCookie("token"); - if (token == null) - { - token = "t." + randomString(); - createCookie("token", token, 60); + var token = readCookie('token'); + if (token == null) { + token = 't.' + randomString(); + createCookie('token', token, 60); } - - var sessionID = readCookie("sessionID"); - var password = readCookie("password"); - var msg = { - "component": "pad", - "type": "CLIENT_READY", - "padId": padId, - "sessionID": sessionID, - "password": password, - "token": token, - "protocolVersion": 2 - }; - - //this is a reconnect, lets tell the server our revisionnumber - if(isReconnect == true) - { + var sessionID = readCookie('sessionID'), + password = readCookie('password'), + msg = { + 'component' : 'pad', + 'type' : 'CLIENT_READY', + 'padId' : padId, + 'sessionID' : sessionID, + 'password' : password, + 'token' : token, + 'protocolVersion' : 2 + }; + + // this is a reconnect, lets tell the server our revision number + if (isReconnect == true) { msg.client_rev=pad.collabClient.getCurrentRevisionNumber(); msg.reconnect=true; } - + socket.json.send(msg); }; var disconnectTimeout; - socket.once('connect', function () { + socket.once('connect', function() { sendClientReady(false); }); - - socket.on('reconnect', function () { - //reconnect is before the timeout, lets stop the timeout - if(disconnectTimeout) - { - clearTimeout(disconnectTimeout); - } - pad.collabClient.setChannelState("CONNECTED"); + socket.on('reconnect', function() { + // reconnect is before timeout, let´s stop the timeout + if (disconnectTimeout) + clearTimeout(disconnectTimeout); + pad.collabClient.setChannelState('CONNECTED'); sendClientReady(true); }); - - socket.on('disconnect', function () { - function disconnectEvent() - { - pad.collabClient.setChannelState("DISCONNECTED", "reconnect_timeout"); + + socket.on('disconnect', function() { + function disconnectEvent() { + pad.collabClient.setChannelState('DISCONNECTED', 'reconnect_timeout'); } - - pad.collabClient.setChannelState("RECONNECTING"); - + pad.collabClient.setChannelState('RECONNECTING'); disconnectTimeout = setTimeout(disconnectEvent, 10000); }); - var receivedClientVars = false; - var initalized = false; + var receivedClientVars = false, + initalized = false; - socket.on('message', function(obj) - { - //the access was not granted, give the user a message - if(!receivedClientVars && obj.accessStatus) - { - if(obj.accessStatus == "deny") - { - $("#editorloadingbox").html("You do not have permission to access this pad"); - } - else if(obj.accessStatus == "needPassword") - { - $("#editorloadingbox").html("You need a password to access this pad
" + + socket.on('message', function(obj) { + // access was not granted, give the user a message + if (!receivedClientVars && obj.accessStatus) { + if (obj.accessStatus == 'deny') + $('#editorloadingbox').html("You do not have permission to access this pad"); + else if (obj.accessStatus == "needPassword") { + $('#editorloadingbox').html("You need a password to access this pad
" + ""+ ""); - } - else if(obj.accessStatus == "wrongPassword") - { + } else if (obj.accessStatus == 'wrongPassword') { $("#editorloadingbox").html("You're password was wrong
" + ""+ ""); } - } - - //if we haven't recieved the clientVars yet, then this message should it be - else if (!receivedClientVars) - { - //log the message - if (window.console) console.log(obj); + } else if (!receivedClientVars) { // if we haven't received the clientVars yet, then this message should it be + // log the message + if (window.console) + console.log(obj); receivedClientVars = true; - //set some client vars + // set some client vars clientVars = obj; - clientVars.userAgent = "Anonymous"; - clientVars.collab_client_vars.clientAgent = "Anonymous"; + clientVars.userAgent = 'Anonymous'; + clientVars.collab_client_vars.clientAgent = 'Anonymous'; - //initalize the pad + // initalize the pad pad._afterHandshake(); initalized = true; - // If the LineNumbersDisabled value is set to true then we need to hide the Line Numbers + // if LineNumbersDisabled is set to true, we need to hide the line numbers if (settings.LineNumbersDisabled == true) - { pad.changeViewOption('showLineNumbers', false); - } - // If the noColors value is set to true then we need to hide the backround colors on the ace spans + // if noColors is set to true, we need to hide the backround colors on the ace spans if (settings.noColors == true) - { pad.changeViewOption('noColors', true); - } - - if (settings.rtlIsTrue == true) - { - pad.changeViewOption('rtl', true); - } - // If the Monospacefont value is set to true then change it to monospace. + if (settings.rtlIsTrue == true) + pad.changeViewOption('rtl', true); + + // if Monospacefont is set to true, change it to monospace if (settings.useMonospaceFontGlobal == true) - { pad.changeViewOption('useMonospaceFont', true); - } - // if the globalUserName value is set we need to tell the server and the client about the new authorname - if (settings.globalUserName !== false) - { - pad.notifyChangeName(settings.globalUserName); // Notifies the server + + // if globalUserName is set, tell the server and the client about the new authorname + if (settings.globalUserName !== false) { + pad.notifyChangeName(settings.globalUserName); // notify the server pad.myUserInfo.name = settings.globalUserName; - $('#myusernameedit').attr({"value":settings.globalUserName}); // Updates the current users UI + $('#myusernameedit').attr({"value":settings.globalUserName}); // update the current user´s UI } } - //This handles every Message after the clientVars - else - { - //this message advices the client to disconnect - if (obj.disconnect) - { + // handle every message after the clientVars + else { + // advice the client to disconnect + if (obj.disconnect) { padconnectionstatus.disconnected(obj.disconnect); socket.disconnect(); return; - } - else - { + } else { pad.collabClient.handleMessageFromServer(obj); } } }); - // Bind the colorpicker + // bind the colorpicker var fb = $('#colorpicker').farbtastic({ callback: '#mycolorpickerpreview', width: 220}); } var pad = { - // don't access these directly from outside this file, except - // for debugging - collabClient: null, - myUserInfo: null, - diagnosticInfo: {}, - initTime: 0, - clientTimeOffset: null, - preloadedImages: false, - padOptions: {}, - + // don't access these directly from outside this file, except for debugging + collabClient : null, + myUserInfo : null, + diagnosticInfo : {}, + initTime : 0, + clientTimeOffset : null, + preloadedImages : false, + padOptions : {}, // these don't require init; clientVars should all go through here - getPadId: function() - { + getPadId : function() { return clientVars.padId; }, - getClientIp: function() - { + getClientIp : function() { return clientVars.clientIp; }, - getIsProPad: function() - { + getIsProPad : function() { return clientVars.isProPad; }, - getColorPalette: function() - { + getColorPalette : function() { return clientVars.colorPalette; }, - getDisplayUserAgent: function() - { + getDisplayUserAgent: function() { return padutils.uaDisplay(clientVars.userAgent); }, - getIsDebugEnabled: function() - { + getIsDebugEnabled : function() { return clientVars.debugEnabled; }, - getPrivilege: function(name) - { + getPrivilege : function(name) { return clientVars.accountPrivs[name]; }, - getUserIsGuest: function() - { + getUserIsGuest : function() { return clientVars.userIsGuest; }, - // - getUserId: function() - { + getUserId : function() { return pad.myUserInfo.userId; }, - getUserName: function() - { + getUserName : function() { return pad.myUserInfo.name; }, - sendClientMessage: function(msg) - { + sendClientMessage : function(msg) { pad.collabClient.sendClientMessage(msg); }, - - init: function() - { + init : function() { padutils.setupGlobalExceptionHandler(); - - $(document).ready(function() - { + $(document).ready(function() { // start the custom js - if (typeof customStart == "function") customStart(); + if (typeof customStart == 'function') + customStart(); getParams(); handshake(); }); - - $(window).unload(function() - { + $(window).unload(function() { pad.dispose(); }); }, - _afterHandshake: function() - { + _afterHandshake : function() { pad.clientTimeOffset = new Date().getTime() - clientVars.serverTimestamp; - - //initialize the chat + // initialize the chat chat.init(this); pad.initTime = +(new Date()); pad.padOptions = clientVars.initialOptions; if ((!$.browser.msie) && (!($.browser.mozilla && $.browser.version.indexOf("1.8.") == 0))) - { document.domain = document.domain; // for comet - } // for IE - if ($.browser.msie) - { - try - { - doc.execCommand("BackgroundImageCache", false, true); + if ($.browser.msie) { + try { + doc.execCommand('BackgroundImageCache', false, true); } catch (e) {} @@ -422,43 +336,35 @@ var pad = { // order of inits is important here: padcookie.init(clientVars.cookiePrefsToSet, this); - - $("#widthprefcheck").click(pad.toggleWidthPref); - // $("#sidebarcheck").click(pad.togglewSidebar); + + $('#widthprefcheck').click(pad.toggleWidthPref); pad.myUserInfo = { - userId: clientVars.userId, - name: clientVars.userName, - ip: pad.getClientIp(), - colorId: clientVars.userColor, - userAgent: pad.getDisplayUserAgent() + userId : clientVars.userId, + name : clientVars.userName, + ip : pad.getClientIp(), + colorId : clientVars.userColor, + userAgent : pad.getDisplayUserAgent() }; - if (clientVars.specialKey) - { + if (clientVars.specialKey) { pad.myUserInfo.specialKey = clientVars.specialKey; if (clientVars.specialKeyTranslation) - { - $("#specialkeyarea").html("mode: " + String(clientVars.specialKeyTranslation).toUpperCase()); - } + $('#specialkeyarea').html('mode: ' + String(clientVars.specialKeyTranslation).toUpperCase()); } - paddocbar.init( - { - isTitleEditable: pad.getIsProPad(), - initialTitle: clientVars.initialTitle, - initialPassword: clientVars.initialPassword, - guestPolicy: pad.padOptions.guestPolicy + paddocbar.init({ + isTitleEditable : pad.getIsProPad(), + initialTitle : clientVars.initialTitle, + initialPassword : clientVars.initialPassword, + guestPolicy : pad.padOptions.guestPolicy }, this); padimpexp.init(this); padsavedrevs.init(clientVars.initialRevisionList, this); - padeditor.init(postAceInit, pad.padOptions.view || {}, this); - paduserlist.init(pad.myUserInfo, this); // padchat.init(clientVars.chatHistory, pad.myUserInfo); padconnectionstatus.init(); padmodals.init(this); - pad.collabClient = getCollabClient(padeditor.ace, clientVars.collab_client_vars, pad.myUserInfo, { colorPalette: pad.getColorPalette() }, pad); @@ -470,278 +376,203 @@ var pad = { pad.collabClient.setOnChannelStateChange(pad.handleChannelStateChange); pad.collabClient.setOnInternalAction(pad.handleCollabAction); - function postAceInit() - { + function postAceInit() { padeditbar.init(); - setTimeout(function() - { - padeditor.ace.focus(); - }, 0); + setTimeout(function() {padeditor.ace.focus();}, 0); } }, - dispose: function() - { + dispose: function() { padeditor.dispose(); }, - notifyChangeName: function(newName) - { + notifyChangeName: function(newName) { pad.myUserInfo.name = newName; pad.collabClient.updateUserInfo(pad.myUserInfo); //padchat.handleUserJoinOrUpdate(pad.myUserInfo); }, - notifyChangeColor: function(newColorId) - { + notifyChangeColor: function(newColorId) { pad.myUserInfo.colorId = newColorId; pad.collabClient.updateUserInfo(pad.myUserInfo); //padchat.handleUserJoinOrUpdate(pad.myUserInfo); }, - notifyChangeTitle: function(newTitle) - { - pad.collabClient.sendClientMessage( - { - type: 'padtitle', - title: newTitle, - changedBy: pad.myUserInfo.name || "unnamed" + notifyChangeTitle: function(newTitle) { + pad.collabClient.sendClientMessage({ + type : 'padtitle', + title : newTitle, + changedBy : pad.myUserInfo.name || 'unnamed' }); }, - notifyChangePassword: function(newPass) - { - pad.collabClient.sendClientMessage( - { - type: 'padpassword', - password: newPass, - changedBy: pad.myUserInfo.name || "unnamed" + notifyChangePassword: function(newPass) { + pad.collabClient.sendClientMessage({ + type : 'padpassword', + password : newPass, + changedBy : pad.myUserInfo.name || 'unnamed' }); }, - changePadOption: function(key, value) - { + changePadOption: function(key, value) { var options = {}; options[key] = value; pad.handleOptionsChange(options); - pad.collabClient.sendClientMessage( - { - type: 'padoptions', - options: options, - changedBy: pad.myUserInfo.name || "unnamed" + pad.collabClient.sendClientMessage({ + type : 'padoptions', + options : options, + changedBy : pad.myUserInfo.name || 'unnamed' }); }, - changeViewOption: function(key, value) - { + changeViewOption: function(key, value) { var options = { view: {} }; options.view[key] = value; pad.handleOptionsChange(options); }, - handleOptionsChange: function(opts) - { - // opts object is a full set of options or just - // some options to change - if (opts.view) - { + handleOptionsChange: function(opts) { + // opts object is a full set of options or just some options to change + if (opts.view) { if (!pad.padOptions.view) - { pad.padOptions.view = {}; - } - for (var k in opts.view) - { + for (var k in opts.view) { pad.padOptions.view[k] = opts.view[k]; } padeditor.setViewOptions(pad.padOptions.view); } - if (opts.guestPolicy) - { - // order important here + if (opts.guestPolicy) { + // order is important here: pad.padOptions.guestPolicy = opts.guestPolicy; paddocbar.setGuestPolicy(opts.guestPolicy); } }, - getPadOptions: function() - { + getPadOptions: function() { // caller shouldn't mutate the object return pad.padOptions; }, - isPadPublic: function() - { + isPadPublic: function() { return (!pad.getIsProPad()) || (pad.getPadOptions().guestPolicy == 'allow'); }, - suggestUserName: function(userId, name) - { - pad.collabClient.sendClientMessage( - { - type: 'suggestUserName', - unnamedId: userId, - newName: name + suggestUserName: function(userId, name) { + pad.collabClient.sendClientMessage({ + type : 'suggestUserName', + unnamedId : userId, + newName : name }); }, - handleUserJoin: function(userInfo) - { + handleUserJoin: function(userInfo) { paduserlist.userJoinOrUpdate(userInfo); //padchat.handleUserJoinOrUpdate(userInfo); }, - handleUserUpdate: function(userInfo) - { + handleUserUpdate: function(userInfo) { paduserlist.userJoinOrUpdate(userInfo); //padchat.handleUserJoinOrUpdate(userInfo); }, - handleUserLeave: function(userInfo) - { + handleUserLeave: function(userInfo) { paduserlist.userLeave(userInfo); //padchat.handleUserLeave(userInfo); }, - handleClientMessage: function(msg) - { - if (msg.type == 'suggestUserName') - { - if (msg.unnamedId == pad.myUserInfo.userId && msg.newName && !pad.myUserInfo.name) - { - pad.notifyChangeName(msg.newName); - paduserlist.setMyUserInfo(pad.myUserInfo); - } - } - else if (msg.type == 'chat') - { - //padchat.receiveChat(msg); - } - else if (msg.type == 'padtitle') - { - paddocbar.changeTitle(msg.title); - } - else if (msg.type == 'padpassword') - { - paddocbar.changePassword(msg.password); - } - else if (msg.type == 'newRevisionList') - { - padsavedrevs.newRevisionList(msg.revisionList); - } - else if (msg.type == 'revisionLabel') - { - padsavedrevs.newRevisionList(msg.revisionList); - } - else if (msg.type == 'padoptions') - { - var opts = msg.options; - pad.handleOptionsChange(opts); - } - else if (msg.type == 'guestanswer') - { - // someone answered a prompt, remove it - paduserlist.removeGuestPrompt(msg.guestId); + handleClientMessage: function(msg) { + switch (msg.type) { + case 'suggestUserName': + if (msg.unnamedId == pad.myUserInfo.userId && msg.newName && !pad.myUserInfo.name) { + pad.notifyChangeName(msg.newName); + paduserlist.setMyUserInfo(pad.myUserInfo); + } + break; + case 'chat': + // padchat.receiveChat(msg); + break; + case 'padtitle': + paddocbar.changeTitle(msg.title); + break; + case 'padpassword': + paddocbar.changePassword(msg.password); + break; + case 'newRevisionList': + padsavedrevs.newRevisionList(msg.revisionList); + break; + case 'revisionLabel': + padsavedrevs.newRevisionList(msg.revisionList); + break; + case 'padoptions': + var opts = msg.options; + pad.handleOptionsChange(opts); + break; + case 'guestanswer': + // someone answered a prompt, remove it + paduserlist.removeGuestPrompt(msg.guestId); + break; } }, - editbarClick: function(cmd) - { + editbarClick: function(cmd) { if (padeditbar) - { padeditbar.toolbarClick(cmd); - } }, - dmesg: function(m) - { - if (pad.getIsDebugEnabled()) - { - var djs = $('#djs').get(0); - var wasAtBottom = (djs.scrollTop - (djs.scrollHeight - $(djs).height()) >= -20); + dmesg: function(m) { + if (pad.getIsDebugEnabled()) { + var djs = $('#djs').get(0), + wasAtBottom = (djs.scrollTop - (djs.scrollHeight - $(djs).height()) >= -20); $('#djs').append('

' + m + '

'); if (wasAtBottom) - { djs.scrollTop = djs.scrollHeight; - } } }, - handleServerMessage: function(m) - { - if (m.type == 'NOTICE') - { - if (m.text) - { - alertBar.displayMessage(function(abar) - { - abar.find("#servermsgdate").html(" (" + padutils.simpleDateTime(new Date) + ")"); - abar.find("#servermsgtext").html(m.text); + handleServerMessage: function(m) { + if (m.type == 'NOTICE') { + if (m.text) { + alertBar.displayMessage(function(abar) { + abar.find('#servermsgdate').html(' (' + padutils.simpleDateTime(new Date) + ')'); + abar.find('#servermsgtext').html(m.text); }); } if (m.js) - { window['ev' + 'al'](m.js); - } - } - else if (m.type == 'GUEST_PROMPT') - { + } else if (m.type == 'GUEST_PROMPT') { paduserlist.showGuestPrompt(m.userId, m.displayName); } }, - handleChannelStateChange: function(newState, message) - { - var oldFullyConnected = !! padconnectionstatus.isFullyConnected(); - var wasConnecting = (padconnectionstatus.getStatus().what == 'connecting'); - if (newState == "CONNECTED") - { + handleChannelStateChange: function(newState, message) { + var oldFullyConnected = !! padconnectionstatus.isFullyConnected(), + wasConnecting = (padconnectionstatus.getStatus().what == 'connecting'); + if (newState == 'CONNECTED') padconnectionstatus.connected(); - } - else if (newState == "RECONNECTING") - { + else if (newState == 'RECONNECTING') padconnectionstatus.reconnecting(); - } - else if (newState == "DISCONNECTED") - { + else if (newState == 'DISCONNECTED') { pad.diagnosticInfo.disconnectedMessage = message; pad.diagnosticInfo.padId = pad.getPadId(); pad.diagnosticInfo.socket = {}; - - //we filter non objects from the socket object and put them in the diagnosticInfo - //this ensures we have no cyclic data - this allows us to stringify the data - for(var i in socket.socket) - { - var value = socket.socket[i]; - var type = typeof value; - - if(type == "string" || type == "number") - { + // we filter non objects from the socket object and put them in the diagnosticInfo + // this ensures we have no cyclic data - this allows us to stringify the data + for (var i in socket.socket) { + var value = socket.socket[i], + type = typeof value; + if (type == 'string' || type == 'number') pad.diagnosticInfo.socket[i] = value; - } } - pad.asyncSendDiagnosticInfo(); - if (typeof window.ajlog == "string") - { - window.ajlog += ("Disconnected: " + message + '\n'); - } + if (typeof window.ajlog == 'string') + window.ajlog += ('Disconnected: ' + message + '\n'); padeditor.disable(); padeditbar.disable(); paddocbar.disable(); padimpexp.disable(); - padconnectionstatus.disconnected(message); } var newFullyConnected = !! padconnectionstatus.isFullyConnected(); if (newFullyConnected != oldFullyConnected) - { pad.handleIsFullyConnected(newFullyConnected, wasConnecting); - } }, - handleIsFullyConnected: function(isConnected, isInitialConnect) - { + handleIsFullyConnected: function(isConnected, isInitialConnect) { // load all images referenced from CSS, one at a time, // starting one second after connection is first established. - if (isConnected && !pad.preloadedImages) - { - window.setTimeout(function() - { - if (!pad.preloadedImages) - { + if (isConnected && !pad.preloadedImages) { + window.setTimeout(function() { + if (!pad.preloadedImages) { pad.preloadImages(); pad.preloadedImages = true; } }, 1000); } - padsavedrevs.handleIsFullyConnected(isConnected); - // pad.determineSidebarVisibility(isConnected && !isInitialConnect); pad.determineChatVisibility(isConnected && !isInitialConnect); - }, /* determineSidebarVisibility: function(asNowConnectedFeedback) { @@ -760,62 +591,43 @@ var pad = { } }, */ - determineChatVisibility: function(asNowConnectedFeedback){ + determineChatVisibility: function(asNowConnectedFeedback) { var chatVisCookie = padcookie.getPref('chatAlwaysVisible'); - if(chatVisCookie){ // if the cookie is set for chat always visible - chat.stickToScreen(true); // stick it to the screen - $('#options-stickychat').prop("checked", true); // set the checkbox to on - } - else{ - $('#options-stickychat').prop("checked", false); // set the checkbox for off + if (chatVisCookie) { // if the cookie is set for chat always visible + chat.stickToScreen(true); // stick chat to the screen + $('#options-stickychat').prop('checked', true); // set the checkbox to on + } else { + $('#options-stickychat').prop('checked', false); // set the checkbox for off } }, - handleCollabAction: function(action) - { - if (action == "commitPerformed") - { - padeditbar.setSyncStatus("syncing"); - } - else if (action == "newlyIdle") - { - padeditbar.setSyncStatus("done"); - } + handleCollabAction: function(action) { + if (action == 'commitPerformed') + padeditbar.setSyncStatus('syncing'); + else if (action == 'newlyIdle') + padeditbar.setSyncStatus('done'); }, - hideServerMessage: function() - { + hideServerMessage: function() { alertBar.hideMessage(); }, - asyncSendDiagnosticInfo: function() - { - window.setTimeout(function() - { - $.ajax( - { - type: 'post', - url: '/ep/pad/connection-diagnostic-info', - data: { - diagnosticInfo: JSON.stringify(pad.diagnosticInfo) - }, - success: function() - {}, - error: function() - {} + asyncSendDiagnosticInfo: function() { + window.setTimeout(function() { + $.post({ + url : '/ep/pad/connection-diagnostic-info', + data: {diagnosticInfo: JSON.stringify(pad.diagnosticInfo)} }); }, 0); }, - forceReconnect: function() - { - $('form#reconnectform input.padId').val(pad.getPadId()); + forceReconnect: function() { + $('#reconnectform .padId').val(pad.getPadId()); pad.diagnosticInfo.collabDiagnosticInfo = pad.collabClient.getDiagnosticInfo(); - $('form#reconnectform input.diagnosticInfo').val(JSON.stringify(pad.diagnosticInfo)); - $('form#reconnectform input.missedChanges').val(JSON.stringify(pad.collabClient.getMissedChanges())); - $('form#reconnectform').submit(); + $('#reconnectform .diagnosticInfo').val(JSON.stringify(pad.diagnosticInfo)); + $('#reconnectform .missedChanges').val(JSON.stringify(pad.collabClient.getMissedChanges())); + $('#reconnectform').submit(); }, - toggleWidthPref: function() - { + toggleWidthPref: function() { var newValue = !padcookie.getPref('fullWidth'); padcookie.setPref('fullWidth', newValue); - $("#widthprefcheck").toggleClass('widthprefchecked', !! newValue).toggleClass('widthprefunchecked', !newValue); + $('#widthprefcheck').toggleClass('widthprefchecked', !! newValue).toggleClass('widthprefunchecked', !newValue); pad.handleWidthChange(); }, /* @@ -827,119 +639,77 @@ var pad = { pad.determineSidebarVisibility(); }, */ - handleWidthChange: function() - { + handleWidthChange: function() { var isFullWidth = padcookie.getPref('fullWidth'); if (isFullWidth) - { - $("body").addClass('fullwidth').removeClass('limwidth').removeClass('squish1width').removeClass('squish2width'); - } - else - { - $("body").addClass('limwidth').removeClass('fullwidth'); - + $('BODY').addClass('fullwidth').removeClass('limwidth squish1width squish2width'); + else { + $('BODY').addClass('limwidth').removeClass('fullwidth'); var pageWidth = $(window).width(); - $("body").toggleClass('squish1width', (pageWidth < 912 && pageWidth > 812)).toggleClass('squish2width', (pageWidth <= 812)); + $('BODY').toggleClass('squish1width', (pageWidth < 912 && pageWidth > 812)).toggleClass('squish2width', (pageWidth <= 812)); } }, // this is called from code put into a frame from the server: - handleImportExportFrameCall: function(callName, varargs) - { + handleImportExportFrameCall: function(callName, varargs) { padimpexp.handleFrameCall.call(padimpexp, callName, Array.prototype.slice.call(arguments, 1)); }, - callWhenNotCommitting: function(f) - { + callWhenNotCommitting: function(f) { pad.collabClient.callWhenNotCommitting(f); }, - getCollabRevisionNumber: function() - { + getCollabRevisionNumber: function() { return pad.collabClient.getCurrentRevisionNumber(); }, - isFullyConnected: function() - { + isFullyConnected: function() { return padconnectionstatus.isFullyConnected(); }, - addHistoricalAuthors: function(data) - { - if (!pad.collabClient) - { - window.setTimeout(function() - { + addHistoricalAuthors: function(data) { + if (!pad.collabClient) { + window.setTimeout(function() { pad.addHistoricalAuthors(data); }, 1000); - } - else - { + } else { pad.collabClient.addHistoricalAuthors(data); } }, - preloadImages: function() - { + preloadImages: function() { var images = ["../static/img/connectingbar.gif"]; - - function loadNextImage() - { + function loadNextImage() { if (images.length == 0) - { return; - } var img = new Image(); img.src = images.shift(); if (img.complete) - { scheduleLoadNextImage(); - } else - { $(img).bind('error load onreadystatechange', scheduleLoadNextImage); - } } - - function scheduleLoadNextImage() - { + function scheduleLoadNextImage() { window.setTimeout(loadNextImage, 0); } scheduleLoadNextImage(); } }; -var alertBar = (function() -{ - +var alertBar = (function() { var animator = padutils.makeShowHideAnimator(arriveAtAnimationState, false, 25, 400); - - function arriveAtAnimationState(state) - { + function arriveAtAnimationState(state) { if (state == -1) - { - $("#alertbar").css('opacity', 0).css('display', 'block'); - } + $('#alertbar').css('opacity', 0).css('display', 'block'); else if (state == 0) - { - $("#alertbar").css('opacity', 1); - } + $('#alertbar').css('opacity', 1); else if (state == 1) - { - $("#alertbar").css('opacity', 0).css('display', 'none'); - } + $('#alertbar').css('opacity', 0).css('display', 'none'); else if (state < 0) - { - $("#alertbar").css('opacity', state + 1); - } + $('#alertbar').css('opacity', state + 1); else if (state > 0) - { - $("#alertbar").css('opacity', 1 - state); - } + $('#alertbar').css('opacity', 1 - state); } - var self = { - displayMessage: function(setupFunc) - { + displayMessage: function(setupFunc) { animator.show(); - setupFunc($("#alertbar")); + setupFunc($('#alertbar')); }, - hideMessage: function() - { + hideMessage: function() { animator.hide(); } }; @@ -951,24 +721,23 @@ function init() { } var settings = { - LineNumbersDisabled: false -, noColors: false -, useMonospaceFontGlobal: false -, globalUserName: false -, hideQRCode: false -, rtlIsTrue: false + LineNumbersDisabled : false, + noColors : false, + useMonospaceFontGlobal: false, + globalUserName : false, + hideQRCode : false, + rtlIsTrue : false }; -pad.settings = settings; - -exports.settings = settings; -exports.createCookie = createCookie; -exports.readCookie = readCookie; -exports.randomString = randomString; -exports.getParams = getParams; -exports.getUrlVars = getUrlVars; -exports.savePassword = savePassword; -exports.handshake = handshake; -exports.pad = pad; -exports.init = init; -exports.alertBar = alertBar; +pad.settings = settings; +exports.settings = settings; +exports.createCookie = createCookie; +exports.readCookie = readCookie; +exports.randomString = randomString; +exports.getParams = getParams; +exports.getUrlVars = getUrlVars; +exports.savePassword = savePassword; +exports.handshake = handshake; +exports.pad = pad; +exports.init = init; +exports.alertBar = alertBar; \ No newline at end of file diff --git a/static/js/pad_editbar.js b/static/js/pad_editbar.js index 8e4ffa3c9..fcd9e431b 100644 --- a/static/js/pad_editbar.js +++ b/static/js/pad_editbar.js @@ -20,74 +20,56 @@ * limitations under the License. */ -var padutils = require('/pad_utils').padutils; -var padeditor = require('/pad_editor').padeditor; -var padsavedrevs = require('/pad_savedrevs').padsavedrevs; +var padutils = require('/pad_utils').padutils, + padeditor = require('/pad_editor').padeditor, + padsavedrevs = require('/pad_savedrevs').padsavedrevs; function indexOf(array, value) { - for (var i = 0, ii = array.length; i < ii; i++) { - if (array[i] == value) { + for (var i=0, ii=array.length; i < ii; i++) { + if (array[i] == value) return i; - } } return -1; } -var padeditbar = (function() -{ - - var syncAnimation = (function() - { - var SYNCING = -100; - var DONE = 100; - var state = DONE; - var fps = 25; - var step = 1 / fps; - var T_START = -0.5; - var T_FADE = 1.0; - var T_GONE = 1.5; - var animator = padutils.makeAnimationScheduler(function() - { +var padeditbar = (function() { + var syncAnimation = (function() { + var SYNCING = -100, + DONE = 100, + state = DONE, + fps = 25, + step = 1 / fps, + T_START = -0.5, + T_FADE = 1.0, + T_GONE = 1.5; + var animator = padutils.makeAnimationScheduler(function() { if (state == SYNCING || state == DONE) - { return false; - } - else if (state >= T_GONE) - { + else if (state >= T_GONE) { state = DONE; - $("#syncstatussyncing").css('display', 'none'); - $("#syncstatusdone").css('display', 'none'); + $('#syncstatussyncing, #syncstatusdone').hide(); return false; - } - else if (state < 0) - { + } else if (state < 0) { state += step; - if (state >= 0) - { - $("#syncstatussyncing").css('display', 'none'); - $("#syncstatusdone").css('display', 'block').css('opacity', 1); + if (state >= 0) { + $('#syncstatussyncing').hide(); + $('#syncstatusdone').show().css({opacity: 1}); } return true; - } - else - { + } else { state += step; if (state >= T_FADE) - { - $("#syncstatusdone").css('opacity', (T_GONE - state) / (T_GONE - T_FADE)); - } + $('#syncstatusdone').css('opacity', (T_GONE - state) / (T_GONE - T_FADE)); return true; } }, step * 1000); return { - syncing: function() - { + syncing: function() { state = SYNCING; - $("#syncstatussyncing").css('display', 'block'); - $("#syncstatusdone").css('display', 'none'); + $('#syncstatussyncing').show(); + $('#syncstatusdone').hide(); }, - done: function() - { + done: function() { state = T_START; animator.scheduleAnimation(); } @@ -95,162 +77,119 @@ var padeditbar = (function() }()); var self = { - init: function() - { - $("#editbar .editbarbutton").attr("unselectable", "on"); // for IE - $("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar"); + init: function() { + $('#editbar A').attr('unselectable', 'on'); // for IE + $('#editbar').removeClass('disabledtoolbar').addClass('enabledtoolbar'); }, - isEnabled: function() - { + isEnabled: function() { // return !$("#editbar").hasClass('disabledtoolbar'); return true; }, - disable: function() - { - $("#editbar").addClass('disabledtoolbar').removeClass("enabledtoolbar"); + disable: function() { + $('#editbar').addClass('disabledtoolbar').removeClass('enabledtoolbar'); }, - toolbarClick: function(cmd) - { - if (self.isEnabled()) - { - if(cmd == "showusers") - { - self.toogleDropDown("users"); - } - else if (cmd == 'settings') - { - self.toogleDropDown("settingsmenu"); - } - else if (cmd == 'embed') - { - self.setEmbedLinks(); - $('#linkinput').focus().select(); - self.toogleDropDown("embed"); - } - else if (cmd == 'import_export') - { - self.toogleDropDown("importexport"); - } - else if (cmd == 'save') - { - padsavedrevs.saveNow(); - } - else - { - padeditor.ace.callWithAce(function(ace) - { - if (cmd == 'bold' || cmd == 'italic' || cmd == 'underline' || cmd == 'strikethrough') ace.ace_toggleAttributeOnSelection(cmd); - else if (cmd == 'undo' || cmd == 'redo') ace.ace_doUndoRedo(cmd); - else if (cmd == 'insertunorderedlist') ace.ace_doInsertUnorderedList(); - else if (cmd == 'insertorderedlist') ace.ace_doInsertOrderedList(); - else if (cmd == 'indent') - { - if (!ace.ace_doIndentOutdent(false)) - { + toolbarClick: function(cmd) { + if (self.isEnabled()) { + switch(cmd) { + case 'showusers': + self.toggleDropDown('usersmenu'); + break; + case 'settings': + self.toggleDropDown('settingsmenu'); + break; + case 'embed': + self.setEmbedLinks(); + self.toggleDropDown('embedmenu'); + break; + case 'import_export': + self.toggleDropDown('importexportmenu'); + break; + case 'save': + padsavedrevs.saveNow(); + break; + default: + padeditor.ace.callWithAce(function(ace) { + if (cmd == 'bold' || cmd == 'italic' || cmd == 'underline' || cmd == 'strikethrough') + ace.ace_toggleAttributeOnSelection(cmd); + else if (cmd == 'undo' || cmd == 'redo') + ace.ace_doUndoRedo(cmd); + else if (cmd == 'insertunorderedlist') ace.ace_doInsertUnorderedList(); - } - } - else if (cmd == 'outdent') - { - ace.ace_doIndentOutdent(true); - } - else if (cmd == 'clearauthorship') - { - if ((!(ace.ace_getRep().selStart && ace.ace_getRep().selEnd)) || ace.ace_isCaret()) - { - if (window.confirm("Clear authorship colors on entire document?")) - { - ace.ace_performDocumentApplyAttributesToCharRange(0, ace.ace_getRep().alltext.length, [ - ['author', ''] - ]); + else if (cmd == 'insertorderedlist') + ace.ace_doInsertOrderedList(); + else if (cmd == 'indent') { + if (!ace.ace_doIndentOutdent(false)) + ace.ace_doInsertUnorderedList(); + } else if (cmd == 'outdent') + ace.ace_doIndentOutdent(true); + else if (cmd == 'clearauthorship') { + if ((!(ace.ace_getRep().selStart && ace.ace_getRep().selEnd)) || ace.ace_isCaret()) { + if (window.confirm("Clear authorship colors on entire document?")) { + ace.ace_performDocumentApplyAttributesToCharRange(0, ace.ace_getRep().alltext.length, [ + ['author', ''] + ]); + } + } else { + ace.ace_setAttributeOnSelection('author', ''); } } - else - { - ace.ace_setAttributeOnSelection('author', ''); - } - } - }, cmd, true); + }, cmd, true); } } - if(padeditor.ace) padeditor.ace.focus(); + if (padeditor.ace) + padeditor.ace.focus(); }, - toogleDropDown: function(moduleName) - { - var modules = ["settingsmenu", "importexport", "embed", "users"]; - - //hide all modules - if(moduleName == "none") - { - $("#editbar ul#menu_right > li").removeClass("selected"); - for(var i=0;i 0 && nth_child <= 3) { - $("#editbar ul#menu_right li:not(:nth-child(" + nth_child + "))").removeClass("selected"); - $("#editbar ul#menu_right li:nth-child(" + nth_child + ")").toggleClass("selected"); - } - //hide all modules that are not selected and show the selected one - for(var i=0;i 0 && nth_child <= 3) { + $('#editbar UL.right LI:not(:nth-child(' + nth_child + '))').removeClass('selected'); + $('#editbar UL.right LI:nth-child(' + nth_child + ')').toggleClass('selected'); + } + // hide all modules that are not selected and show the selected one + for (i=0, l=modules.length; i < l; i++) { + module = $('#' + modules[i]); + if (module.is(':visible')) + module.slideUp(250); + else if (modules[i] == moduleName) + module.slideDown(250); } } }, - setSyncStatus: function(status) - { - if (status == "syncing") - { + setSyncStatus: function(status) { + if (status == 'syncing') syncAnimation.syncing(); - } - else if (status == "done") - { + else if (status == 'done') syncAnimation.done(); - } }, - setEmbedLinks: function() - { - if ($('#readonlyinput').is(':checked')) - { - var basePath = document.location.href.substring(0, document.location.href.indexOf("/p/")); - var readonlyLink = basePath + "/ro/" + clientVars.readOnlyId; + setEmbedLinks: function() { + if ($('#readonlyinput').is(':checked')) { + var basePath = document.location.href.substring(0, document.location.href.indexOf('/p/')), + readonlyLink = basePath + '/ro/' + clientVars.readOnlyId; $('#embedinput').val("