diff -Nru libjs-jsxc-3.0.0+dfsg3/banner.js libjs-jsxc-3.4.4+dfsg/banner.js --- libjs-jsxc-3.0.0+dfsg3/banner.js 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/banner.js 2019-08-18 00:09:17.000000000 +0000 @@ -1,5 +1,5 @@ /*! - * <%= app.name %> v<%= app.version %> - <%= grunt.template.today("yyyy-mm-dd") %> + * <%= app.name %> v<%= version %> - <%= grunt.template.today("yyyy-mm-dd") %> * * Copyright (c) <%= grunt.template.today("yyyy") %> <%= app.author %>
* Released under the <%= app.license %> license @@ -7,6 +7,6 @@ * Please see <%= app.homepage %> * * @author <%= app.author %> - * @version <%= app.version %> + * @version <%= version %> * @license MIT */ diff -Nru libjs-jsxc-3.0.0+dfsg3/bower.json libjs-jsxc-3.4.4+dfsg/bower.json --- libjs-jsxc-3.0.0+dfsg3/bower.json 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/bower.json 2019-08-18 00:09:17.000000000 +0000 @@ -1,6 +1,6 @@ { "name": "jsxc", - "version": "3.0.0-beta1", + "version": "3.4.4", "homepage": "https://www.jsxc.org", "authors": [ "sualko " @@ -24,12 +24,18 @@ "tests" ], "private": true, - "dependencies": { - "emojione": "~2.0.1", + "devDependencies": { + "emojione": "~2.2.7", "favico.js": "^0.3.10", - "strophe.bookmarks": "https://raw.githubusercontent.com/sualko/strophejs-plugins/bookmarks/bookmarks/strophe.bookmarks.js", - "strophe.js": "strophejs#a11ebefa3db1b6712d51d0d309b9f68f8e391d1b", - "strophe.vcard": "https://raw.githubusercontent.com/strophe/strophejs-plugins/2f07137ad2cbeaed41650ee46373c2f44e0f263a/vcard/strophe.vcard.js", - "strophe.x": "https://raw.githubusercontent.com/strophe/strophejs-plugins/master/dataforms/src/strophe.x.js" + "strophe.bookmarks": "strophe/strophejs-plugin-bookmarks#ff9e95a1a823b927f8c4c45453aaa534857a37b4", + "strophe.vcard": "strophe/strophejs-plugin-vcard#de3a0c97a2c520ed900ee15b04a0c16d5c663891", + "strophe.x": "strophe/strophejs-plugin-dataforms", + "strophe.chatstates": "strophe/strophejs-plugin-chatstates#fb0b5f5b03d98ba05ac9dec853fe2190794128b6", + "jquery-i18next": "^1.2.0", + "i18next": "^5.0.0", + "magnific-popup": "^1.1.0", + "strophejs-plugin-mam": "strophe/strophejs-plugin-mam#d7b9a8a0b404e3dd9c83dd9cc4bf28aec2e5f329", + "strophejs-plugin-rsm": "strophe/strophejs-plugin-rsm#fa16b3b", + "strophejs": "~1.2.14" } } diff -Nru libjs-jsxc-3.0.0+dfsg3/build/css/jquery-ui.min.css libjs-jsxc-3.4.4+dfsg/build/css/jquery-ui.min.css --- libjs-jsxc-3.0.0+dfsg3/build/css/jquery-ui.min.css 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/css/jquery-ui.min.css 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -/*! jQuery UI - v1.10.4 - 2014-01-17 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css -* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:400;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:400;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:400;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff -Nru libjs-jsxc-3.0.0+dfsg3/build/css/jsxc.css libjs-jsxc-3.4.4+dfsg/build/css/jsxc.css --- libjs-jsxc-3.0.0+dfsg3/build/css/jsxc.css 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/css/jsxc.css 2019-08-18 00:09:17.000000000 +0000 @@ -1,201 +1,4 @@ @charset "UTF-8"; -/* basic scrollbar styling */ -/* vertical scrollbar */ -.mCSB_container { - width: auto; - margin-right: 30px; - overflow: hidden; } - -.mCSB_container.mCS_no_scrollbar { - margin-right: 0; } - -.mCS_disabled .mCSB_container.mCS_no_scrollbar, .mCS_destroyed .mCSB_container.mCS_no_scrollbar { - margin-right: 30px; } - -.mCustomScrollBox .mCSB_scrollTools { - width: 16px; - height: 100%; - top: 0; - right: 0; } - -.mCSB_scrollTools .mCSB_draggerContainer { - height: 100%; - box-sizing: border-box; } - -.mCSB_scrollTools .mCSB_buttonUp + .mCSB_draggerContainer { - padding-bottom: 40px; } - -.mCSB_scrollTools .mCSB_draggerRail { - width: 2px; - height: 100%; - margin: 0 auto; - border-radius: 10px; } - -.mCSB_scrollTools .mCSB_dragger { - cursor: pointer; - width: 100%; - height: 30px; } - -.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar { - width: 4px; - height: 100%; - margin: 0 auto; - border-radius: 10px; - text-align: center; } - -.mCSB_scrollTools .mCSB_buttonUp, .mCSB_scrollTools .mCSB_buttonDown { - height: 20px; - overflow: hidden; - margin: 0 auto; - cursor: pointer; } - -.mCSB_scrollTools .mCSB_buttonDown { - bottom: 0; - margin-top: -40px; } - -/* horizontal scrollbar */ -.mCSB_horizontal .mCSB_container { - height: auto; - margin-right: 0; - margin-bottom: 30px; - overflow: hidden; } - -.mCSB_horizontal .mCSB_container.mCS_no_scrollbar { - margin-bottom: 0; } - -.mCS_disabled .mCSB_horizontal .mCSB_container.mCS_no_scrollbar, .mCS_destroyed .mCSB_horizontal .mCSB_container.mCS_no_scrollbar { - margin-right: 0; - margin-bottom: 30px; } - -.mCSB_horizontal.mCustomScrollBox .mCSB_scrollTools { - width: 100%; - height: 16px; - top: auto; - right: auto; - bottom: 0; - left: 0; - overflow: hidden; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_draggerContainer { - height: 100%; - width: auto; - box-sizing: border-box; - overflow: hidden; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft + .mCSB_draggerContainer { - padding-bottom: 0; - padding-right: 20px; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_draggerRail { - width: 100%; - height: 2px; - margin: 7px 0; - border-radius: 10px; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_dragger { - width: 30px; - height: 100%; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar { - width: 100%; - height: 4px; - margin: 6px auto; - border-radius: 10px; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft, .mCSB_horizontal .mCSB_scrollTools .mCSB_buttonRight { - width: 20px; - height: 100%; - overflow: hidden; - margin: 0 auto; - cursor: pointer; - float: left; } - -.mCSB_horizontal .mCSB_scrollTools .mCSB_buttonRight { - right: 0; - bottom: auto; - margin-left: -40px; - margin-top: -16px; - float: right; } - -/* default scrollbar colors and backgrounds */ -.mCustomScrollBox .mCSB_scrollTools { - opacity: 0.75; } - -.mCustomScrollBox:hover .mCSB_scrollTools { - opacity: 1; } - -.mCSB_scrollTools .mCSB_draggerRail { - background: #000; - /* rgba fallback */ - background: rgba(0, 0, 0, 0.4); - filter: "alpha(opacity=40)"; - -ms-filter: "alpha(opacity=40)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar { - background: #fff; - /* rgba fallback */ - background: rgba(255, 255, 255, 0.75); - filter: "alpha(opacity=75)"; - -ms-filter: "alpha(opacity=75)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar { - background: rgba(255, 255, 255, 0.85); - filter: "alpha(opacity=85)"; - -ms-filter: "alpha(opacity=85)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, .mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar { - background: rgba(255, 255, 255, 0.9); - filter: "alpha(opacity=90)"; - -ms-filter: "alpha(opacity=90)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_buttonUp, .mCSB_scrollTools .mCSB_buttonDown, .mCSB_scrollTools .mCSB_buttonLeft, .mCSB_scrollTools .mCSB_buttonRight { - background-image: url(mCSB_buttons.png); - background-repeat: no-repeat; - opacity: 0.4; - filter: "alpha(opacity=40)"; - -ms-filter: "alpha(opacity=40)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_buttonUp { - background-position: 0 0; - /* - sprites locations are 0 0/-16px 0/-32px 0/-48px 0 (light) and -80px 0/-96px 0/-112px 0/-128px 0 (dark) - */ } - -.mCSB_scrollTools .mCSB_buttonDown { - background-position: 0 -20px; - /* - sprites locations are 0 -20px/-16px -20px/-32px -20px/-48px -20px (light) and -80px -20px/-96px -20px/-112px -20px/-128px -20px (dark) - */ } - -.mCSB_scrollTools .mCSB_buttonLeft { - background-position: 0 -40px; - /* - sprites locations are 0 -40px/-20px -40px/-40px -40px/-60px -40px (light) and -80px -40px/-100px -40px/-120px -40px/-140px -40px (dark) - */ } - -.mCSB_scrollTools .mCSB_buttonRight { - background-position: 0 -56px; - /* - sprites locations are 0 -56px/-20px -56px/-40px -56px/-60px -56px (light) and -80px -56px/-100px -56px/-120px -56px/-140px -56px (dark) - */ } - -.mCSB_scrollTools .mCSB_buttonUp:hover, .mCSB_scrollTools .mCSB_buttonDown:hover, .mCSB_scrollTools .mCSB_buttonLeft:hover, .mCSB_scrollTools .mCSB_buttonRight:hover { - opacity: 0.75; - filter: "alpha(opacity=75)"; - -ms-filter: "alpha(opacity=75)"; - /* old ie */ } - -.mCSB_scrollTools .mCSB_buttonUp:active, .mCSB_scrollTools .mCSB_buttonDown:active, .mCSB_scrollTools .mCSB_buttonLeft:active, .mCSB_scrollTools .mCSB_buttonRight:active { - opacity: 0.9; - filter: "alpha(opacity=90)"; - -ms-filter: "alpha(opacity=90)"; - /* old ie */ } - /* Magnific Popup CSS */ .mfp-bg { top: 0; @@ -206,8 +9,7 @@ overflow: hidden; position: fixed; background: #0b0b0b; - opacity: 0.8; - filter: alpha(opacity=80); } + opacity: 0.8; } .mfp-wrap { top: 0; @@ -255,12 +57,10 @@ cursor: progress; } .mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { - cursor: -webkit-zoom-out; cursor: zoom-out; } .mfp-zoom { cursor: pointer; - cursor: -webkit-zoom-in; cursor: zoom-in; } .mfp-auto-cursor .mfp-content { @@ -302,8 +102,7 @@ .mfp-s-error .mfp-content { display: none; } -button.mfp-close, -button.mfp-arrow { +button.mfp-close, button.mfp-arrow { overflow: visible; cursor: pointer; background: transparent; @@ -313,7 +112,9 @@ outline: none; padding: 0; z-index: 1046; - box-shadow: none; } + box-shadow: none; + -ms-touch-action: manipulation; + touch-action: manipulation; } button::-moz-focus-inner { padding: 0; @@ -329,16 +130,13 @@ text-decoration: none; text-align: center; opacity: 0.65; - filter: alpha(opacity=65); padding: 0 0 18px 10px; color: #FFF; font-style: normal; font-size: 28px; font-family: Arial, Baskerville, monospace; } - .mfp-close:hover, - .mfp-close:focus { - opacity: 1; - filter: alpha(opacity=100); } + .mfp-close:hover, .mfp-close:focus { + opacity: 1; } .mfp-close:active { top: 1px; } @@ -365,24 +163,18 @@ .mfp-arrow { position: absolute; opacity: 0.65; - filter: alpha(opacity=65); margin: 0; top: 50%; margin-top: -55px; padding: 0; width: 90px; height: 110px; - -webkit-tap-highlight-color: transparent; } + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .mfp-arrow:active { margin-top: -54px; } - .mfp-arrow:hover, - .mfp-arrow:focus { - opacity: 1; - filter: alpha(opacity=100); } - .mfp-arrow:before, - .mfp-arrow:after, - .mfp-arrow .mfp-b, - .mfp-arrow .mfp-a { + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; } + .mfp-arrow:before, .mfp-arrow:after { content: ''; display: block; width: 0; @@ -393,36 +185,30 @@ margin-top: 35px; margin-left: 35px; border: medium inset transparent; } - .mfp-arrow:after, - .mfp-arrow .mfp-a { + .mfp-arrow:after { border-top-width: 13px; border-bottom-width: 13px; top: 8px; } - .mfp-arrow:before, - .mfp-arrow .mfp-b { + .mfp-arrow:before { border-top-width: 21px; border-bottom-width: 21px; opacity: 0.7; } .mfp-arrow-left { left: 0; } - .mfp-arrow-left:after, - .mfp-arrow-left .mfp-a { + .mfp-arrow-left:after { border-right: 17px solid #FFF; margin-left: 31px; } - .mfp-arrow-left:before, - .mfp-arrow-left .mfp-b { + .mfp-arrow-left:before { margin-left: 25px; border-right: 27px solid #3F3F3F; } .mfp-arrow-right { right: 0; } - .mfp-arrow-right:after, - .mfp-arrow-right .mfp-a { + .mfp-arrow-right:after { border-left: 17px solid #FFF; margin-left: 39px; } - .mfp-arrow-right:before, - .mfp-arrow-right .mfp-b { + .mfp-arrow-right:before { border-left: 27px solid #3F3F3F; } .mfp-iframe-holder { @@ -547,42 +333,15 @@ @media all and (max-width: 900px) { .mfp-arrow { - -webkit-transform: scale(0.75); - -ms-transform: scale(0.75); - transform: scale(0.75); } + transform: scale(0.75); } .mfp-arrow-left { - -webkit-transform-origin: 0; - -ms-transform-origin: 0; - transform-origin: 0; } + transform-origin: 0; } .mfp-arrow-right { - -webkit-transform-origin: 100%; - -ms-transform-origin: 100%; - transform-origin: 100%; } + transform-origin: 100%; } .mfp-container { padding-left: 6px; padding-right: 6px; } } -.mfp-ie7 .mfp-img { - padding: 0; } - -.mfp-ie7 .mfp-bottom-bar { - width: 600px; - left: 50%; - margin-left: -300px; - margin-top: 5px; - padding-bottom: 5px; } - -.mfp-ie7 .mfp-container { - padding: 0; } - -.mfp-ie7 .mfp-content { - padding-top: 44px; } - -.mfp-ie7 .mfp-close { - top: 0; - right: 0; - padding-top: 0; } - .emojione { /* Emoji Sizing */ font-size: inherit; @@ -592,7 +351,7 @@ min-width: 20px; /* Inline alignment adjust the margins */ display: inline-block; - margin: -0.2ex 0.15em 0.2ex; + margin: -.2ex .15em .2ex; line-height: normal; vertical-align: middle; } @@ -600,19 +359,12 @@ /* prevent img stretch */ width: auto; } -/* BEGIN: bootstrap */ @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; } - to { - background-position: 0 0; } } - @keyframes progress-bar-stripes { from { background-position: 40px 0; } @@ -637,47 +389,38 @@ text-align: center; background-color: #337ab7; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } #jsxc_dialog .progress-striped .progress-bar, #jsxc_dialog .progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } #jsxc_dialog .progress.active .progress-bar, #jsxc_dialog .progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } #jsxc_dialog .progress-bar-success { background-color: #5cb85c; } .progress-striped #jsxc_dialog .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } #jsxc_dialog .progress-bar-info { background-color: #5bc0de; } .progress-striped #jsxc_dialog .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } #jsxc_dialog .progress-bar-warning { background-color: #f0ad4e; } .progress-striped #jsxc_dialog .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } #jsxc_dialog .progress-bar-danger { background-color: #d9534f; } .progress-striped #jsxc_dialog .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } -#jsxc_dialog .clearfix:before, -#jsxc_dialog .clearfix:after, #jsxc_webrtc .clearfix:before, -#jsxc_webrtc .clearfix:after { +#jsxc_dialog .clearfix:before, #jsxc_dialog .clearfix:after, #jsxc_webrtc .clearfix:before, #jsxc_webrtc .clearfix:after { content: " "; display: table; } @@ -775,9 +518,7 @@ margin-left: auto; padding-left: 15px; padding-right: 15px; } - #jsxc_dialog .container:before, - #jsxc_dialog .container:after, #jsxc_webrtc .container:before, - #jsxc_webrtc .container:after { + #jsxc_dialog .container:before, #jsxc_dialog .container:after, #jsxc_webrtc .container:before, #jsxc_webrtc .container:after { content: " "; display: table; } #jsxc_dialog .container:after, #jsxc_webrtc .container:after { @@ -797,9 +538,7 @@ margin-left: auto; padding-left: 15px; padding-right: 15px; } - #jsxc_dialog .container-fluid:before, - #jsxc_dialog .container-fluid:after, #jsxc_webrtc .container-fluid:before, - #jsxc_webrtc .container-fluid:after { + #jsxc_dialog .container-fluid:before, #jsxc_dialog .container-fluid:after, #jsxc_webrtc .container-fluid:before, #jsxc_webrtc .container-fluid:after { content: " "; display: table; } #jsxc_dialog .container-fluid:after, #jsxc_webrtc .container-fluid:after { @@ -808,9 +547,7 @@ #jsxc_dialog .row, #jsxc_webrtc .row { margin-left: -15px; margin-right: -15px; } - #jsxc_dialog .row:before, - #jsxc_dialog .row:after, #jsxc_webrtc .row:before, - #jsxc_webrtc .row:after { + #jsxc_dialog .row:before, #jsxc_dialog .row:after, #jsxc_webrtc .row:before, #jsxc_webrtc .row:after { content: " "; display: table; } #jsxc_dialog .row:after, #jsxc_webrtc .row:after { @@ -1313,9 +1050,13 @@ #jsxc_dialog .alert > p + p, #jsxc_webrtc .alert > p + p { margin-top: 5px; } -#jsxc_dialog .alert-dismissable, #jsxc_dialog .alert-dismissible, #jsxc_webrtc .alert-dismissable, #jsxc_webrtc .alert-dismissible { +#jsxc_dialog .alert-dismissable, +#jsxc_dialog .alert-dismissible, #jsxc_webrtc .alert-dismissable, +#jsxc_webrtc .alert-dismissible { padding-right: 35px; } - #jsxc_dialog .alert-dismissable .close, #jsxc_dialog .alert-dismissible .close, #jsxc_webrtc .alert-dismissable .close, #jsxc_webrtc .alert-dismissible .close { + #jsxc_dialog .alert-dismissable .close, + #jsxc_dialog .alert-dismissible .close, #jsxc_webrtc .alert-dismissable .close, + #jsxc_webrtc .alert-dismissible .close { position: relative; top: -2px; right: -21px; @@ -1377,37 +1118,19 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; } - #jsxc_dialog .btn:focus, - #jsxc_dialog .btn.focus, - #jsxc_dialog .btn:active:focus, - #jsxc_dialog .btn:active.focus, - #jsxc_dialog .btn.active:focus, - #jsxc_dialog .btn.active.focus, #jsxc_webrtc .btn:focus, - #jsxc_webrtc .btn.focus, - #jsxc_webrtc .btn:active:focus, - #jsxc_webrtc .btn:active.focus, - #jsxc_webrtc .btn.active:focus, - #jsxc_webrtc .btn.active.focus { + #jsxc_dialog .btn:focus, #jsxc_dialog .btn.focus, #jsxc_dialog .btn:active:focus, #jsxc_dialog .btn:active.focus, #jsxc_dialog .btn.active:focus, #jsxc_dialog .btn.active.focus, #jsxc_webrtc .btn:focus, #jsxc_webrtc .btn.focus, #jsxc_webrtc .btn:active:focus, #jsxc_webrtc .btn:active.focus, #jsxc_webrtc .btn.active:focus, #jsxc_webrtc .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } - #jsxc_dialog .btn:hover, - #jsxc_dialog .btn:focus, - #jsxc_dialog .btn.focus, #jsxc_webrtc .btn:hover, - #jsxc_webrtc .btn:focus, - #jsxc_webrtc .btn.focus { + #jsxc_dialog .btn:hover, #jsxc_dialog .btn:focus, #jsxc_dialog .btn.focus, #jsxc_webrtc .btn:hover, #jsxc_webrtc .btn:focus, #jsxc_webrtc .btn.focus { color: #333; text-decoration: none; } - #jsxc_dialog .btn:active, - #jsxc_dialog .btn.active, #jsxc_webrtc .btn:active, - #jsxc_webrtc .btn.active { + #jsxc_dialog .btn:active, #jsxc_dialog .btn.active, #jsxc_webrtc .btn:active, #jsxc_webrtc .btn.active { outline: 0; background-image: none; box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } - #jsxc_dialog .btn.disabled, - #jsxc_dialog .btn[disabled], - fieldset[disabled] #jsxc_dialog .btn, #jsxc_webrtc .btn.disabled, - #jsxc_webrtc .btn[disabled], + #jsxc_dialog .btn.disabled, #jsxc_dialog .btn[disabled], + fieldset[disabled] #jsxc_dialog .btn, #jsxc_webrtc .btn.disabled, #jsxc_webrtc .btn[disabled], fieldset[disabled] #jsxc_webrtc .btn { cursor: not-allowed; pointer-events: none; @@ -1419,55 +1142,23 @@ color: #333; background-color: #fff; border-color: #ccc; } - #jsxc_dialog .btn-default:hover, - #jsxc_dialog .btn-default:focus, - #jsxc_dialog .btn-default.focus, - #jsxc_dialog .btn-default:active, - #jsxc_dialog .btn-default.active, - .open > #jsxc_dialog .btn-default.dropdown-toggle, #jsxc_webrtc .btn-default:hover, - #jsxc_webrtc .btn-default:focus, - #jsxc_webrtc .btn-default.focus, - #jsxc_webrtc .btn-default:active, - #jsxc_webrtc .btn-default.active, + #jsxc_dialog .btn-default:hover, #jsxc_dialog .btn-default:focus, #jsxc_dialog .btn-default.focus, #jsxc_dialog .btn-default:active, #jsxc_dialog .btn-default.active, + .open > #jsxc_dialog .btn-default.dropdown-toggle, #jsxc_webrtc .btn-default:hover, #jsxc_webrtc .btn-default:focus, #jsxc_webrtc .btn-default.focus, #jsxc_webrtc .btn-default:active, #jsxc_webrtc .btn-default.active, .open > #jsxc_webrtc .btn-default.dropdown-toggle { color: #333; - background-color: #e6e6e6; + background-color: #e6e5e5; border-color: #adadad; } - #jsxc_dialog .btn-default:active, - #jsxc_dialog .btn-default.active, - .open > #jsxc_dialog .btn-default.dropdown-toggle, #jsxc_webrtc .btn-default:active, - #jsxc_webrtc .btn-default.active, + #jsxc_dialog .btn-default:active, #jsxc_dialog .btn-default.active, + .open > #jsxc_dialog .btn-default.dropdown-toggle, #jsxc_webrtc .btn-default:active, #jsxc_webrtc .btn-default.active, .open > #jsxc_webrtc .btn-default.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-default.disabled, - #jsxc_dialog .btn-default.disabled:hover, - #jsxc_dialog .btn-default.disabled:focus, - #jsxc_dialog .btn-default.disabled.focus, - #jsxc_dialog .btn-default.disabled:active, - #jsxc_dialog .btn-default.disabled.active, - #jsxc_dialog .btn-default[disabled], - #jsxc_dialog .btn-default[disabled]:hover, - #jsxc_dialog .btn-default[disabled]:focus, - #jsxc_dialog .btn-default[disabled].focus, - #jsxc_dialog .btn-default[disabled]:active, - #jsxc_dialog .btn-default[disabled].active, + #jsxc_dialog .btn-default.disabled, #jsxc_dialog .btn-default.disabled:hover, #jsxc_dialog .btn-default.disabled:focus, #jsxc_dialog .btn-default.disabled.focus, #jsxc_dialog .btn-default.disabled:active, #jsxc_dialog .btn-default.disabled.active, #jsxc_dialog .btn-default[disabled], #jsxc_dialog .btn-default[disabled]:hover, #jsxc_dialog .btn-default[disabled]:focus, #jsxc_dialog .btn-default[disabled].focus, #jsxc_dialog .btn-default[disabled]:active, #jsxc_dialog .btn-default[disabled].active, fieldset[disabled] #jsxc_dialog .btn-default, fieldset[disabled] #jsxc_dialog .btn-default:hover, fieldset[disabled] #jsxc_dialog .btn-default:focus, fieldset[disabled] #jsxc_dialog .btn-default.focus, fieldset[disabled] #jsxc_dialog .btn-default:active, - fieldset[disabled] #jsxc_dialog .btn-default.active, #jsxc_webrtc .btn-default.disabled, - #jsxc_webrtc .btn-default.disabled:hover, - #jsxc_webrtc .btn-default.disabled:focus, - #jsxc_webrtc .btn-default.disabled.focus, - #jsxc_webrtc .btn-default.disabled:active, - #jsxc_webrtc .btn-default.disabled.active, - #jsxc_webrtc .btn-default[disabled], - #jsxc_webrtc .btn-default[disabled]:hover, - #jsxc_webrtc .btn-default[disabled]:focus, - #jsxc_webrtc .btn-default[disabled].focus, - #jsxc_webrtc .btn-default[disabled]:active, - #jsxc_webrtc .btn-default[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-default.active, #jsxc_webrtc .btn-default.disabled, #jsxc_webrtc .btn-default.disabled:hover, #jsxc_webrtc .btn-default.disabled:focus, #jsxc_webrtc .btn-default.disabled.focus, #jsxc_webrtc .btn-default.disabled:active, #jsxc_webrtc .btn-default.disabled.active, #jsxc_webrtc .btn-default[disabled], #jsxc_webrtc .btn-default[disabled]:hover, #jsxc_webrtc .btn-default[disabled]:focus, #jsxc_webrtc .btn-default[disabled].focus, #jsxc_webrtc .btn-default[disabled]:active, #jsxc_webrtc .btn-default[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-default, fieldset[disabled] #jsxc_webrtc .btn-default:hover, fieldset[disabled] #jsxc_webrtc .btn-default:focus, @@ -1484,55 +1175,23 @@ color: #fff; background-color: #337ab7; border-color: #2e6da4; } - #jsxc_dialog .btn-primary:hover, - #jsxc_dialog .btn-primary:focus, - #jsxc_dialog .btn-primary.focus, - #jsxc_dialog .btn-primary:active, - #jsxc_dialog .btn-primary.active, - .open > #jsxc_dialog .btn-primary.dropdown-toggle, #jsxc_webrtc .btn-primary:hover, - #jsxc_webrtc .btn-primary:focus, - #jsxc_webrtc .btn-primary.focus, - #jsxc_webrtc .btn-primary:active, - #jsxc_webrtc .btn-primary.active, + #jsxc_dialog .btn-primary:hover, #jsxc_dialog .btn-primary:focus, #jsxc_dialog .btn-primary.focus, #jsxc_dialog .btn-primary:active, #jsxc_dialog .btn-primary.active, + .open > #jsxc_dialog .btn-primary.dropdown-toggle, #jsxc_webrtc .btn-primary:hover, #jsxc_webrtc .btn-primary:focus, #jsxc_webrtc .btn-primary.focus, #jsxc_webrtc .btn-primary:active, #jsxc_webrtc .btn-primary.active, .open > #jsxc_webrtc .btn-primary.dropdown-toggle { color: #fff; background-color: #286090; border-color: #204d74; } - #jsxc_dialog .btn-primary:active, - #jsxc_dialog .btn-primary.active, - .open > #jsxc_dialog .btn-primary.dropdown-toggle, #jsxc_webrtc .btn-primary:active, - #jsxc_webrtc .btn-primary.active, + #jsxc_dialog .btn-primary:active, #jsxc_dialog .btn-primary.active, + .open > #jsxc_dialog .btn-primary.dropdown-toggle, #jsxc_webrtc .btn-primary:active, #jsxc_webrtc .btn-primary.active, .open > #jsxc_webrtc .btn-primary.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-primary.disabled, - #jsxc_dialog .btn-primary.disabled:hover, - #jsxc_dialog .btn-primary.disabled:focus, - #jsxc_dialog .btn-primary.disabled.focus, - #jsxc_dialog .btn-primary.disabled:active, - #jsxc_dialog .btn-primary.disabled.active, - #jsxc_dialog .btn-primary[disabled], - #jsxc_dialog .btn-primary[disabled]:hover, - #jsxc_dialog .btn-primary[disabled]:focus, - #jsxc_dialog .btn-primary[disabled].focus, - #jsxc_dialog .btn-primary[disabled]:active, - #jsxc_dialog .btn-primary[disabled].active, + #jsxc_dialog .btn-primary.disabled, #jsxc_dialog .btn-primary.disabled:hover, #jsxc_dialog .btn-primary.disabled:focus, #jsxc_dialog .btn-primary.disabled.focus, #jsxc_dialog .btn-primary.disabled:active, #jsxc_dialog .btn-primary.disabled.active, #jsxc_dialog .btn-primary[disabled], #jsxc_dialog .btn-primary[disabled]:hover, #jsxc_dialog .btn-primary[disabled]:focus, #jsxc_dialog .btn-primary[disabled].focus, #jsxc_dialog .btn-primary[disabled]:active, #jsxc_dialog .btn-primary[disabled].active, fieldset[disabled] #jsxc_dialog .btn-primary, fieldset[disabled] #jsxc_dialog .btn-primary:hover, fieldset[disabled] #jsxc_dialog .btn-primary:focus, fieldset[disabled] #jsxc_dialog .btn-primary.focus, fieldset[disabled] #jsxc_dialog .btn-primary:active, - fieldset[disabled] #jsxc_dialog .btn-primary.active, #jsxc_webrtc .btn-primary.disabled, - #jsxc_webrtc .btn-primary.disabled:hover, - #jsxc_webrtc .btn-primary.disabled:focus, - #jsxc_webrtc .btn-primary.disabled.focus, - #jsxc_webrtc .btn-primary.disabled:active, - #jsxc_webrtc .btn-primary.disabled.active, - #jsxc_webrtc .btn-primary[disabled], - #jsxc_webrtc .btn-primary[disabled]:hover, - #jsxc_webrtc .btn-primary[disabled]:focus, - #jsxc_webrtc .btn-primary[disabled].focus, - #jsxc_webrtc .btn-primary[disabled]:active, - #jsxc_webrtc .btn-primary[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-primary.active, #jsxc_webrtc .btn-primary.disabled, #jsxc_webrtc .btn-primary.disabled:hover, #jsxc_webrtc .btn-primary.disabled:focus, #jsxc_webrtc .btn-primary.disabled.focus, #jsxc_webrtc .btn-primary.disabled:active, #jsxc_webrtc .btn-primary.disabled.active, #jsxc_webrtc .btn-primary[disabled], #jsxc_webrtc .btn-primary[disabled]:hover, #jsxc_webrtc .btn-primary[disabled]:focus, #jsxc_webrtc .btn-primary[disabled].focus, #jsxc_webrtc .btn-primary[disabled]:active, #jsxc_webrtc .btn-primary[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-primary, fieldset[disabled] #jsxc_webrtc .btn-primary:hover, fieldset[disabled] #jsxc_webrtc .btn-primary:focus, @@ -1549,55 +1208,23 @@ color: #fff; background-color: #5cb85c; border-color: #4cae4c; } - #jsxc_dialog .btn-success:hover, - #jsxc_dialog .btn-success:focus, - #jsxc_dialog .btn-success.focus, - #jsxc_dialog .btn-success:active, - #jsxc_dialog .btn-success.active, - .open > #jsxc_dialog .btn-success.dropdown-toggle, #jsxc_webrtc .btn-success:hover, - #jsxc_webrtc .btn-success:focus, - #jsxc_webrtc .btn-success.focus, - #jsxc_webrtc .btn-success:active, - #jsxc_webrtc .btn-success.active, + #jsxc_dialog .btn-success:hover, #jsxc_dialog .btn-success:focus, #jsxc_dialog .btn-success.focus, #jsxc_dialog .btn-success:active, #jsxc_dialog .btn-success.active, + .open > #jsxc_dialog .btn-success.dropdown-toggle, #jsxc_webrtc .btn-success:hover, #jsxc_webrtc .btn-success:focus, #jsxc_webrtc .btn-success.focus, #jsxc_webrtc .btn-success:active, #jsxc_webrtc .btn-success.active, .open > #jsxc_webrtc .btn-success.dropdown-toggle { color: #fff; background-color: #449d44; border-color: #398439; } - #jsxc_dialog .btn-success:active, - #jsxc_dialog .btn-success.active, - .open > #jsxc_dialog .btn-success.dropdown-toggle, #jsxc_webrtc .btn-success:active, - #jsxc_webrtc .btn-success.active, + #jsxc_dialog .btn-success:active, #jsxc_dialog .btn-success.active, + .open > #jsxc_dialog .btn-success.dropdown-toggle, #jsxc_webrtc .btn-success:active, #jsxc_webrtc .btn-success.active, .open > #jsxc_webrtc .btn-success.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-success.disabled, - #jsxc_dialog .btn-success.disabled:hover, - #jsxc_dialog .btn-success.disabled:focus, - #jsxc_dialog .btn-success.disabled.focus, - #jsxc_dialog .btn-success.disabled:active, - #jsxc_dialog .btn-success.disabled.active, - #jsxc_dialog .btn-success[disabled], - #jsxc_dialog .btn-success[disabled]:hover, - #jsxc_dialog .btn-success[disabled]:focus, - #jsxc_dialog .btn-success[disabled].focus, - #jsxc_dialog .btn-success[disabled]:active, - #jsxc_dialog .btn-success[disabled].active, + #jsxc_dialog .btn-success.disabled, #jsxc_dialog .btn-success.disabled:hover, #jsxc_dialog .btn-success.disabled:focus, #jsxc_dialog .btn-success.disabled.focus, #jsxc_dialog .btn-success.disabled:active, #jsxc_dialog .btn-success.disabled.active, #jsxc_dialog .btn-success[disabled], #jsxc_dialog .btn-success[disabled]:hover, #jsxc_dialog .btn-success[disabled]:focus, #jsxc_dialog .btn-success[disabled].focus, #jsxc_dialog .btn-success[disabled]:active, #jsxc_dialog .btn-success[disabled].active, fieldset[disabled] #jsxc_dialog .btn-success, fieldset[disabled] #jsxc_dialog .btn-success:hover, fieldset[disabled] #jsxc_dialog .btn-success:focus, fieldset[disabled] #jsxc_dialog .btn-success.focus, fieldset[disabled] #jsxc_dialog .btn-success:active, - fieldset[disabled] #jsxc_dialog .btn-success.active, #jsxc_webrtc .btn-success.disabled, - #jsxc_webrtc .btn-success.disabled:hover, - #jsxc_webrtc .btn-success.disabled:focus, - #jsxc_webrtc .btn-success.disabled.focus, - #jsxc_webrtc .btn-success.disabled:active, - #jsxc_webrtc .btn-success.disabled.active, - #jsxc_webrtc .btn-success[disabled], - #jsxc_webrtc .btn-success[disabled]:hover, - #jsxc_webrtc .btn-success[disabled]:focus, - #jsxc_webrtc .btn-success[disabled].focus, - #jsxc_webrtc .btn-success[disabled]:active, - #jsxc_webrtc .btn-success[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-success.active, #jsxc_webrtc .btn-success.disabled, #jsxc_webrtc .btn-success.disabled:hover, #jsxc_webrtc .btn-success.disabled:focus, #jsxc_webrtc .btn-success.disabled.focus, #jsxc_webrtc .btn-success.disabled:active, #jsxc_webrtc .btn-success.disabled.active, #jsxc_webrtc .btn-success[disabled], #jsxc_webrtc .btn-success[disabled]:hover, #jsxc_webrtc .btn-success[disabled]:focus, #jsxc_webrtc .btn-success[disabled].focus, #jsxc_webrtc .btn-success[disabled]:active, #jsxc_webrtc .btn-success[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-success, fieldset[disabled] #jsxc_webrtc .btn-success:hover, fieldset[disabled] #jsxc_webrtc .btn-success:focus, @@ -1614,55 +1241,23 @@ color: #fff; background-color: #5bc0de; border-color: #46b8da; } - #jsxc_dialog .btn-info:hover, - #jsxc_dialog .btn-info:focus, - #jsxc_dialog .btn-info.focus, - #jsxc_dialog .btn-info:active, - #jsxc_dialog .btn-info.active, - .open > #jsxc_dialog .btn-info.dropdown-toggle, #jsxc_webrtc .btn-info:hover, - #jsxc_webrtc .btn-info:focus, - #jsxc_webrtc .btn-info.focus, - #jsxc_webrtc .btn-info:active, - #jsxc_webrtc .btn-info.active, + #jsxc_dialog .btn-info:hover, #jsxc_dialog .btn-info:focus, #jsxc_dialog .btn-info.focus, #jsxc_dialog .btn-info:active, #jsxc_dialog .btn-info.active, + .open > #jsxc_dialog .btn-info.dropdown-toggle, #jsxc_webrtc .btn-info:hover, #jsxc_webrtc .btn-info:focus, #jsxc_webrtc .btn-info.focus, #jsxc_webrtc .btn-info:active, #jsxc_webrtc .btn-info.active, .open > #jsxc_webrtc .btn-info.dropdown-toggle { color: #fff; background-color: #31b0d5; border-color: #269abc; } - #jsxc_dialog .btn-info:active, - #jsxc_dialog .btn-info.active, - .open > #jsxc_dialog .btn-info.dropdown-toggle, #jsxc_webrtc .btn-info:active, - #jsxc_webrtc .btn-info.active, + #jsxc_dialog .btn-info:active, #jsxc_dialog .btn-info.active, + .open > #jsxc_dialog .btn-info.dropdown-toggle, #jsxc_webrtc .btn-info:active, #jsxc_webrtc .btn-info.active, .open > #jsxc_webrtc .btn-info.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-info.disabled, - #jsxc_dialog .btn-info.disabled:hover, - #jsxc_dialog .btn-info.disabled:focus, - #jsxc_dialog .btn-info.disabled.focus, - #jsxc_dialog .btn-info.disabled:active, - #jsxc_dialog .btn-info.disabled.active, - #jsxc_dialog .btn-info[disabled], - #jsxc_dialog .btn-info[disabled]:hover, - #jsxc_dialog .btn-info[disabled]:focus, - #jsxc_dialog .btn-info[disabled].focus, - #jsxc_dialog .btn-info[disabled]:active, - #jsxc_dialog .btn-info[disabled].active, + #jsxc_dialog .btn-info.disabled, #jsxc_dialog .btn-info.disabled:hover, #jsxc_dialog .btn-info.disabled:focus, #jsxc_dialog .btn-info.disabled.focus, #jsxc_dialog .btn-info.disabled:active, #jsxc_dialog .btn-info.disabled.active, #jsxc_dialog .btn-info[disabled], #jsxc_dialog .btn-info[disabled]:hover, #jsxc_dialog .btn-info[disabled]:focus, #jsxc_dialog .btn-info[disabled].focus, #jsxc_dialog .btn-info[disabled]:active, #jsxc_dialog .btn-info[disabled].active, fieldset[disabled] #jsxc_dialog .btn-info, fieldset[disabled] #jsxc_dialog .btn-info:hover, fieldset[disabled] #jsxc_dialog .btn-info:focus, fieldset[disabled] #jsxc_dialog .btn-info.focus, fieldset[disabled] #jsxc_dialog .btn-info:active, - fieldset[disabled] #jsxc_dialog .btn-info.active, #jsxc_webrtc .btn-info.disabled, - #jsxc_webrtc .btn-info.disabled:hover, - #jsxc_webrtc .btn-info.disabled:focus, - #jsxc_webrtc .btn-info.disabled.focus, - #jsxc_webrtc .btn-info.disabled:active, - #jsxc_webrtc .btn-info.disabled.active, - #jsxc_webrtc .btn-info[disabled], - #jsxc_webrtc .btn-info[disabled]:hover, - #jsxc_webrtc .btn-info[disabled]:focus, - #jsxc_webrtc .btn-info[disabled].focus, - #jsxc_webrtc .btn-info[disabled]:active, - #jsxc_webrtc .btn-info[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-info.active, #jsxc_webrtc .btn-info.disabled, #jsxc_webrtc .btn-info.disabled:hover, #jsxc_webrtc .btn-info.disabled:focus, #jsxc_webrtc .btn-info.disabled.focus, #jsxc_webrtc .btn-info.disabled:active, #jsxc_webrtc .btn-info.disabled.active, #jsxc_webrtc .btn-info[disabled], #jsxc_webrtc .btn-info[disabled]:hover, #jsxc_webrtc .btn-info[disabled]:focus, #jsxc_webrtc .btn-info[disabled].focus, #jsxc_webrtc .btn-info[disabled]:active, #jsxc_webrtc .btn-info[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-info, fieldset[disabled] #jsxc_webrtc .btn-info:hover, fieldset[disabled] #jsxc_webrtc .btn-info:focus, @@ -1679,55 +1274,23 @@ color: #fff; background-color: #f0ad4e; border-color: #eea236; } - #jsxc_dialog .btn-warning:hover, - #jsxc_dialog .btn-warning:focus, - #jsxc_dialog .btn-warning.focus, - #jsxc_dialog .btn-warning:active, - #jsxc_dialog .btn-warning.active, - .open > #jsxc_dialog .btn-warning.dropdown-toggle, #jsxc_webrtc .btn-warning:hover, - #jsxc_webrtc .btn-warning:focus, - #jsxc_webrtc .btn-warning.focus, - #jsxc_webrtc .btn-warning:active, - #jsxc_webrtc .btn-warning.active, + #jsxc_dialog .btn-warning:hover, #jsxc_dialog .btn-warning:focus, #jsxc_dialog .btn-warning.focus, #jsxc_dialog .btn-warning:active, #jsxc_dialog .btn-warning.active, + .open > #jsxc_dialog .btn-warning.dropdown-toggle, #jsxc_webrtc .btn-warning:hover, #jsxc_webrtc .btn-warning:focus, #jsxc_webrtc .btn-warning.focus, #jsxc_webrtc .btn-warning:active, #jsxc_webrtc .btn-warning.active, .open > #jsxc_webrtc .btn-warning.dropdown-toggle { color: #fff; background-color: #ec971f; border-color: #d58512; } - #jsxc_dialog .btn-warning:active, - #jsxc_dialog .btn-warning.active, - .open > #jsxc_dialog .btn-warning.dropdown-toggle, #jsxc_webrtc .btn-warning:active, - #jsxc_webrtc .btn-warning.active, + #jsxc_dialog .btn-warning:active, #jsxc_dialog .btn-warning.active, + .open > #jsxc_dialog .btn-warning.dropdown-toggle, #jsxc_webrtc .btn-warning:active, #jsxc_webrtc .btn-warning.active, .open > #jsxc_webrtc .btn-warning.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-warning.disabled, - #jsxc_dialog .btn-warning.disabled:hover, - #jsxc_dialog .btn-warning.disabled:focus, - #jsxc_dialog .btn-warning.disabled.focus, - #jsxc_dialog .btn-warning.disabled:active, - #jsxc_dialog .btn-warning.disabled.active, - #jsxc_dialog .btn-warning[disabled], - #jsxc_dialog .btn-warning[disabled]:hover, - #jsxc_dialog .btn-warning[disabled]:focus, - #jsxc_dialog .btn-warning[disabled].focus, - #jsxc_dialog .btn-warning[disabled]:active, - #jsxc_dialog .btn-warning[disabled].active, + #jsxc_dialog .btn-warning.disabled, #jsxc_dialog .btn-warning.disabled:hover, #jsxc_dialog .btn-warning.disabled:focus, #jsxc_dialog .btn-warning.disabled.focus, #jsxc_dialog .btn-warning.disabled:active, #jsxc_dialog .btn-warning.disabled.active, #jsxc_dialog .btn-warning[disabled], #jsxc_dialog .btn-warning[disabled]:hover, #jsxc_dialog .btn-warning[disabled]:focus, #jsxc_dialog .btn-warning[disabled].focus, #jsxc_dialog .btn-warning[disabled]:active, #jsxc_dialog .btn-warning[disabled].active, fieldset[disabled] #jsxc_dialog .btn-warning, fieldset[disabled] #jsxc_dialog .btn-warning:hover, fieldset[disabled] #jsxc_dialog .btn-warning:focus, fieldset[disabled] #jsxc_dialog .btn-warning.focus, fieldset[disabled] #jsxc_dialog .btn-warning:active, - fieldset[disabled] #jsxc_dialog .btn-warning.active, #jsxc_webrtc .btn-warning.disabled, - #jsxc_webrtc .btn-warning.disabled:hover, - #jsxc_webrtc .btn-warning.disabled:focus, - #jsxc_webrtc .btn-warning.disabled.focus, - #jsxc_webrtc .btn-warning.disabled:active, - #jsxc_webrtc .btn-warning.disabled.active, - #jsxc_webrtc .btn-warning[disabled], - #jsxc_webrtc .btn-warning[disabled]:hover, - #jsxc_webrtc .btn-warning[disabled]:focus, - #jsxc_webrtc .btn-warning[disabled].focus, - #jsxc_webrtc .btn-warning[disabled]:active, - #jsxc_webrtc .btn-warning[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-warning.active, #jsxc_webrtc .btn-warning.disabled, #jsxc_webrtc .btn-warning.disabled:hover, #jsxc_webrtc .btn-warning.disabled:focus, #jsxc_webrtc .btn-warning.disabled.focus, #jsxc_webrtc .btn-warning.disabled:active, #jsxc_webrtc .btn-warning.disabled.active, #jsxc_webrtc .btn-warning[disabled], #jsxc_webrtc .btn-warning[disabled]:hover, #jsxc_webrtc .btn-warning[disabled]:focus, #jsxc_webrtc .btn-warning[disabled].focus, #jsxc_webrtc .btn-warning[disabled]:active, #jsxc_webrtc .btn-warning[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-warning, fieldset[disabled] #jsxc_webrtc .btn-warning:hover, fieldset[disabled] #jsxc_webrtc .btn-warning:focus, @@ -1744,55 +1307,23 @@ color: #fff; background-color: #d9534f; border-color: #d43f3a; } - #jsxc_dialog .btn-danger:hover, - #jsxc_dialog .btn-danger:focus, - #jsxc_dialog .btn-danger.focus, - #jsxc_dialog .btn-danger:active, - #jsxc_dialog .btn-danger.active, - .open > #jsxc_dialog .btn-danger.dropdown-toggle, #jsxc_webrtc .btn-danger:hover, - #jsxc_webrtc .btn-danger:focus, - #jsxc_webrtc .btn-danger.focus, - #jsxc_webrtc .btn-danger:active, - #jsxc_webrtc .btn-danger.active, + #jsxc_dialog .btn-danger:hover, #jsxc_dialog .btn-danger:focus, #jsxc_dialog .btn-danger.focus, #jsxc_dialog .btn-danger:active, #jsxc_dialog .btn-danger.active, + .open > #jsxc_dialog .btn-danger.dropdown-toggle, #jsxc_webrtc .btn-danger:hover, #jsxc_webrtc .btn-danger:focus, #jsxc_webrtc .btn-danger.focus, #jsxc_webrtc .btn-danger:active, #jsxc_webrtc .btn-danger.active, .open > #jsxc_webrtc .btn-danger.dropdown-toggle { color: #fff; background-color: #c9302c; border-color: #ac2925; } - #jsxc_dialog .btn-danger:active, - #jsxc_dialog .btn-danger.active, - .open > #jsxc_dialog .btn-danger.dropdown-toggle, #jsxc_webrtc .btn-danger:active, - #jsxc_webrtc .btn-danger.active, + #jsxc_dialog .btn-danger:active, #jsxc_dialog .btn-danger.active, + .open > #jsxc_dialog .btn-danger.dropdown-toggle, #jsxc_webrtc .btn-danger:active, #jsxc_webrtc .btn-danger.active, .open > #jsxc_webrtc .btn-danger.dropdown-toggle { background-image: none; } - #jsxc_dialog .btn-danger.disabled, - #jsxc_dialog .btn-danger.disabled:hover, - #jsxc_dialog .btn-danger.disabled:focus, - #jsxc_dialog .btn-danger.disabled.focus, - #jsxc_dialog .btn-danger.disabled:active, - #jsxc_dialog .btn-danger.disabled.active, - #jsxc_dialog .btn-danger[disabled], - #jsxc_dialog .btn-danger[disabled]:hover, - #jsxc_dialog .btn-danger[disabled]:focus, - #jsxc_dialog .btn-danger[disabled].focus, - #jsxc_dialog .btn-danger[disabled]:active, - #jsxc_dialog .btn-danger[disabled].active, + #jsxc_dialog .btn-danger.disabled, #jsxc_dialog .btn-danger.disabled:hover, #jsxc_dialog .btn-danger.disabled:focus, #jsxc_dialog .btn-danger.disabled.focus, #jsxc_dialog .btn-danger.disabled:active, #jsxc_dialog .btn-danger.disabled.active, #jsxc_dialog .btn-danger[disabled], #jsxc_dialog .btn-danger[disabled]:hover, #jsxc_dialog .btn-danger[disabled]:focus, #jsxc_dialog .btn-danger[disabled].focus, #jsxc_dialog .btn-danger[disabled]:active, #jsxc_dialog .btn-danger[disabled].active, fieldset[disabled] #jsxc_dialog .btn-danger, fieldset[disabled] #jsxc_dialog .btn-danger:hover, fieldset[disabled] #jsxc_dialog .btn-danger:focus, fieldset[disabled] #jsxc_dialog .btn-danger.focus, fieldset[disabled] #jsxc_dialog .btn-danger:active, - fieldset[disabled] #jsxc_dialog .btn-danger.active, #jsxc_webrtc .btn-danger.disabled, - #jsxc_webrtc .btn-danger.disabled:hover, - #jsxc_webrtc .btn-danger.disabled:focus, - #jsxc_webrtc .btn-danger.disabled.focus, - #jsxc_webrtc .btn-danger.disabled:active, - #jsxc_webrtc .btn-danger.disabled.active, - #jsxc_webrtc .btn-danger[disabled], - #jsxc_webrtc .btn-danger[disabled]:hover, - #jsxc_webrtc .btn-danger[disabled]:focus, - #jsxc_webrtc .btn-danger[disabled].focus, - #jsxc_webrtc .btn-danger[disabled]:active, - #jsxc_webrtc .btn-danger[disabled].active, + fieldset[disabled] #jsxc_dialog .btn-danger.active, #jsxc_webrtc .btn-danger.disabled, #jsxc_webrtc .btn-danger.disabled:hover, #jsxc_webrtc .btn-danger.disabled:focus, #jsxc_webrtc .btn-danger.disabled.focus, #jsxc_webrtc .btn-danger.disabled:active, #jsxc_webrtc .btn-danger.disabled.active, #jsxc_webrtc .btn-danger[disabled], #jsxc_webrtc .btn-danger[disabled]:hover, #jsxc_webrtc .btn-danger[disabled]:focus, #jsxc_webrtc .btn-danger[disabled].focus, #jsxc_webrtc .btn-danger[disabled]:active, #jsxc_webrtc .btn-danger[disabled].active, fieldset[disabled] #jsxc_webrtc .btn-danger, fieldset[disabled] #jsxc_webrtc .btn-danger:hover, fieldset[disabled] #jsxc_webrtc .btn-danger:focus, @@ -1809,36 +1340,20 @@ color: #337ab7; font-weight: normal; border-radius: 0; } - #jsxc_dialog .btn-link, - #jsxc_dialog .btn-link:active, - #jsxc_dialog .btn-link.active, - #jsxc_dialog .btn-link[disabled], - fieldset[disabled] #jsxc_dialog .btn-link, #jsxc_webrtc .btn-link, - #jsxc_webrtc .btn-link:active, - #jsxc_webrtc .btn-link.active, - #jsxc_webrtc .btn-link[disabled], + #jsxc_dialog .btn-link, #jsxc_dialog .btn-link:active, #jsxc_dialog .btn-link.active, #jsxc_dialog .btn-link[disabled], + fieldset[disabled] #jsxc_dialog .btn-link, #jsxc_webrtc .btn-link, #jsxc_webrtc .btn-link:active, #jsxc_webrtc .btn-link.active, #jsxc_webrtc .btn-link[disabled], fieldset[disabled] #jsxc_webrtc .btn-link { background-color: transparent; box-shadow: none; } - #jsxc_dialog .btn-link, - #jsxc_dialog .btn-link:hover, - #jsxc_dialog .btn-link:focus, - #jsxc_dialog .btn-link:active, #jsxc_webrtc .btn-link, - #jsxc_webrtc .btn-link:hover, - #jsxc_webrtc .btn-link:focus, - #jsxc_webrtc .btn-link:active { + #jsxc_dialog .btn-link, #jsxc_dialog .btn-link:hover, #jsxc_dialog .btn-link:focus, #jsxc_dialog .btn-link:active, #jsxc_webrtc .btn-link, #jsxc_webrtc .btn-link:hover, #jsxc_webrtc .btn-link:focus, #jsxc_webrtc .btn-link:active { border-color: transparent; } - #jsxc_dialog .btn-link:hover, - #jsxc_dialog .btn-link:focus, #jsxc_webrtc .btn-link:hover, - #jsxc_webrtc .btn-link:focus { + #jsxc_dialog .btn-link:hover, #jsxc_dialog .btn-link:focus, #jsxc_webrtc .btn-link:hover, #jsxc_webrtc .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } - #jsxc_dialog .btn-link[disabled]:hover, - #jsxc_dialog .btn-link[disabled]:focus, + #jsxc_dialog .btn-link[disabled]:hover, #jsxc_dialog .btn-link[disabled]:focus, fieldset[disabled] #jsxc_dialog .btn-link:hover, - fieldset[disabled] #jsxc_dialog .btn-link:focus, #jsxc_webrtc .btn-link[disabled]:hover, - #jsxc_webrtc .btn-link[disabled]:focus, + fieldset[disabled] #jsxc_dialog .btn-link:focus, #jsxc_webrtc .btn-link[disabled]:hover, #jsxc_webrtc .btn-link[disabled]:focus, fieldset[disabled] #jsxc_webrtc .btn-link:hover, fieldset[disabled] #jsxc_webrtc .btn-link:focus { color: #777777; @@ -1887,17 +1402,11 @@ #jsxc_webrtc .btn-group-vertical > .btn { position: relative; float: left; } - #jsxc_dialog .btn-group > .btn:hover, - #jsxc_dialog .btn-group > .btn:focus, - #jsxc_dialog .btn-group > .btn:active, - #jsxc_dialog .btn-group > .btn.active, + #jsxc_dialog .btn-group > .btn:hover, #jsxc_dialog .btn-group > .btn:focus, #jsxc_dialog .btn-group > .btn:active, #jsxc_dialog .btn-group > .btn.active, #jsxc_dialog .btn-group-vertical > .btn:hover, #jsxc_dialog .btn-group-vertical > .btn:focus, #jsxc_dialog .btn-group-vertical > .btn:active, - #jsxc_dialog .btn-group-vertical > .btn.active, #jsxc_webrtc .btn-group > .btn:hover, - #jsxc_webrtc .btn-group > .btn:focus, - #jsxc_webrtc .btn-group > .btn:active, - #jsxc_webrtc .btn-group > .btn.active, + #jsxc_dialog .btn-group-vertical > .btn.active, #jsxc_webrtc .btn-group > .btn:hover, #jsxc_webrtc .btn-group > .btn:focus, #jsxc_webrtc .btn-group > .btn:active, #jsxc_webrtc .btn-group > .btn.active, #jsxc_webrtc .btn-group-vertical > .btn:hover, #jsxc_webrtc .btn-group-vertical > .btn:focus, #jsxc_webrtc .btn-group-vertical > .btn:active, @@ -1915,9 +1424,7 @@ #jsxc_dialog .btn-toolbar, #jsxc_webrtc .btn-toolbar { margin-left: -5px; } - #jsxc_dialog .btn-toolbar:before, - #jsxc_dialog .btn-toolbar:after, #jsxc_webrtc .btn-toolbar:before, - #jsxc_webrtc .btn-toolbar:after { + #jsxc_dialog .btn-toolbar:before, #jsxc_dialog .btn-toolbar:after, #jsxc_webrtc .btn-toolbar:before, #jsxc_webrtc .btn-toolbar:after { content: " "; display: table; } #jsxc_dialog .btn-toolbar:after, #jsxc_webrtc .btn-toolbar:after { @@ -2002,9 +1509,7 @@ width: 100%; max-width: 100%; } -#jsxc_dialog .btn-group-vertical > .btn-group:before, -#jsxc_dialog .btn-group-vertical > .btn-group:after, #jsxc_webrtc .btn-group-vertical > .btn-group:before, -#jsxc_webrtc .btn-group-vertical > .btn-group:after { +#jsxc_dialog .btn-group-vertical > .btn-group:before, #jsxc_dialog .btn-group-vertical > .btn-group:after, #jsxc_webrtc .btn-group-vertical > .btn-group:before, #jsxc_webrtc .btn-group-vertical > .btn-group:after { content: " "; display: table; } @@ -2151,7 +1656,6 @@ border: 1px solid #ccc; border-radius: 4px; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } #jsxc_dialog .form-control:focus, #jsxc_webrtc .form-control:focus { border-color: #66afe9; @@ -2164,10 +1668,8 @@ color: #999; } #jsxc_dialog .form-control::-webkit-input-placeholder, #jsxc_webrtc .form-control::-webkit-input-placeholder { color: #999; } - #jsxc_dialog .form-control[disabled], - #jsxc_dialog .form-control[readonly], - fieldset[disabled] #jsxc_dialog .form-control, #jsxc_webrtc .form-control[disabled], - #jsxc_webrtc .form-control[readonly], + #jsxc_dialog .form-control[disabled], #jsxc_dialog .form-control[readonly], + fieldset[disabled] #jsxc_dialog .form-control, #jsxc_webrtc .form-control[disabled], #jsxc_webrtc .form-control[readonly], fieldset[disabled] #jsxc_webrtc .form-control { background-color: #eeeeee; opacity: 1; } @@ -2194,34 +1696,46 @@ #jsxc_dialog input[type="date"].input-sm, .input-group-sm #jsxc_dialog input[type="date"], #jsxc_dialog input[type="time"].input-sm, - .input-group-sm #jsxc_dialog input[type="time"], + .input-group-sm + #jsxc_dialog input[type="time"], #jsxc_dialog input[type="datetime-local"].input-sm, - .input-group-sm #jsxc_dialog input[type="datetime-local"], + .input-group-sm + #jsxc_dialog input[type="datetime-local"], #jsxc_dialog input[type="month"].input-sm, - .input-group-sm #jsxc_dialog input[type="month"], #jsxc_webrtc input[type="date"].input-sm, + .input-group-sm + #jsxc_dialog input[type="month"], #jsxc_webrtc input[type="date"].input-sm, .input-group-sm #jsxc_webrtc input[type="date"], #jsxc_webrtc input[type="time"].input-sm, - .input-group-sm #jsxc_webrtc input[type="time"], + .input-group-sm + #jsxc_webrtc input[type="time"], #jsxc_webrtc input[type="datetime-local"].input-sm, - .input-group-sm #jsxc_webrtc input[type="datetime-local"], + .input-group-sm + #jsxc_webrtc input[type="datetime-local"], #jsxc_webrtc input[type="month"].input-sm, - .input-group-sm #jsxc_webrtc input[type="month"] { + .input-group-sm + #jsxc_webrtc input[type="month"] { line-height: 30px; } #jsxc_dialog input[type="date"].input-lg, .input-group-lg #jsxc_dialog input[type="date"], #jsxc_dialog input[type="time"].input-lg, - .input-group-lg #jsxc_dialog input[type="time"], + .input-group-lg + #jsxc_dialog input[type="time"], #jsxc_dialog input[type="datetime-local"].input-lg, - .input-group-lg #jsxc_dialog input[type="datetime-local"], + .input-group-lg + #jsxc_dialog input[type="datetime-local"], #jsxc_dialog input[type="month"].input-lg, - .input-group-lg #jsxc_dialog input[type="month"], #jsxc_webrtc input[type="date"].input-lg, + .input-group-lg + #jsxc_dialog input[type="month"], #jsxc_webrtc input[type="date"].input-lg, .input-group-lg #jsxc_webrtc input[type="date"], #jsxc_webrtc input[type="time"].input-lg, - .input-group-lg #jsxc_webrtc input[type="time"], + .input-group-lg + #jsxc_webrtc input[type="time"], #jsxc_webrtc input[type="datetime-local"].input-lg, - .input-group-lg #jsxc_webrtc input[type="datetime-local"], + .input-group-lg + #jsxc_webrtc input[type="datetime-local"], #jsxc_webrtc input[type="month"].input-lg, - .input-group-lg #jsxc_webrtc input[type="month"] { + .input-group-lg + #jsxc_webrtc input[type="month"] { line-height: 46px; } } #jsxc_dialog .form-group, #jsxc_webrtc .form-group { @@ -2276,35 +1790,39 @@ margin-top: 0; margin-left: 10px; } -#jsxc_dialog input[type="radio"][disabled], -#jsxc_dialog input[type="radio"].disabled, +#jsxc_dialog input[type="radio"][disabled], #jsxc_dialog input[type="radio"].disabled, fieldset[disabled] #jsxc_dialog input[type="radio"], #jsxc_dialog input[type="checkbox"][disabled], #jsxc_dialog input[type="checkbox"].disabled, -fieldset[disabled] #jsxc_dialog input[type="checkbox"], #jsxc_webrtc input[type="radio"][disabled], -#jsxc_webrtc input[type="radio"].disabled, +fieldset[disabled] +#jsxc_dialog input[type="checkbox"], #jsxc_webrtc input[type="radio"][disabled], #jsxc_webrtc input[type="radio"].disabled, fieldset[disabled] #jsxc_webrtc input[type="radio"], #jsxc_webrtc input[type="checkbox"][disabled], #jsxc_webrtc input[type="checkbox"].disabled, -fieldset[disabled] #jsxc_webrtc input[type="checkbox"] { +fieldset[disabled] +#jsxc_webrtc input[type="checkbox"] { cursor: not-allowed; } #jsxc_dialog .radio-inline.disabled, fieldset[disabled] #jsxc_dialog .radio-inline, #jsxc_dialog .checkbox-inline.disabled, -fieldset[disabled] #jsxc_dialog .checkbox-inline, #jsxc_webrtc .radio-inline.disabled, +fieldset[disabled] +#jsxc_dialog .checkbox-inline, #jsxc_webrtc .radio-inline.disabled, fieldset[disabled] #jsxc_webrtc .radio-inline, #jsxc_webrtc .checkbox-inline.disabled, -fieldset[disabled] #jsxc_webrtc .checkbox-inline { +fieldset[disabled] +#jsxc_webrtc .checkbox-inline { cursor: not-allowed; } #jsxc_dialog .radio.disabled label, fieldset[disabled] #jsxc_dialog .radio label, #jsxc_dialog .checkbox.disabled label, -fieldset[disabled] #jsxc_dialog .checkbox label, #jsxc_webrtc .radio.disabled label, +fieldset[disabled] +#jsxc_dialog .checkbox label, #jsxc_webrtc .radio.disabled label, fieldset[disabled] #jsxc_webrtc .radio label, #jsxc_webrtc .checkbox.disabled label, -fieldset[disabled] #jsxc_webrtc .checkbox label { +fieldset[disabled] +#jsxc_webrtc .checkbox label { cursor: not-allowed; } #jsxc_dialog .form-control-static, #jsxc_webrtc .form-control-static { @@ -2312,9 +1830,7 @@ padding-bottom: 7px; margin-bottom: 0; min-height: 34px; } - #jsxc_dialog .form-control-static.input-lg, - #jsxc_dialog .form-control-static.input-sm, #jsxc_webrtc .form-control-static.input-lg, - #jsxc_webrtc .form-control-static.input-sm { + #jsxc_dialog .form-control-static.input-lg, #jsxc_dialog .form-control-static.input-sm, #jsxc_webrtc .form-control-static.input-lg, #jsxc_webrtc .form-control-static.input-sm { padding-left: 0; padding-right: 0; } @@ -2606,9 +2122,7 @@ #jsxc_dialog .form-horizontal .form-group, #jsxc_webrtc .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } - #jsxc_dialog .form-horizontal .form-group:before, - #jsxc_dialog .form-horizontal .form-group:after, #jsxc_webrtc .form-horizontal .form-group:before, - #jsxc_webrtc .form-horizontal .form-group:after { + #jsxc_dialog .form-horizontal .form-group:before, #jsxc_dialog .form-horizontal .form-group:after, #jsxc_webrtc .form-horizontal .form-group:before, #jsxc_webrtc .form-horizontal .form-group:after { content: " "; display: table; } #jsxc_dialog .form-horizontal .form-group:after, #jsxc_webrtc .form-horizontal .form-group:after { @@ -2632,7 +2146,13 @@ padding-top: 6px; } } #jsxc_dialog .progress, #jsxc_webrtc .progress { - margin-bottom: 0px; } + margin-bottom: 0; } + #jsxc_dialog .progress .progress-bar, #jsxc_webrtc .progress .progress-bar { + width: 100%; } + +#jsxc_dialog .mfp-close, #jsxc_webrtc .mfp-close { + font-size: 23px; + font-weight: normal; } .mfp-bg { z-index: 9000; } @@ -2643,78 +2163,41 @@ .mfp-content { text-align: center; } -#jsxc_dialog .mfp-close { - font-size: 23px; } - -/* END: bootstrap */ -@-webkit-keyframes bounce { - 0% { - bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } - 12% { - bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - 25% { - bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } - 37% { - bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - 50% { - bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } - 100% { - bottom: 0; } } @keyframes bounce { 0% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 12% { bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } + animation-timing-function: ease-out; } 25% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 37% { bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } + animation-timing-function: ease-out; } 50% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 100% { bottom: 0; } } @keyframes bounce { 0% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 12% { bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } + animation-timing-function: ease-out; } 25% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 37% { bottom: 5px; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; } + animation-timing-function: ease-out; } 50% { bottom: 0; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; } + animation-timing-function: ease-in; } 100% { bottom: 0; } } @@ -2725,7 +2208,7 @@ width: 204px; z-index: 85; } #jsxc_buddylist .jsxc_unreadMsg .jsxc_name { - padding-right: 0px; } + padding-right: 0; } #jsxc_buddylist .jsxc_oneway .jsxc_avatar, #jsxc_buddylist .jsxc_oneway .jsxc_caption { opacity: 0.7; } #jsxc_buddylist .jsxc_right { @@ -2738,7 +2221,7 @@ line-height: 20px; color: #fff; } #jsxc_buddylist .jsxc_right div:hover { - opacity: 1.0; } + opacity: 1; } #jsxc_buddylist .jsxc_more { margin-right: 6px; z-index: 10; @@ -2763,7 +2246,7 @@ display: none; } .jsxc_online:before, .jsxc_chat:before, .jsxc_away:before, .jsxc_xa:before, .jsxc_dnd:before { - content: ' '; + content: " "; display: block; width: 12px; height: 12px; @@ -2810,6 +2293,10 @@ border: 0; vertical-align: bottom; } +#jsxc_roster .jsxc_emoticon.jsxc_large { + width: 19px; + height: 19px; } + .jsxc_angel { background: url('../img/emotions/angel.png'); } @@ -2881,14 +2368,13 @@ #jsxc_roster { position: fixed; - top: 0px; + top: 0; bottom: 0; right: 0; width: 200px; overflow: visible; border-left: 1px solid #e1e1e1; display: none; - /*border-left: 1px solid $roster_border_left;*/ z-index: 80; margin-left: 10px; background-color: whitesmoke; } @@ -2930,7 +2416,7 @@ color: #333; padding: 10px; } #jsxc_roster p a { - color: #b3b3b3; + color: #b3b2b2; text-decoration: underline; } #jsxc_roster .jsxc_avatar { position: relative; @@ -2947,23 +2433,68 @@ #jsxc_roster.jsxc_state_hidden { display: block; right: -200px; - -webkit-transition: right 0.5s; - transition: right 0.5s; } + transition: right 0.5s; } #jsxc_roster.jsxc_state_hidden #jsxc_toggleRoster:before { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); } #jsxc_roster.jsxc_state_shown { display: block; - right: 0px; - -webkit-transition: right 0.5s; - transition: right 0.5s; } + right: 0; + transition: right 0.5s; } + #jsxc_roster > .jsxc_bottom { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + line-height: 34px; + background-color: #eeeeee; + z-index: 50; + padding-right: 4px; } + #jsxc_roster > .jsxc_bottom:hover { + background-color: #ddd; } + #jsxc_roster > .jsxc_bottom .jsxc_inner { + width: 100%; } + #jsxc_roster > .jsxc_bottom ul { + padding: 0; + margin: 0; + width: 100%; + border-top: 1px solid transparent; + background-color: #eeeeee; } + #jsxc_roster > .jsxc_bottom ul li:last-child { + border-bottom: 1px solid transparent; } + #jsxc_roster > .jsxc_bottom li { + height: 44px; + background-color: #eeeeee; + color: #000; + cursor: pointer; + width: 100%; + padding-left: 44px; + line-height: 44px; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background-repeat: no-repeat; + background-position: 15px center; + background-size: 16px 16px; + opacity: 0.8; } + #jsxc_roster > .jsxc_bottom li.jsxc_disabled { + color: #333333; + cursor: default; } + #jsxc_roster > .jsxc_bottom li:hover:not(.jsxc_disabled) { + color: #000; + background-color: #ddd; } + #jsxc_roster > .jsxc_bottom li.jsxc_warning { + background-color: #f5e876; } + #jsxc_roster > .jsxc_bottom li.jsxc_warning:hover { + background-color: #f2e35d; } + #jsxc_roster > .jsxc_bottom > div > span { + cursor: pointer; } #jsxc_toggleRoster { width: 14px; height: 100%; position: absolute; - left: -14px !important; + right: 100%; top: 0; z-index: 110; background-color: transparent; @@ -2971,18 +2502,16 @@ #jsxc_toggleRoster:hover { background-color: rgba(153, 153, 153, 0.5); } #jsxc_toggleRoster:before { - content: ''; + content: " "; position: absolute; display: block; width: 0; top: 50%; - right: 0px; + right: 0; border-style: solid; border-width: 6px 4px 6px 0; border-color: transparent whitesmoke; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); } + transform: rotate(180deg); } .jsxc_rosteritem { padding: 0; @@ -3016,7 +2545,6 @@ padding-right: 30px; height: 100%; line-height: 100%; - /*padding-top: 4px;*/ box-sizing: border-box; } .jsxc_caption * { cursor: pointer; } @@ -3063,57 +2591,6 @@ .jsxc_caption .jsxc_lastmsg .jsxc_emoticon { vertical-align: middle; } -#jsxc_roster > .jsxc_bottom { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - line-height: 34px; - background-color: #eeeeee; - z-index: 50; - padding-right: 4px; } - #jsxc_roster > .jsxc_bottom:hover { - background-color: #ddd; } - #jsxc_roster > .jsxc_bottom .jsxc_inner { - width: 100%; } - #jsxc_roster > .jsxc_bottom ul { - padding: 0; - margin: 0; - width: 100%; - border-top: 1px solid transparent; - background-color: #eeeeee; - margin: 0; } - #jsxc_roster > .jsxc_bottom ul li:last-child { - border-bottom: 1px solid transparent; } - #jsxc_roster > .jsxc_bottom li { - height: 44px; - background-color: #eeeeee; - color: #000; - cursor: pointer; - width: 100%; - padding-left: 44px; - line-height: 44px; - text-align: left; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - background-repeat: no-repeat; - background-position: 15px center; - background-size: 16px 16px; - opacity: 0.8; } - #jsxc_roster > .jsxc_bottom li.jsxc_disabled { - color: #333333; - cursor: default; } - #jsxc_roster > .jsxc_bottom li:hover:not(.jsxc_disabled) { - color: #000; - background-color: #ddd; } - -#jsxc_roster > .jsxc_bottom > div > span { - cursor: pointer; } - -#jsxc_roster > .jsxc_bottom > div:hover { - /*color: $roster_bottom_color_hover;*/ } - #jsxc_avatar { cursor: default !important; } @@ -3126,7 +2603,6 @@ #jsxc_presence li { position: relative; } #jsxc_presence li:before { - /** Presence indicator */ position: absolute; top: 50%; left: 10px; @@ -3168,8 +2644,7 @@ font-size: 80%; padding: 2px; position: relative; - -webkit-animation: bounce 2s 1s infinite; - animation: bounce 2s 1s infinite; } + animation: bounce 2s 1s infinite; } #jsxc_notice > span:empty { display: none; } @@ -3179,8 +2654,7 @@ right: 210px; left: 0; z-index: 50; - -webkit-transition: right 0.5s; - transition: right 0.5s; } + transition: right 0.5s; } #jsxc_windowList.jsxc_roster_hidden { right: 10px; } @media (min-width: 768px) { @@ -3196,8 +2670,7 @@ height: 44px; overflow: visible; white-space: nowrap; - -webkit-transition: right 0.5s; - transition: right 0.5s; } + transition: right 0.5s; } #jsxc_windowList > ul > li { padding: 0; margin: 0; @@ -3210,14 +2683,11 @@ cursor: pointer; white-space: normal; } #jsxc_windowList > ul > li.jsxc_normal { - -webkit-transition: width 0.2s; - transition: width 0.2s; + transition: width 0.2s; width: 250px; } #jsxc_windowList > ul > li.jsxc_min { - -webkit-transition: width 0.2s; - transition: width 0.2s; - width: 46px !important; - /* overwrite resizeable width */ } + transition: width 0.2s; + width: 46px !important; } @media (min-width: 768px) { #jsxc_windowList > ul > li.jsxc_min { width: 200px !important; } } @@ -3230,17 +2700,16 @@ position: fixed; left: 0; bottom: 0; - width: 30px; - height: 30px; } + width: 30px; } @media (max-width: 768px) { #jsxc_windowListSB { display: none; } } #jsxc_windowListSB > div { box-sizing: border-box; width: 14px; - height: 100%; + height: 30px; background-color: #cccccc; - color: gray; + color: #807f7f; text-align: center; line-height: 30px; float: left; @@ -3250,9 +2719,9 @@ -ms-user-select: none; user-select: none; } #jsxc_windowListSB > div:hover { - background-color: #b3b3b3; } + background-color: #b3b2b2; } #jsxc_windowListSB > .jsxc_disabled { - background-color: #e6e6e6 !important; + background-color: #e6e5e5 !important; color: #cccccc; cursor: default !important; display: none; } @@ -3288,11 +2757,9 @@ border: 1px solid #e1e1e1; border-bottom: 0; } .jsxc_min .jsxc_window { - -webkit-transition: bottom 0.2s; - transition: bottom 0.2s; } + transition: bottom 0.2s; } .jsxc_normal .jsxc_window { - -webkit-transition: bottom 0.2s; - transition: bottom 0.2s; } + transition: bottom 0.2s; } .jsxc_showOverlay .jsxc_window .jsxc_overlay { display: block !important; } .jsxc_window .jsxc_emoticons { @@ -3303,7 +2770,7 @@ left: 0; cursor: pointer; } .jsxc_window .jsxc_emoticons:after { - content: ' '; + content: " "; background-image: url('../img/smiley.svg'); background-position: center center; background-repeat: no-repeat; @@ -3326,7 +2793,7 @@ padding: 3px; position: relative; } .jsxc_window .jsxc_emoticons ul:after { - content: ''; + content: " "; position: absolute; border-left: 8px solid transparent; border-right: 8px solid transparent; @@ -3336,19 +2803,20 @@ z-index: 1; left: 7px; top: 100%; } - .jsxc_window .jsxc_emoticons li div { + .jsxc_window .jsxc_emoticons li span { float: left; cursor: pointer; border-radius: 3px; background-size: 30px 30px; width: 30px; height: 30px; } - .jsxc_window .jsxc_emoticons li div:hover { + .jsxc_window .jsxc_emoticons li span:hover { background-color: rgba(255, 255, 255, 0.8); } .jsxc_window .jsxc_emoticons:hover:after { opacity: 0.5; } .jsxc_window .jsxc_fade { - position: relative; } + position: relative; + overflow: hidden; } .jsxc_window .jsxc_fade .jsxc_overlay { display: none; background-color: rgba(0, 0, 0, 0.5); @@ -3373,7 +2841,7 @@ height: 44px; width: 44px; } .jsxc_window .jsxc_fade .jsxc_overlay > div .jsxc_close:after { - content: '×'; + content: "×"; position: absolute; top: 4px; right: 4px; @@ -3398,6 +2866,29 @@ text-overflow: ellipsis; } .jsxc_window .jsxc_fade .jsxc_overlay > div a:hover { text-decoration: underline; } + .jsxc_window .jsxc_fade .jsxc_mam-load-more { + display: none; + text-align: center; + font-size: 0.8em; + font-style: italic; + position: absolute; + top: -42px; + left: 0; + right: 0; + height: 42px; + cursor: pointer; + z-index: 80; + line-height: 42px; + opacity: 0; + transition: opacity 0.5s, top 0.5s; + background-image: linear-gradient(#c1c1c1, transparent); } + .jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show { + top: 0; + opacity: 0.7; } + .jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show:hover { + opacity: 1; } + .jsxc_window .jsxc_fade.jsxc_mam-enable .jsxc_mam-load-more { + display: block; } .jsxc_window .jsxc_avatar { margin-top: 1px; } .jsxc_window .jsxc_textarea { @@ -3405,30 +2896,32 @@ overflow: hidden; padding: 3px; } .jsxc_window .slimScrollDiv { - margin: 0 0 6px 0; + margin: 0 0 6px; left: auto !important; top: auto !important; } - .jsxc_window input.jsxc_textinput { + .jsxc_window textarea.jsxc_textinput { width: 100%; height: 44px; margin: 0; - padding: 3px; - padding-left: 40px; - padding-right: 40px; + padding: 14px 40px 12px; outline: none; border-radius: 0; box-sizing: border-box; - border: 0; } - .jsxc_window input::-webkit-input-placeholder { + border: 0; + display: block; + resize: none; + transition: height 0.5s; + font-size: 13px; } + .jsxc_window textarea::-webkit-input-placeholder { color: #000; opacity: 0.3; } - .jsxc_window input::-moz-placeholder { + .jsxc_window textarea::-moz-placeholder { color: #000; opacity: 0.3; } - .jsxc_window input:-ms-input-placeholder { + .jsxc_window textarea:-ms-input-placeholder { color: #000; opacity: 0.3; } - .jsxc_window input::placeholder { + .jsxc_window textarea::placeholder { color: #000; opacity: 0.3; } .jsxc_window .jsxc_tools { @@ -3448,12 +2941,12 @@ cursor: pointer; text-align: center; } .jsxc_window .jsxc_tools > div.jsxc_settings { - opacity: 1.0; } + opacity: 1; } .jsxc_window .jsxc_close { font-size: 20px; } .jsxc_window .jsxc_close:hover { color: #fff; - opacity: 1.0; } + opacity: 1; } .jsxc_window .jsxc_more { background-image: url('../img/more_white.svg'); opacity: 0.4; } @@ -3482,14 +2975,54 @@ position: relative; outline: none; clear: both; } + .jsxc_chatmessage.jsxc_error:before { + content: attr(data-error-msg); + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.7); + text-align: center; + padding: 10px 5px; } .jsxc_chatmessage a { color: #00f; text-decoration: underline; - display: inline-block; } + display: inline-block; + max-width: 100%; + position: relative; } + .jsxc_chatmessage a[download]:before { + content: " "; + position: absolute; + top: 0; + right: 0; + bottom: 5px; + left: 0; + border-radius: 3px; + background-color: rgba(255, 255, 255, 0.7); + background-image: url("../img/download_icon_black.svg"); + background-size: contain; + background-position: center center; + background-repeat: no-repeat; + opacity: 0; + transition: opacity 0.5s; } + .jsxc_chatmessage a[download]:hover:before { + opacity: 0.6; } .jsxc_chatmessage img { max-width: 100%; } .jsxc_chatmessage .jsxc_avatar { display: none; } + .jsxc_chatmessage .jsxc_location { + border-radius: 3px; + display: block; + background-color: #fff; + padding: 3px; + padding-left: 30px; + margin-bottom: 5px; + background-position: 3px center; + background-size: 25px 25px; + background-repeat: no-repeat; + background-image: url('../img/location_icon.svg'); } .jsxc_chatmessage .jsxc_attachment { border-radius: 3px; background-color: #fff; @@ -3504,9 +3037,10 @@ .jsxc_chatmessage .jsxc_attachment img { border-radius: 3px; } .jsxc_chatmessage .jsxc_attachment.jsxc_image { - line-height: 0px; + line-height: 0; padding: 0; - background-image: url(); } + background-image: url(""); + display: inline-block; } .jsxc_chatmessage .jsxc_attachment.jsxc_application { background-image: url('../img/filetypes/application.svg'); } .jsxc_chatmessage .jsxc_attachment.jsxc_application-pdf { @@ -3514,9 +3048,14 @@ .jsxc_chatmessage .jsxc_attachment.jsxc_audio { background-image: url('../img/filetypes/audio.svg'); } .jsxc_chatmessage .jsxc_attachment.jsxc_video { - background-image: url('../img/filetypes/video.svg'); } + background-image: url('../img/filetypes/video.svg'); + opacity: 1; } .jsxc_chatmessage .jsxc_attachment.jsxc_text { background-image: url('../img/filetypes/text.svg'); } + .jsxc_chatmessage .jsxc_emoticon.jsxc_large { + width: 40px; + height: 40px; + margin-bottom: 7px; } .jsxc_timestamp { font-size: 8px; @@ -3549,7 +3088,7 @@ border-radius: 3px; background-color: #DBEDFF; } .jsxc_in:after { - content: ' '; + content: " "; position: absolute; border-style: solid; border-width: 5px 6px 5px 0; @@ -3562,16 +3101,15 @@ .jsxc_in .jsxc_timestamp { float: left; } -.jsxc_out { +.jsxc_out, .jsxc_probably_out { float: right; position: relative; max-width: 76%; margin-right: 10px; padding-right: 10px; - border-radius: 3px; - background-color: #e6ffd1; } - .jsxc_out:after { - content: ' '; + border-radius: 3px; } + .jsxc_out:after, .jsxc_probably_out:after { + content: " "; position: absolute; border-style: solid; border-width: 5px 0 5px 6px; @@ -3581,26 +3119,36 @@ z-index: 1; right: -6px; bottom: 10px; } - .jsxc_out.jsxc_received:before { - content: '✓'; + .jsxc_out.jsxc_received:before, .jsxc_probably_out.jsxc_received:before { + content: "✓"; position: absolute; bottom: 2px; right: 2px; font-size: 12px; line-height: 12px; color: #008000; } - .jsxc_out.jsxc_received .jsxc_timestamp { + .jsxc_out.jsxc_received .jsxc_timestamp, .jsxc_probably_out.jsxc_received .jsxc_timestamp { margin-right: 4px; } - .jsxc_out .jsxc_timestamp { + .jsxc_out .jsxc_timestamp, .jsxc_probably_out .jsxc_timestamp { float: right; } +.jsxc_out { + background-color: #e6ffd1; } + .jsxc_sys { width: auto; max-width: none; padding-right: 4px; box-sizing: border-box; margin-right: 3px; - border-radius: 3px; } + border-radius: 3px; + background-color: transparent; + font-size: 0.8em; + font-style: italic; } + .jsxc_sys .jsxc_emoticon { + width: 1.2em; + height: 1.2em; + vertical-align: middle; } div.jsxc_settings { position: relative; } @@ -3622,22 +3170,51 @@ right: 0; cursor: pointer; } div.jsxc_transfer:hover { - opacity: 1.0; } + opacity: 1; } div.jsxc_transfer.jsxc_disabled { background-image: url('../img/padlock_open_disabled_black.svg'); cursor: default; } div.jsxc_transfer.jsxc_disabled:hover { opacity: 0.3; } div.jsxc_transfer.jsxc_fin { - opacity: 1.0; + opacity: 1; background-image: url('../img/padlock_close_grey.svg'); } div.jsxc_transfer.jsxc_enc { - opacity: 1.0; + opacity: 1; background-image: url('../img/padlock_close_orange.svg'); } div.jsxc_transfer.jsxc_enc.jsxc_trust { background-image: url('../img/padlock_close_green.svg'); } -.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_bar .jsxc_avatar, li[data-type="groupchat"] .jsxc_avatar { +.jsxc_status-msg { + font-size: 12px; + display: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + height: 50%; + line-height: 17.5px; + opacity: 0.7; } + .jsxc_status-msg.jsxc_composing:before { + content: " "; + width: 1em; + height: 1em; + display: inline-block; + background-size: cover; + vertical-align: middle; + background-repeat: no-repeat; + background-image: url('../img/composing.png'); } + +.jsxc_status-msg-show .jsxc_name { + height: 50%; + line-height: 20px; } + +.jsxc_status-msg-show .jsxc_status-msg { + display: block; } + +.jsxc_status-msg-show .jsxc_lastmsg { + display: none !important; } + +.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_bar .jsxc_avatar, li[data-type='groupchat'] .jsxc_avatar { text-indent: 999px; background-image: url('../img/group_white.svg'); background-size: 70% 70% !important; @@ -3646,7 +3223,7 @@ .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_fade { padding-top: 44px; } -.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_fingerprints, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_verification, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_transfer, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_video, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_sendFile { +.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_fingerprints, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_verification, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_transfer, .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_video { display: none; } .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_members { @@ -3655,14 +3232,14 @@ background-repeat: no-repeat; background-position: center; } .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_members:hover { - opacity: 1.0; } + opacity: 1; } .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_chatmessage.jsxc_in { margin-left: 50px; } .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_chatmessage.jsxc_in .jsxc_avatar { display: block; position: absolute; - bottom: 0px; + bottom: 0; left: -50px; background-color: #777; } .jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_chatmessage.jsxc_in .jsxc_avatar:before { @@ -3674,9 +3251,8 @@ background-color: #1d2d44; overflow: hidden; position: absolute; - top: 0px; - -webkit-transition: height 400ms; - transition: height 400ms; + top: 0; + transition: height 400ms; z-index: 100; } .jsxc_windowItem .jsxc_memberlist ul { white-space: nowrap; @@ -3684,9 +3260,8 @@ background-color: #1d2d44; color: #bbb; overflow: hidden; - -webkit-transition: left 400ms; - transition: left 400ms; - padding: 0px; + transition: left 400ms; + padding: 0; padding-left: 6px; padding-right: 6px; padding-top: 3px; } @@ -3699,7 +3274,7 @@ display: none; } .jsxc_windowItem .jsxc_memberlist ul > li .jsxc_avatar { margin-left: 2px; - margin-right: 0px; } + margin-right: 0; } .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul { white-space: normal; } .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li { @@ -3714,8 +3289,10 @@ color: inherit; } .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_avatar { margin-right: 4px; } + .jsxc_windowItem .jsxc_memberlist .jsxc_avatar :before { + display: none; } -li[data-type="groupchat"] .jsxc_video { +li[data-type='groupchat'] .jsxc_video { display: none; } .jsxc_right { @@ -3724,6 +3301,15 @@ .jsxc_center { text-align: center; } +.jsxc_hidden { + display: none; } + +.jsxc_clear { + clear: both; } + +.jsxc_uppercase { + text-transform: uppercase; } + .jsxc_sep { border-top: 1px solid #000; } @@ -3736,6 +3322,10 @@ .jsxc_maxWidth { max-width: 500px; } +.jsxc_meta { + text-align: right; + font-style: italic; } + #jsxc_dialog { padding: 20px; min-width: 320px; @@ -3744,8 +3334,7 @@ text-align: left; position: relative; background: #FFF; - width: auto; - border-radius: 5px; } + width: auto; } #jsxc_dialog * { box-sizing: border-box; } #jsxc_dialog ul { @@ -3761,8 +3350,10 @@ margin-bottom: 5px; width: 60%; outline: none; } - #jsxc_dialog p input[type="submit"] { + #jsxc_dialog p input[type='submit'] { width: auto; } + #jsxc_dialog table { + margin-bottom: 1em; } #jsxc_dialog hr { border: 0; border-top: 1px solid #eee; @@ -3775,20 +3366,24 @@ margin-top: 20px; } #jsxc_dialog .jsxc_right { margin-top: 20px; } - #jsxc_dialog form { - /*&.col-sm-6:nth-child(odd) { - clear: left; - }*/ } - #jsxc_dialog form fieldset { - margin-bottom: 30px; - padding: 0px 30px; - border: 1px solid #d9d9d9; } - #jsxc_dialog form fieldset h3 { - font-size: 15px; - color: #000; - background-color: #f2f2f2; - padding: 10px; - margin: 0 -30px 10px -30px; } + #jsxc_dialog form fieldset { + margin-bottom: 30px; + padding: 0 30px; + border: 1px solid #d9d9d9; } + #jsxc_dialog form fieldset h3 { + font-size: 15px; + color: #000; + background-color: #f2f2f2; + padding: 10px; + margin: 0 -30px 10px; } + #jsxc_dialog form fieldset h3.jsxc_experimental:after { + content: "experimental"; + font-size: 0.7em; + border-radius: 2px; + padding: 1px 5px; + background-color: orange; + margin-left: 5px; + font-weight: normal; } #jsxc_dialog legend { border: 0; font-size: 20px; } @@ -3799,11 +3394,11 @@ #jsxc_dialog .btn-group button { margin-right: 0; } #jsxc_dialog input[readonly] { - background-color: #e6e6e6; } + background-color: #e6e5e5; } #jsxc_dialog .jsxc_inputinfo { - padding-left: 30%; + padding: 0; font-style: italic; - margin-top: -1em; } + margin: 0; } #jsxc_dialog .jsxc_waiting:before { content: " "; width: 1em; @@ -3814,19 +3409,24 @@ background-image: url('../img/loading.gif'); } #jsxc_dialog .jsxc_libraries, #jsxc_dialog .jsxc_credits { max-width: 300px; } + #jsxc_dialog .jsxc_warning { + display: block; + background-color: #fbfe7a; + padding: 3px 10px; + border-radius: 3px; } .jsxc_avatar { width: 36px; height: 36px; line-height: 36px; - margin: 0px 5px; + margin: 0 5px; background-color: #999999; border-radius: 50%; float: left; text-align: center; font-weight: bold; font-size: 30px; - color: #b3b3b3; + color: #b3b2b2; position: relative; font-family: Arial, sans-serif; background-size: cover; @@ -3851,7 +3451,6 @@ ul.jsxc_vCard li { cursor: default !important; } -/** Spot which is attached to xmpp: uris */ .jsxc_spot { display: inline-block; width: 12px; @@ -3887,12 +3486,10 @@ margin-right: 3px; margin-top: 4px; } -/** TODO: check if required */ .jsxc_list .jsxc_inner { box-sizing: border-box; max-height: 0; - -webkit-transition: max-height 0.5s; - transition: max-height 0.5s; + transition: max-height 0.5s; overflow: hidden; visibility: hidden; position: absolute; @@ -3915,8 +3512,7 @@ background-size: 32px 32px !important; background: url('../img/loading.gif'); } -/* @TODO: check */ -#jsxc_loginForm input[type="submit"] { +#jsxc_loginForm input[type='submit'] { height: 34px; display: inline-block; padding: 6px 12px; @@ -3964,7 +3560,7 @@ min-width: 25px; display: inline-block; padding: 6px 12px; - margin: 0px 2px; + margin: 0 2px; font-size: 14px; font-weight: 400; line-height: 1.42857143; @@ -3978,15 +3574,20 @@ user-select: none; background-image: none; border: 1px solid transparent; - border-radius: 4px; } + border-radius: 4px; + transition: background-color 0.5s; } .jsxc_btn.jsxc_btn-default { border-color: #ccc; color: #555; background-color: rgba(240, 240, 240, 0.9); } + .jsxc_btn.jsxc_btn-default:hover { + background-color: #d6d6d6; } .jsxc_btn.jsxc_btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } + .jsxc_btn.jsxc_btn-primary:hover { + background-color: #296496; } .jsxc_btn[disabled], .jsxc_btn[disabled]:hover { opacity: 0.65; cursor: not-allowed; @@ -3999,12 +3600,12 @@ position: absolute; background-color: #FFF; color: #333; - border-radius: 3px 3px 3px 3px; + border-radius: 3px; z-index: 110; margin: 8px 2px 5px 10px; - right: 0px; - -webkit-filter: drop-shadow(0px 0px 5px rgba(150, 150, 150, 0.75)); - filter: drop-shadow(0px 0px 5px rgba(150, 150, 150, 0.75)); + right: 0; + -webkit-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); + filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); padding: 4px 12px; padding-left: 5px; } .jsxc_menu:after { @@ -4034,7 +3635,7 @@ white-space: nowrap; } .jsxc_menu a:hover { text-decoration: none; - opacity: 1.0; } + opacity: 1; } .jsxc_menu a.jsxc_disabled { text-decoration: line-through; opacity: 0.5; } @@ -4083,6 +3684,9 @@ .jsxc_bookmarkicon { background-image: url('../img/bookmark_black.svg'); } +.jsxc_announcementicon { + background-image: url('../img/megaphone_icon_black.svg'); } + .jsxc_more { float: right; width: 44px; @@ -4093,7 +3697,7 @@ background-position: center; opacity: 0.4; } .jsxc_more:hover { - opacity: 1.0; } + opacity: 1; } @media (min-width: 768px) { .jsxc_more { width: 25px; } } @@ -4134,13 +3738,144 @@ #jsxc_webrtc li .jsxc_name:hover { color: #bbb; } +.jsxc_establishing:after, .jsxc_ringing:after { + content: " "; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.4); + z-index: 10; } + +.jsxc_establishing:before { + content: " "; + display: block; + width: 40px; + height: 10px; + box-sizing: border-box; + background-color: #a1a1a1; + animation-name: jsxc_establishing; + animation-duration: 2s; + animation-iteration-count: infinite; + position: absolute; + top: 50%; + left: 50%; + z-index: 20; + margin-left: -20px; + margin-top: -5px; } + +@keyframes jsxc_establishing { + 0% { + border-width: 0; + background-color: #a1a1a1; + width: 40px; + margin-left: -20px; } + 50% { + background-color: #f1f1f1; + width: 80px; + margin-left: -40px; } + 100% { + border-width: 0; + background-color: #a1a1a1; + width: 40px; + margin-left: -20px; } } + +.jsxc_ringing:before { + content: " "; + display: block; + width: 20px; + height: 20px; + box-sizing: border-box; + background-color: #98d48f; + border-radius: 50%; + animation-name: jsxc_ringing; + animation-duration: 2s; + animation-iteration-count: infinite; + position: absolute; + top: 50%; + left: 50%; + z-index: 20; + margin-left: -10px; + margin-top: -10px; } + +@keyframes jsxc_ringing { + 0% { + background-color: #98d48f; + width: 20px; + height: 20px; + margin-left: -10px; + margin-top: -10px; } + 50% { + background-color: #76ba6c; + width: 80px; + height: 80px; + margin-left: -40px; + margin-top: -40px; } + 100% { + background-color: #98d48f; + width: 20px; + height: 20px; + margin-left: -10px; + margin-top: -10px; } } + +.jsxc_bell:before { + content: " "; + display: block; + width: 80px; + height: 80px; + box-sizing: border-box; + background-image: url('../img/bell.svg'); + background-size: contain; + background-position: center; + background-repeat: no-repeat; + animation-name: jsxc_ringing; + animation-duration: 1.5s; + animation-iteration-count: infinite; + position: absolute; + top: 50%; + left: 50%; + z-index: 20; + margin-left: -40px; + margin-top: -40px; } + +@keyframes jsxc_bell { + 0% { + margin-left: -50px; } + 5% { + margin-left: -30px; } + 10% { + margin-left: -50px; } + 15% { + margin-left: -30px; } + 20% { + margin-left: -50px; } + 25% { + margin-left: -30px; } + 30% { + margin-left: -50px; } + 35% { + margin-left: -40px; } } + .jsxc_videoContainer { position: absolute; top: 0; left: 0; - right: 0px; - bottom: 0px; + right: 0; + bottom: 0; background-color: #999999; } + .jsxc_videoContainer.jsxc_minimized { + position: fixed; + top: 10px; + left: 10px; + right: auto; + bottom: auto; + z-index: 99; + background-color: transparent; + box-shadow: 0 0 10px #a1a1a1; } + .jsxc_videoContainer.jsxc_minimized .jsxc_localvideo { + position: static; + display: block; } .jsxc_videoContainer video { display: none; } .jsxc_videoContainer .jsxc_noRemoteVideo { @@ -4151,7 +3886,7 @@ .jsxc_videoContainer .jsxc_controlbar { opacity: 0; } .jsxc_videoContainer:hover .jsxc_controlbar { - opacity: 1.0; } } + opacity: 1; } } .jsxc_noRemoteVideo p { position: absolute; @@ -4172,7 +3907,7 @@ left: 50%; margin-left: -100px; } .jsxc_noRemoteVideo > div > div { - background-color: #4d4d4d; } + background-color: #4d4c4c; } .jsxc_noRemoteVideo > div > div:first-child { width: 50%; height: 50%; @@ -4195,8 +3930,7 @@ right: 10px; bottom: 10px; z-index: 9990; - background-color: #000; - cursor: pointer; } + background-color: #000; } div:full-screen { width: 100%; @@ -4242,29 +3976,28 @@ div.jsxc_video.jsxc_disabled { background-image: url('../img/camera_disabled_icon_white.svg'); } div.jsxc_video:not(.jsxc_disabled):hover { - opacity: 1.0; } + opacity: 1; } .jsxc_controlbar { position: absolute; top: 50px; left: 0; - right: 0px; + right: 0; text-align: center; z-index: 9090; - -webkit-transition: 1s opacity; - transition: 1s opacity; + transition: 1s opacity; opacity: 0; } @media (min-width: 768px) { .jsxc_controlbar { bottom: 5%; top: initial; } } .jsxc_controlbar.jsxc_visible { - opacity: 1.0; } + opacity: 1; } .jsxc_controlbar > div { background-color: rgba(0, 0, 0, 0.5); height: 44px; border-radius: 22px; - padding: 0px 5px; + padding: 0 5px; display: inline-block; } .jsxc_controlbar .jsxc_videoControl { height: 44px; @@ -4277,7 +4010,7 @@ display: inline-block; opacity: 0.8; } .jsxc_controlbar .jsxc_videoControl:hover { - opacity: 1.0; } + opacity: 1; } .jsxc_controlbar .jsxc_hangUp { background-image: url('../img/hang_up_red.svg'); } .jsxc_controlbar .jsxc_fullscreen { @@ -4331,65 +4064,6 @@ list-style: none; padding: 0; } -.bubblingG { - text-align: center; - width: 129px; - height: 80px; - position: absolute; - top: 40%; - left: 50%; - margin-left: -64px; } - .bubblingG span { - display: inline-block; - vertical-align: middle; - width: 16px; - height: 16px; - margin: 40px auto; - background: #000; - border-radius: 81px; - -webkit-animation: bubblingG 1.3s infinite alternate; - animation: bubblingG 1.3s infinite alternate; } - -#bubblingG_1 { - -webkit-animation-delay: 0s; - animation-delay: 0s; } - -#bubblingG_2 { - -webkit-animation-delay: 0.39s; - animation-delay: 0.39s; } - -#bubblingG_3 { - -webkit-animation-delay: 0.78s; - animation-delay: 0.78s; } - -@-webkit-keyframes bubblingG { - 0% { - width: 16px; - height: 16px; - background-color: #000; - -webkit-transform: translateY(0); - transform: translateY(0); } - 100% { - width: 39px; - height: 39px; - background-color: #fff; - -webkit-transform: translateY(-34px); - transform: translateY(-34px); } } - -@keyframes bubblingG { - 0% { - width: 16px; - height: 16px; - background-color: #000; - -webkit-transform: translateY(0); - transform: translateY(0); } - 100% { - width: 39px; - height: 39px; - background-color: #fff; - -webkit-transform: translateY(-34px); - transform: translateY(-34px); } } - .jsxc_fullscreen.jsxc_localvideo { border: 1px solid #fff; } diff -Nru libjs-jsxc-3.0.0+dfsg3/build/css/magnific-popup.css libjs-jsxc-3.4.4+dfsg/build/css/magnific-popup.css --- libjs-jsxc-3.0.0+dfsg3/build/css/magnific-popup.css 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/css/magnific-popup.css 2019-08-18 00:09:17.000000000 +0000 @@ -8,8 +8,7 @@ overflow: hidden; position: fixed; background: #0b0b0b; - opacity: 0.8; - filter: alpha(opacity=80); } + opacity: 0.8; } .mfp-wrap { top: 0; @@ -29,8 +28,6 @@ left: 0; top: 0; padding: 0 8px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; } .mfp-container:before { @@ -50,7 +47,8 @@ text-align: left; z-index: 1045; } -.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { +.mfp-inline-holder .mfp-content, +.mfp-ajax-holder .mfp-content { width: 100%; cursor: auto; } @@ -71,7 +69,10 @@ .mfp-auto-cursor .mfp-content { cursor: auto; } -.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { +.mfp-close, +.mfp-arrow, +.mfp-preloader, +.mfp-counter { -webkit-user-select: none; -moz-user-select: none; user-select: none; } @@ -103,7 +104,8 @@ .mfp-s-error .mfp-content { display: none; } -button.mfp-close, button.mfp-arrow { +button.mfp-close, +button.mfp-arrow { overflow: visible; cursor: pointer; background: transparent; @@ -113,8 +115,9 @@ outline: none; padding: 0; z-index: 1046; - -webkit-box-shadow: none; - box-shadow: none; } + box-shadow: none; + touch-action: manipulation; } + button::-moz-focus-inner { padding: 0; border: 0; } @@ -129,22 +132,22 @@ text-decoration: none; text-align: center; opacity: 0.65; - filter: alpha(opacity=65); padding: 0 0 18px 10px; color: #FFF; font-style: normal; font-size: 28px; font-family: Arial, Baskerville, monospace; } - .mfp-close:hover, .mfp-close:focus { - opacity: 1; - filter: alpha(opacity=100); } + .mfp-close:hover, + .mfp-close:focus { + opacity: 1; } .mfp-close:active { top: 1px; } .mfp-close-btn-in .mfp-close { color: #333; } -.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { +.mfp-image-holder .mfp-close, +.mfp-iframe-holder .mfp-close { color: #FFF; right: -6px; text-align: right; @@ -163,20 +166,20 @@ .mfp-arrow { position: absolute; opacity: 0.65; - filter: alpha(opacity=65); margin: 0; top: 50%; margin-top: -55px; padding: 0; width: 90px; height: 110px; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + -webkit-tap-highlight-color: transparent; } .mfp-arrow:active { margin-top: -54px; } - .mfp-arrow:hover, .mfp-arrow:focus { - opacity: 1; - filter: alpha(opacity=100); } - .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + .mfp-arrow:hover, + .mfp-arrow:focus { + opacity: 1; } + .mfp-arrow:before, + .mfp-arrow:after { content: ''; display: block; width: 0; @@ -187,30 +190,30 @@ margin-top: 35px; margin-left: 35px; border: medium inset transparent; } - .mfp-arrow:after, .mfp-arrow .mfp-a { + .mfp-arrow:after { border-top-width: 13px; border-bottom-width: 13px; top: 8px; } - .mfp-arrow:before, .mfp-arrow .mfp-b { + .mfp-arrow:before { border-top-width: 21px; border-bottom-width: 21px; opacity: 0.7; } .mfp-arrow-left { left: 0; } - .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + .mfp-arrow-left:after { border-right: 17px solid #FFF; margin-left: 31px; } - .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + .mfp-arrow-left:before { margin-left: 25px; border-right: 27px solid #3F3F3F; } .mfp-arrow-right { right: 0; } - .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + .mfp-arrow-right:after { border-left: 17px solid #FFF; margin-left: 39px; } - .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + .mfp-arrow-right:before { border-left: 27px solid #3F3F3F; } .mfp-iframe-holder { @@ -245,8 +248,6 @@ height: auto; display: block; line-height: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; padding: 40px 0 40px; margin: 0 auto; } @@ -318,8 +319,6 @@ top: auto; padding: 3px 5px; position: fixed; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; } .mfp-img-mobile .mfp-bottom-bar:empty { padding: 0; } @@ -335,40 +334,18 @@ background: rgba(0, 0, 0, 0.6); position: fixed; text-align: center; - padding: 0; } - } + padding: 0; } } @media all and (max-width: 900px) { .mfp-arrow { -webkit-transform: scale(0.75); transform: scale(0.75); } - .mfp-arrow-left { -webkit-transform-origin: 0; transform-origin: 0; } - .mfp-arrow-right { -webkit-transform-origin: 100%; transform-origin: 100%; } - .mfp-container { padding-left: 6px; - padding-right: 6px; } - } - -.mfp-ie7 .mfp-img { - padding: 0; } -.mfp-ie7 .mfp-bottom-bar { - width: 600px; - left: 50%; - margin-left: -300px; - margin-top: 5px; - padding-bottom: 5px; } -.mfp-ie7 .mfp-container { - padding: 0; } -.mfp-ie7 .mfp-content { - padding-top: 44px; } -.mfp-ie7 .mfp-close { - top: 0; - right: 0; - padding-top: 0; } + padding-right: 6px; } } diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/bell.svg libjs-jsxc-3.4.4+dfsg/build/img/bell.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/bell.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/bell.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + Binary files /tmp/tmpe6qiy5mc/8pJVxrfJWV/libjs-jsxc-3.0.0+dfsg3/build/img/composing.png and /tmp/tmpe6qiy5mc/uzWcZFziBG/libjs-jsxc-3.4.4+dfsg/build/img/composing.png differ diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_black.svg libjs-jsxc-3.4.4+dfsg/build/img/download_icon_black.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_black.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/download_icon_black.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_gray.svg libjs-jsxc-3.4.4+dfsg/build/img/download_icon_gray.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_gray.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/download_icon_gray.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_white.svg libjs-jsxc-3.4.4+dfsg/build/img/download_icon_white.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/download_icon_white.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/download_icon_white.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/emotions/jsxc.svg libjs-jsxc-3.4.4+dfsg/build/img/emotions/jsxc.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/emotions/jsxc.svg 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/emotions/jsxc.svg 2019-08-18 00:09:17.000000000 +0000 @@ -1,24 +1,15 @@ - - + height="68.26667" + width="68.26667" + version="1.1" + id="svg4136"> @@ -33,165 +24,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/emotions/nextcloud.svg libjs-jsxc-3.4.4+dfsg/build/img/emotions/nextcloud.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/emotions/nextcloud.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/emotions/nextcloud.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,98 @@ + + + +image/svg+xml \ No newline at end of file diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/location_icon.svg libjs-jsxc-3.4.4+dfsg/build/img/location_icon.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/location_icon.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/location_icon.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,118 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru libjs-jsxc-3.0.0+dfsg3/build/img/megaphone_icon_black.svg libjs-jsxc-3.4.4+dfsg/build/img/megaphone_icon_black.svg --- libjs-jsxc-3.0.0+dfsg3/build/img/megaphone_icon_black.svg 1970-01-01 00:00:00.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/img/megaphone_icon_black.svg 2019-08-18 00:09:17.000000000 +0000 @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff -Nru libjs-jsxc-3.0.0+dfsg3/build/jsxc.js libjs-jsxc-3.4.4+dfsg/build/jsxc.js --- libjs-jsxc-3.0.0+dfsg3/build/jsxc.js 2016-03-11 16:42:14.000000000 +0000 +++ libjs-jsxc-3.4.4+dfsg/build/jsxc.js 2019-08-18 00:09:17.000000000 +0000 @@ -1,13 +1,13 @@ /*! - * jsxc v3.0.0 - 2016-03-11 + * jsxc v3.4.4 - 2019-05-10 * - * Copyright (c) 2016 Klaus Herberth
+ * Copyright (c) 2019 Klaus Herberth
* Released under the MIT license * - * Please see http://www.jsxc.org/ + * Please see https://www.jsxc.org/ * * @author Klaus Herberth - * @version 3.0.0 + * @version 3.4.4 * @license MIT */ @@ -20,12 +20,12 @@ /** * JavaScript Xmpp Chat namespace - * + * * @namespace jsxc */ jsxc = { /** Version of jsxc */ - version: '3.0.0', + version: '3.4.4', /** True if i'm the master */ master: false, @@ -34,7 +34,7 @@ role_allocation: false, /** Timeout for keepalive */ - to: null, + to: [], /** Timeout after normal keepalive starts */ toBusy: null, @@ -46,10 +46,7 @@ toNotificationDelay: 500, /** Interval for keep-alive */ - keepalive: null, - - /** True if jid, sid and rid was used to connect */ - reconnect: false, + keepaliveInterval: null, /** True if restore is complete */ restoreCompleted: false, @@ -78,6 +75,12 @@ /** My bar id */ bid: null, + /** Current state */ + currentState: null, + + /** Current UI state */ + currentUIState: null, + /** Some constants */ CONST: { NOTIFICATION_DEFAULT: 'default', @@ -91,19 +94,34 @@ }, REGEX: { JID: new RegExp('\\b[^"&\'\\/:<>@\\s]+@[\\w-_.]+\\b', 'ig'), - URL: new RegExp(/(https?:\/\/|www\.)[^\s<>'"]+/gi) + URL: new RegExp(/(https?:\/\/|www\.)[^\s<>'"]+/gi), + GEOURI: new RegExp(/geo:(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?)(?:,-?\d+(?:\.\d+)?)?(?:;crs=[\w-]+)?(?:;u=(\d+(?:\.\d+)?))?(?:;[\w-]+=(?:[\w-_.!~*'()]|%[\da-f][\da-f])+)*/) }, NS: { CARBONS: 'urn:xmpp:carbons:2', - FORWARD: 'urn:xmpp:forward:0' + FORWARD: 'urn:xmpp:forward:0', + HINTS: 'urn:xmpp:hints' }, HIDDEN: 'hidden', - SHOWN: 'shown' + SHOWN: 'shown', + STATE: { + INITIATING: 0, + PREVCONFOUND: 1, + SUSPEND: 2, + TRYTOINTERCEPT: 3, + INTERCEPTED: 4, + ESTABLISHING: 5, + READY: 6 + }, + UISTATE: { + INITIATING: 0, + READY: 1 + } }, /** * Parse a unix timestamp and return a formatted time string - * + * * @memberOf jsxc * @param {Object} unixtime * @returns time of day and/or date @@ -132,7 +150,7 @@ /** * Write debug message to console and to log. - * + * * @memberOf jsxc * @param {String} msg Debug message * @param {Object} data @@ -170,7 +188,7 @@ /** * Write warn message. - * + * * @memberOf jsxc * @param {String} msg Warn message * @param {Object} data @@ -181,7 +199,7 @@ /** * Write error message. - * + * * @memberOf jsxc * @param {String} msg Error message * @param {Object} data @@ -194,12 +212,25 @@ log: '', /** - * Starts the action - * + * This function initializes important core functions and event handlers. + * Afterwards it performs the following actions in the given order: + * + *
    + *
  1. If (loginForm.ifFound = 'force' and form was found) or (jid or rid or + * sid was not found) intercept form, and listen for credentials.
  2. + *
  3. Attach with jid, rid and sid from storage, if no form was found or + * loginForm.ifFound = 'attach'
  4. + *
  5. Attach with jid, rid and sid from options.xmpp, if no form was found or + * loginForm.ifFound = 'attach'
  6. + *
+ * * @memberOf jsxc - * @param {object} options + * @param {object} options See {@link jsxc.options} */ init: function(options) { + jsxc.runMigrations(); + + jsxc.changeState(jsxc.CONST.STATE.INITIATING); if (options && options.loginForm && typeof options.loginForm.attachIfFound === 'boolean' && !options.loginForm.ifFound) { // translate deprated option attachIfFound found to new ifFound @@ -212,14 +243,14 @@ } // Check localStorage - if (typeof(localStorage) === 'undefined') { - jsxc.warn("Browser doesn't support localStorage."); + if (!jsxc.storage.hasSupport()) { + jsxc.error("Browser doesn't support localStorage. JSXC will be disabled."); return; } /** * Getter method for options. Saved options will override default one. - * + * * @param {string} key option key * @returns default or saved option value */ @@ -227,7 +258,7 @@ if (jsxc.bid) { var local = jsxc.storage.getUserItem('options') || {}; - return local[key] || jsxc.options[key]; + return (typeof local[key] !== 'undefined') ? local[key] : jsxc.options[key]; } return jsxc.options[key]; @@ -235,7 +266,7 @@ /** * Setter method for options. Will write into localstorage. - * + * * @param {string} key option key * @param {object} value option value */ @@ -252,21 +283,49 @@ var lang; if (jsxc.storage.getItem('lang') !== null) { lang = jsxc.storage.getItem('lang'); + } else if (jsxc.options.autoLang && navigator.languages && navigator.languages.length > 0) { + lang = navigator.languages[0]; } else if (jsxc.options.autoLang && navigator.language) { - lang = navigator.language.substr(0, 2); + lang = navigator.language; } else { lang = jsxc.options.defaultLang; } - // initialize i18n translator - $.i18n.init({ + var availableLanguages = Object.keys(window.jsxcLanguageResources); + + if (availableLanguages.indexOf(lang) < 0) { + var languagePrefix = lang.slice(0, 2); + + if (availableLanguages.indexOf(languagePrefix) > -1) { + lang = languagePrefix; + } else { + var prefixMatch = availableLanguages.filter(function(l) { + return l.slice(0, 2) === languagePrefix; + }); + + if (prefixMatch.length > 0) { + lang = prefixMatch[0]; + } + } + } + + // initialize i18next translator + window.i18next.init({ lng: lang, fallbackLng: 'en', - resStore: I18next, - // use localStorage and set expiration to a day - useLocalStorage: true, - localStorageExpirationTime: 60 * 60 * 24 * 1000, - debug: jsxc.storage.getItem('debug') === true + resources: window.jsxcLanguageResources, + returnNull: false, + debug: jsxc.storage.getItem('debug') === true, + interpolation: { + prefix: '__', + suffix: '__' + } + }, function() { + window.jqueryI18next.init(window.i18next, $, { + tName: 't', + i18nName: 'i18next', + handleName: 'localize', + }); }); if (jsxc.storage.getItem('debug') === true) { @@ -276,105 +335,130 @@ // Register event listener for the storage event window.addEventListener('storage', jsxc.storage.onStorage, false); - $(document).on('attached.jsxc', function() { - // Looking for logout element - if (jsxc.options.logoutElement !== null && jsxc.options.logoutElement.length > 0) { - var logout = function(ev) { - if (!jsxc.xmpp.conn || !jsxc.xmpp.conn.authenticated) { - return; - } + $(document).on('attached.jsxc', jsxc.registerLogout); + $(document).on('disconnected.jsxc', jsxc.relogin); - ev.stopPropagation(); - ev.preventDefault(); + var isStorageAttachParameters = jsxc.storage.getItem('rid') && jsxc.storage.getItem('sid') && jsxc.storage.getItem('jid'); + var isOptionsAttachParameters = jsxc.options.xmpp.rid && jsxc.options.xmpp.sid && jsxc.options.xmpp.jid; + var isForceLoginForm = jsxc.options.loginForm && jsxc.options.loginForm.ifFound === 'force' && jsxc.isLoginForm(); - jsxc.options.logoutElement = $(this); - jsxc.triggeredFromLogout = true; + // Check if we have to establish a new connection + if ((!isStorageAttachParameters && !isOptionsAttachParameters) || isForceLoginForm) { - jsxc.xmpp.logout(); - }; + if (jsxc.relogin()) { + return; + } + + jsxc.prepareNewConnection(); + + } else if (!jsxc.isLoginForm() || (jsxc.options.loginForm && jsxc.options.loginForm.ifFound === 'attach')) { - jsxc.options.logoutElement.off('click', null, logout).one('click', logout); + // Restore old connection + jsxc.changeState(jsxc.CONST.STATE.PREVCONFOUND); + + if (typeof jsxc.storage.getItem('alive') === 'undefined') { + jsxc.onMaster(); + } else { + jsxc.checkMaster(); } - }); + } + }, - // Check if we have to establish a new connection - if (!(jsxc.storage.getItem('rid') && jsxc.storage.getItem('sid') && jsxc.storage.getItem('jid')) || (jsxc.options.loginForm && jsxc.options.loginForm.ifFound === 'force' && jsxc.isLoginForm())) { + runMigrations: function() { + var lastUsedVersion = jsxc.storage.getItem('version'); - // clean up rid and sid - jsxc.storage.removeItem('rid'); - jsxc.storage.removeItem('sid'); + if (!lastUsedVersion) { + var keys = Object.keys(localStorage).filter(function(key) { + var isKeepMatch = key.match(/^jsxc:[^:]+:(key|history|msg|priv_fingerprint):?/); - // Looking for a login form - if (!jsxc.isLoginForm()) { + return (key.match(/^jsxc:/) && !isKeepMatch) || key.match(/^strophe\.caps\./) + }); - if (jsxc.options.displayRosterMinimized()) { - // Show minimized roster - jsxc.storage.setUserItem('roster', 'hidden'); - jsxc.gui.roster.init(); - jsxc.gui.roster.noConnection(); - } + keys.forEach(function(key) { + localStorage.removeItem(key); + }); - return; - } + jsxc.debug('I turned out your storage and deleted ' + keys.length + ' entries.'); + } + + if (lastUsedVersion !== jsxc.version) { + jsxc.storage.setItem('version', jsxc.version); + } + }, + + prepareNewConnection: function() { + // clean up rid and sid + jsxc.storage.removeItem('rid'); + jsxc.storage.removeItem('sid'); - if (typeof jsxc.options.formFound === 'function') { - jsxc.options.formFound.call(); + // Looking for a login form + if (!jsxc.isLoginForm()) { + jsxc.changeState(jsxc.CONST.STATE.SUSPEND); + + if (jsxc.options.displayRosterMinimized()) { + // Show minimized roster + jsxc.storage.setUserItem('roster', 'hidden'); + jsxc.gui.roster.init(); + jsxc.gui.roster.noConnection(); } - // create jquery object - var form = jsxc.options.loginForm.form = $(jsxc.options.loginForm.form); - var events = form.data('events') || { - submit: [] - }; - var submits = []; + return; + } - // save attached submit events and remove them. Will be reattached - // in jsxc.submitLoginForm - $.each(events.submit, function(index, val) { - submits.push(val.handler); - }); + jsxc.changeState(jsxc.CONST.STATE.TRYTOINTERCEPT); + + if (typeof jsxc.options.formFound === 'function') { + jsxc.options.formFound.call(); + } - form.data('submits', submits); - form.off('submit'); + // create jquery object + var form = jsxc.options.loginForm.form = $(jsxc.options.loginForm.form); + var events = form.data('events') || { + submit: [] + }; + var submits = []; - // Add jsxc login action to form - form.submit(function() { - jsxc.prepareLogin(function(settings) { - if (settings !== false) { - // settings.xmpp.onlogin is deprecated since v2.1.0 - var enabled = (settings.loginForm && settings.loginForm.enable) || (settings.xmpp && settings.xmpp.onlogin); - enabled = enabled === "true" || enabled === true; + // save attached submit events and remove them. Will be reattached + // in jsxc.submitLoginForm + $.each(events.submit, function(index, val) { + submits.push(val.handler); + }); - if (enabled) { - jsxc.options.loginForm.triggered = true; + form.data('submits', submits); + form.off('submit'); - jsxc.xmpp.login(jsxc.options.xmpp.jid, jsxc.options.xmpp.password); - } - } else { - jsxc.submitLoginForm(); + // Add jsxc login action to form + form.submit(function(ev) { + ev.preventDefault(); + + jsxc.prepareLogin(function(settings) { + if (settings !== false) { + // settings.xmpp.onlogin is deprecated since v2.1.0 + var enabled = (settings.loginForm && settings.loginForm.enable) || (settings.xmpp && settings.xmpp.onlogin); + enabled = enabled === "true" || enabled === true; + + if (enabled) { + jsxc.options.loginForm.triggered = true; + + jsxc.xmpp.login(jsxc.options.xmpp.jid, jsxc.options.xmpp.password); + + return; } - }); + } - // Trigger submit in jsxc.xmpp.connected() - return false; + jsxc.submitLoginForm(); }); - } else if (!jsxc.isLoginForm() || (jsxc.options.loginForm && jsxc.options.loginForm.ifFound === 'attach')) { - - // Restore old connection + // Trigger submit in jsxc.xmpp.connected() + return false; + }); - if (typeof(jsxc.storage.getItem('alive')) === 'undefined') { - jsxc.onMaster(); - } else { - jsxc.checkMaster(); - } - } + jsxc.changeState(jsxc.CONST.STATE.INTERCEPTED); }, /** - * Attach to previous session if jid, sid and rid are available in storage - * (default behaviour also for {@link jsxc.init}). Otherwise try to start new session - * with given jid and password in jsxc.options.xmpp. + * Attach to previous session if jid, sid and rid are available + * in storage or options (default behaviour also for {@link jsxc.init}). * * @memberOf jsxc */ @@ -383,6 +467,7 @@ * * @memberOf jsxc * @param {string} jid Jabber Id + * @param {string} password Jabber password */ /** * Attach to new chat session with jid, sid and rid. @@ -393,19 +478,37 @@ * @param {string} rid Request Id */ start: function() { + var args = arguments; + if (jsxc.role_allocation && !jsxc.master) { jsxc.debug('There is an other master tab'); return false; } - if (jsxc.xmpp.conn && jsxc.xmpp.connected) { - jsxc.debug('We are already connected'); + if (jsxc.xmpp.conn && jsxc.xmpp.conn.authenticated) { + jsxc.debug('We are already connected and authenticated'); return false; } - if (arguments.length === 3) { + if (jsxc.currentState !== jsxc.CONST.STATE.INTERCEPTED && jsxc.currentState !== jsxc.CONST.STATE.SUSPEND) { + if (!jsxc.busy) { + jsxc.debug('I am currently busy and will try again later. Please be patient.'); + } + + jsxc.busy = true; + + setTimeout(function() { + jsxc.start.apply(jsxc, args); + }, 400); + + return; + } + + jsxc.busy = false; + + if (args.length === 3) { $(document).one('attached.jsxc', function() { // save rid after first attachment jsxc.xmpp.onRidChange(jsxc.xmpp.conn._proto.rid); @@ -414,7 +517,93 @@ }); } - jsxc.xmpp.login.apply(this, arguments); + jsxc.checkMaster(function() { + jsxc.xmpp.login.apply(this, args); + }); + }, + + relogin: function() { + jsxc.debug('Try to relogin'); + + var jid = jsxc.storage.getItem('jid'); + jsxc.bid = jsxc.bid || (jid ? jsxc.jidToBid(jid) : null); + + if (!jsxc.bid || jsxc.storage.getUserItem('forcedLogout')) { + jsxc.debug('Logout was forced or I found no valid jid'); + + return false; + } + + var xmppOptions = jsxc.options.get('xmpp'); + + if (xmppOptions.url && (xmppOptions.jid || (xmppOptions.username && xmppOptions.domain)) && xmppOptions.password) { + xmppOptions.jid = xmppOptions.jid || (xmppOptions.username + '@' + xmppOptions.domain); + + jsxc.start(xmppOptions.jid, xmppOptions.password); + + return true; + } + + var loadSettingsAllKnowing = jsxc.storage.getUserItem('loadSettingsAllKnowing'); + + if (xmppOptions.url && loadSettingsAllKnowing) { + jsxc.options.loadSettings(null, null, function(settings) { + jsxc._prepareLogin(null, null, function(settings) { + if (settings !== false && jsxc.options.xmpp.jid && jsxc.options.xmpp.password) { + $(document).on('connfail.jsxc', reloginFailed); + $(document).on('authfail.jsxc', reloginFailed); + $(document).on('connected.jsxc', removeReloginHandler); + + jsxc.start(jsxc.options.xmpp.jid, jsxc.options.xmpp.password); + + delete jsxc.options.xmpp.password; + } else { + reloginFailed(); + } + + function reloginFailed() { + jsxc.debug('Could not relogin.'); + + removeReloginHandler(); + + jsxc.storage.removeUserItem('loadSettingsAllKnowing'); + + jsxc.prepareNewConnection(); + } + + function removeReloginHandler() { + $(document).off('connfail.jsxc', reloginFailed); + $(document).off('authfail.jsxc', reloginFailed); + $(document).off('connected.jsxc', removeReloginHandler); + } + }, settings); + }); + + return true; + } + + jsxc.debug('I am not able to relogin'); + + return false; + }, + + registerLogout: function() { + // Looking for logout element + if (jsxc.options.logoutElement !== null && $(jsxc.options.logoutElement).length > 0) { + var logout = function(ev) { + ev.stopPropagation(); + ev.preventDefault(); + + jsxc.options.logoutElement = $(this); + jsxc.triggeredFromLogout = true; + + jsxc.xmpp.logout(); + }; + + jsxc.options.logoutElement = $(jsxc.options.logoutElement); + + jsxc.options.logoutElement.off('click', null, logout).one('click', logout); + } }, /** @@ -429,7 +618,7 @@ /** * Load settings and prepare jid. - * + * * @memberOf jsxc * @param {string} username * @param {string} password @@ -464,7 +653,7 @@ /** * Process xmpp settings and save loaded settings. - * + * * @private * @memberOf jsxc * @param {string} username @@ -494,6 +683,12 @@ username = settings.xmpp.username; } + if (typeof settings.xmpp.password === 'string') { + password = settings.xmpp.password; + + delete settings.xmpp.password; + } + var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : ''; var domain = settings.xmpp.domain; var jid; @@ -519,6 +714,8 @@ loadedSettings.xmpp = {}; } + jsxc.storage.setUserItem('loadSettingsAllKnowing', (!!loadedSettings.xmpp.jid || (!!loadedSettings.xmpp.username && !!loadedSettings.xmpp.domain)) && !!loadedSettings.xmpp.password); + // save loaded settings to storage $.each(loadedSettings, function(key) { var old = jsxc.options.get(key); @@ -544,12 +741,12 @@ jsxc.bid = jsxc.jidToBid(jsxc.storage.getItem('jid')); jsxc.gui.init(); + $('#jsxc_roster').removeClass('jsxc_noConnection'); - jsxc.restoreRoster(); - jsxc.restoreWindows(); - jsxc.restoreCompleted = true; + jsxc.registerLogout(); + jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own'); - $(document).trigger('restoreCompleted.jsxc'); + jsxc.gui.restore(); }, /** @@ -574,12 +771,20 @@ /** * Checks if there is a master + * + * @param {function} [cb] Called if no master was found. */ - checkMaster: function() { + checkMaster: function(cb) { jsxc.debug('check master'); - jsxc.to = window.setTimeout(jsxc.onMaster, 1000); - jsxc.storage.ink('alive'); + cb = (cb && typeof cb === 'function') ? cb : jsxc.onMaster; + + if (typeof jsxc.storage.getItem('alive') === 'undefined') { + cb.call(); + } else { + jsxc.to.push(window.setTimeout(cb, 1000)); + jsxc.keepAlive('slave'); + } }, masterActions: function() { @@ -607,21 +812,24 @@ jsxc.otr.createDSA(); } - jsxc.gui.updateAvatar($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own'); + jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own'); }, /** * Start sending keep-alive signal */ startKeepAlive: function() { - jsxc.keepalive = window.setInterval(jsxc.keepAlive, jsxc.options.timeout - 1000); + jsxc.keepaliveInterval = window.setInterval(jsxc.keepAlive, jsxc.options.timeout - 1000); }, /** * Sends the keep-alive signal to signal that the master is still there. */ - keepAlive: function() { - jsxc.storage.ink('alive'); + keepAlive: function(role) { + var next = parseInt(jsxc.storage.getItem('alive')) + 1; + role = role || 'master'; + + jsxc.storage.setItem('alive', next + ':' + role); }, /** @@ -633,8 +841,8 @@ window.clearTimeout(jsxc.toBusy); } - if (jsxc.keepalive) { - window.clearInterval(jsxc.keepalive); + if (jsxc.keepaliveInterval) { + window.clearInterval(jsxc.keepaliveInterval); } jsxc.storage.ink('alive_busy'); @@ -643,7 +851,7 @@ /** * Generates a random integer number between 0 and max - * + * * @param {Integer} max * @return {Integer} random integer between 0 and max */ @@ -653,7 +861,7 @@ /** * Checks if there is a element with the given selector - * + * * @param {String} selector jQuery selector * @return {Boolean} */ @@ -663,7 +871,7 @@ /** * Creates a CSS compatible string from a JID - * + * * @param {type} jid Valid Jabber ID * @returns {String} css Compatible string */ @@ -677,7 +885,7 @@ /** * Create comparable bar jid. - * + * * @memberOf jsxc * @param jid * @returns comparable bar jid @@ -742,7 +950,7 @@ * This method submits the specified login form. */ submitLoginForm: function() { - var form = jsxc.options.loginForm.form.off('submit'); + var form = $(jsxc.options.loginForm.form).off('submit'); // Attach original events var submits = form.data('submits') || []; @@ -752,8 +960,12 @@ if (form.find('#submit').length > 0) { form.find('#submit').click(); - } else { + } else if (form.get(0) && typeof form.get(0).submit === 'function') { form.submit(); + } else if (form.find('[type="submit"]').length > 0) { + form.find('[type="submit"]').click(); + } else { + jsxc.warn('Could not submit login form.'); } }, @@ -767,7 +979,7 @@ /** * Removes all html tags. - * + * * @memberOf jsxc * @param text * @returns stripped text @@ -778,7 +990,7 @@ /** * Executes only one of the given events - * + * * @param {string} obj.key event name * @param {function} obj.value function to execute * @returns {string} namespace of all events @@ -800,7 +1012,7 @@ /** * Checks if tab is hidden. - * + * * @returns {boolean} True if tab is hidden */ isHidden: function() { @@ -849,7 +1061,7 @@ /** * Executes the given function in jsxc namespace. - * + * * @memberOf jsxc * @param {string} fnName Function name * @param {array} fnParams Function parameters @@ -870,7 +1082,7 @@ /** * Hash string into 32-bit signed integer. - * + * * @memberOf jsxc * @param {string} str input string * @returns {integer} 32-bit signed integer @@ -893,12 +1105,74 @@ isExtraSmallDevice: function() { return $(window).width() < 500; + }, + + changeState: function(state) { + jsxc.currentState = state; + + jsxc.debug('State changed to ' + Object.keys(jsxc.CONST.STATE)[state]); + + $(document).trigger('stateChange.jsxc', state); + }, + + changeUIState: function(state) { + jsxc.currentUIState = state; + + jsxc.debug('UI State changed to ' + Object.keys(jsxc.CONST.UISTATE)[state]); + + $(document).trigger('stateUIChange.jsxc', state); + }, + + getLastMsg: function(bid) { + var history = jsxc.storage.getUserItem('history', bid) || []; + var i = 0; + + while (history.length > i) { + var message = new jsxc.Message(history[i]); + if (message.direction !== jsxc.Message.SYS) { + return { + text: message.msg, + date: message.stamp + }; + } + i++; + } + }, + + enableDebugMode: function() { + jsxc.storage.setItem('debug', true); + }, + + disableDebugMode: function() { + jsxc.storage.setItem('debug', false); + }, + + deleteAllData: function() { + if (!jsxc.storage.getItem('debug')) { + jsxc.warn('This action is only available in debug mode.'); + + return 0; + } + + var prefix = jsxc.storage.PREFIX + jsxc.storage.SEP; + var prefixRegex = new RegExp('^' + prefix); + var keys = Object.keys(localStorage); + var count = 0; + + $.each(keys, function(index, key) { + if (prefixRegex.test(key) && key !== prefix + 'debug') { + localStorage.removeItem(key); + count++; + } + }); + + return count; } }; /** * Handle XMPP stuff. - * + * * @namespace jsxc.xmpp */ jsxc.xmpp = { @@ -906,30 +1180,34 @@ /** * Create new connection or attach to old - * + * * @name login * @memberOf jsxc.xmpp + * @private */ /** * Create new connection with given parameters. - * + * * @name login^2 * @param {string} jid * @param {string} password * @memberOf jsxc.xmpp + * @private */ /** * Attach connection with given parameters. - * + * * @name login^3 * @param {string} jid * @param {string} sid * @param {string} rid * @memberOf jsxc.xmpp + * @private */ login: function() { if (jsxc.xmpp.conn && jsxc.xmpp.conn.authenticated) { + jsxc.debug('Connection already authenticated.'); return; } @@ -955,8 +1233,8 @@ if (sid !== null && rid !== null) { jid = jsxc.storage.getItem('jid'); } else { - sid = null; - rid = null; + sid = jsxc.options.xmpp.sid || null; + rid = jsxc.options.xmpp.rid || null; jid = jsxc.options.xmpp.jid; } } @@ -988,6 +1266,7 @@ $(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail); Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts'); + Strophe.addNamespace('VERSION', 'jabber:iq:version'); } // Create new connection (no login) @@ -1023,7 +1302,7 @@ $(document).trigger('disconnected.jsxc'); break; case Strophe.Status.CONNFAIL: - $(document).trigger('connfail.jsxc'); + $(document).trigger('connfail.jsxc', condition); break; case Strophe.Status.AUTHFAIL: $(document).trigger('authfail.jsxc'); @@ -1035,12 +1314,12 @@ jsxc.xmpp.conn.caps.node = 'http://jsxc.org/'; } + jsxc.changeState(jsxc.CONST.STATE.ESTABLISHING); + if (sid && rid) { jsxc.debug('Try to attach'); jsxc.debug('SID: ' + sid); - jsxc.reconnect = true; - jsxc.xmpp.conn.attach(jid, sid, rid, callback); } else { jsxc.debug('New connection'); @@ -1048,6 +1327,7 @@ if (jsxc.xmpp.conn.caps) { // Add system handler, because user handler isn't called before // we are authenticated + // @REVIEW this could maybe retrieved from jsxc.xmpp.conn.features jsxc.xmpp.conn._addSysHandler(function(stanza) { var from = jsxc.xmpp.conn.domain, c = stanza.querySelector('c'), @@ -1070,34 +1350,39 @@ /** * Logs user out of his xmpp session and does some clean up. - * + * * @param {boolean} complete If set to false, roster will not be removed * @returns {Boolean} */ logout: function(complete) { - // instruct all tabs - jsxc.storage.removeItem('sid'); + jsxc.storage.setUserItem('forcedLogout', true); - // clean up - jsxc.storage.removeUserItem('buddylist'); - jsxc.storage.removeUserItem('windowlist'); - jsxc.storage.removeUserItem('unreadMsg'); + jsxc.triggeredFromElement = (typeof complete === 'boolean') ? complete : true; if (!jsxc.master) { - $('#jsxc_roster').remove(); - $('#jsxc_windowlist').remove(); + // instruct master + jsxc.storage.removeItem('sid'); + + // jsxc.xmpp.disconnected is called if master deletes alive after logout return true; } - if (jsxc.xmpp.conn === null) { - return true; + // REVIEW: this should maybe moved to xmpp.disconnected + // clean up + jsxc.storage.removeUserItem('windowlist'); + jsxc.storage.removeUserItem('unreadMsg'); + + if (jsxc.gui.favicon) { + jsxc.gui.favicon.badge(0); } // Hide dropdown menu $('body').click(); - jsxc.triggeredFromElement = (typeof complete === 'boolean') ? complete : true; + if (!jsxc.xmpp.conn || !jsxc.xmpp.conn.authenticated) { + return true; + } // restore all otr objects $.each(jsxc.storage.getUserItem('otrlist') || {}, function(i, val) { @@ -1137,7 +1422,7 @@ /** * Triggered if connection is established - * + * * @private */ connected: function() { @@ -1148,6 +1433,11 @@ jsxc.xmpp.saveSessionParameter(); + var rosterVerSupport = $(jsxc.xmpp.conn.features).find('[xmlns="urn:xmpp:features:rosterver"]').length > 0; + jsxc.storage.setUserItem('rosterVerSupport', rosterVerSupport); + + jsxc.storage.removeUserItem('forcedLogout'); + if (jsxc.options.loginForm.triggered) { switch (jsxc.options.loginForm.onConnected || 'submit') { case 'submit': @@ -1165,22 +1455,28 @@ jsxc.xmpp.conn.resume(); jsxc.onMaster(); + jsxc.changeState(jsxc.CONST.STATE.READY); $(document).trigger('attached.jsxc'); }, /** * Triggered if connection is attached - * + * * @private */ attached: function() { $('#jsxc_roster').removeClass('jsxc_noConnection'); + Strophe.addNamespace('VERSION', 'jabber:iq:version'); + jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set'); - jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage, null, 'message', 'chat'); + jsxc.xmpp.conn.addHandler(jsxc.xmpp.onChatMessage, null, 'message', 'chat'); + jsxc.xmpp.conn.addHandler(jsxc.xmpp.onErrorMessage, null, 'message', 'error'); + jsxc.xmpp.conn.addHandler(jsxc.xmpp.onHeadlineMessage, null, 'message', 'headline'); jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message'); jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence'); + jsxc.xmpp.conn.addHandler(jsxc.xmpp.onVersionRequest, Strophe.NS.VERSION, 'iq', 'get'); jsxc.gui.init(); @@ -1221,36 +1517,43 @@ } } + var rosterLoaded = jsxc.storage.getUserItem('rosterLoaded'); + // Only load roaster if necessary - if (!jsxc.reconnect || !jsxc.storage.getUserItem('buddylist')) { + if (rosterLoaded !== jsxc.xmpp.conn._proto.sid) { // in order to not overide existing presence information, we send // pres first after roster is ready $(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres); $('#jsxc_roster > p:first').remove(); + var queryAttr = { + xmlns: 'jabber:iq:roster' + }; + + if (jsxc.storage.getUserItem('rosterVerSupport')) { + // @TODO check if we really cached the roster + queryAttr.ver = jsxc.storage.getUserItem('rosterVer') || ''; + } + var iq = $iq({ type: 'get' - }).c('query', { - xmlns: 'jabber:iq:roster' - }); + }).c('query', queryAttr); jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster); } else { jsxc.xmpp.sendPres(); if (!jsxc.restoreCompleted) { - jsxc.restoreRoster(); - jsxc.restoreWindows(); - jsxc.restoreCompleted = true; - - $(document).trigger('restoreCompleted.jsxc'); + jsxc.gui.restore(); } } jsxc.xmpp.saveSessionParameter(); jsxc.masterActions(); + + jsxc.changeState(jsxc.CONST.STATE.READY); }, saveSessionParameter: function() { @@ -1263,17 +1566,18 @@ }, initNewConnection: function() { - // make shure roster will be reloaded - jsxc.storage.removeUserItem('buddylist'); - jsxc.storage.removeUserItem('windowlist'); jsxc.storage.removeUserItem('own'); jsxc.storage.removeUserItem('avatar', 'own'); jsxc.storage.removeUserItem('otrlist'); jsxc.storage.removeUserItem('unreadMsg'); + jsxc.storage.removeUserItem('features'); // reset user options jsxc.storage.removeUserElement('options', 'RTCPeerConfig'); + + // reset http upload settings + jsxc.storage.removeUserElement('options', 'httpUpload'); }, /** @@ -1282,9 +1586,10 @@ sendPres: function() { // disco stuff if (jsxc.xmpp.conn.disco) { - jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC'); + jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC', ''); jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO); jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS); + jsxc.xmpp.conn.disco.addFeature(Strophe.NS.VERSION); } // create presence stanza @@ -1307,22 +1612,40 @@ jsxc.debug('Send presence', pres.toString()); jsxc.xmpp.conn.send(pres); - }, - /** - * Triggered if lost connection - * - * @private + if (!jsxc.storage.getUserItem('features')) { + jsxc.xmpp.conn.flush(); + + var barJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid); + + jsxc.xmpp.conn.disco.info(barJid, undefined, function(stanza) { + var features = $(stanza).find('feature').map(function() { + return $(this).attr('var'); + }); + + jsxc.storage.setUserItem('features', features.toArray()); + $(document).trigger('features.jsxc'); + }); + } else { + $(document).trigger('features.jsxc'); + } + }, + + /** + * Triggered if lost connection + * + * @private */ disconnected: function() { jsxc.debug('disconnected'); - jsxc.storage.removeItem('jid'); + //jsxc.storage.removeItem('jid'); jsxc.storage.removeItem('sid'); jsxc.storage.removeItem('rid'); jsxc.storage.removeItem('hidden'); jsxc.storage.removeUserItem('avatar', 'own'); jsxc.storage.removeUserItem('otrlist'); + jsxc.storage.removeUserItem('features'); $(document).off('connected.jsxc', jsxc.xmpp.connected); $(document).off('attached.jsxc', jsxc.xmpp.attached); @@ -1336,8 +1659,10 @@ if (jsxc.triggeredFromElement) { $(document).trigger('toggle.roster.jsxc', ['hidden', 0]); + jsxc.gui.roster.ready = false; $('#jsxc_roster').remove(); + // REVIEW: logoutElement without href attribute? if (jsxc.triggeredFromLogout) { window.location = jsxc.options.logoutElement.attr('href'); } @@ -1345,12 +1670,18 @@ jsxc.gui.roster.noConnection(); } - window.clearInterval(jsxc.keepalive); + window.clearInterval(jsxc.keepaliveInterval); + jsxc.restoreCompleted = false; + jsxc.role_allocation = false; + jsxc.master = false; + jsxc.storage.removeItem('alive'); + + jsxc.changeState(jsxc.CONST.STATE.SUSPEND); }, /** * Triggered on connection fault - * + * * @param {String} condition information why we lost the connection * @private */ @@ -1364,7 +1695,7 @@ /** * Triggered on auth fail. - * + * * @private */ onAuthFail: function() { @@ -1386,22 +1717,42 @@ /** * Triggered on initial roster load - * + * * @param {dom} iq * @private */ onRoster: function(iq) { - /* - * ... - */ - jsxc.debug('Load roster', iq); + jsxc.storage.setUserItem('rosterLoaded', jsxc.xmpp.conn._proto.sid); + + if ($(iq).find('query').length === 0) { + jsxc.debug('Use cached roster'); + + var buddylist = jsxc.storage.getUserItem('buddylist') || []; + + $.each(buddylist, function(index, buddy) { + jsxc.storage.removeUserItem('res', buddy); + + jsxc.storage.updateUserItem('buddy', buddy, 'status', 0); + jsxc.storage.updateUserItem('buddy', buddy, 'res', []); + jsxc.storage.updateUserItem('buddy', buddy, 'rnd', Math.random()); + }); + + jsxc.restoreRoster(); + return; + } + var buddies = []; $(iq).find('item').each(function() { var jid = $(this).attr('jid'); + + if (!/^[^"&'\/:<>@\s]+@[\w-_.]+$/i.test(jid)) { + jsxc.warn(jid + ' is no valid JID.'); + return; + } + var name = $(this).attr('name') || jid; var bid = jsxc.jidToBid(jid); var sub = $(this).attr('subscription'); @@ -1415,7 +1766,8 @@ name: name, status: 0, sub: sub, - res: [] + res: [], + rnd: Math.random() // force storage event }); jsxc.gui.roster.add(bid); @@ -1427,31 +1779,50 @@ jsxc.storage.setUserItem('buddylist', buddies); + if ($(iq).find('query').attr('ver')) { + jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver')); + } + // load bookmarks jsxc.xmpp.bookmarks.load(); jsxc.gui.roster.loaded = true; jsxc.debug('Roster loaded'); $(document).trigger('cloaded.roster.jsxc'); + jsxc.changeUIState(jsxc.CONST.UISTATE.READY); }, /** * Triggerd on roster changes - * + * * @param {dom} iq * @returns {Boolean} True to preserve handler * @private */ onRosterChanged: function(iq) { - /* - * - */ + + var iqSender = $(iq).attr('from'); + var ownBareJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid); + + if (iqSender && iqSender !== ownBareJid) { + return true; + } jsxc.debug('onRosterChanged', iq); + if ($(iq).find('item').length !== 1) { + jsxc.warn('Roster pushes must contain only one item element'); + return true; + } + $(iq).find('item').each(function() { var jid = $(this).attr('jid'); + + if (!/^[^"&'\/:<>@\s]+@[\w-_.]+$/i.test(jid)) { + jsxc.warn(jid + ' is no valid JID.'); + return; + } + var name = $(this).attr('name') || jid; var bid = jsxc.jidToBid(jid); var sub = $(this).attr('subscription'); @@ -1500,6 +1871,10 @@ } }); + if ($(iq).find('query').attr('ver')) { + jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver')); + } + if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) { jsxc.gui.roster.empty(); } else { @@ -1512,19 +1887,19 @@ /** * Triggered on incoming presence stanzas - * + * * @param {dom} presence * @private */ onPresence: function(presence) { /* * - * + * * 5 * - * + * * chat * 5 0) { message = forwarded.find('> message'); @@ -1676,6 +2053,9 @@ if (carbon.length === 0) { carbon = false; + } else if (originalSender !== Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) { + // ignore this carbon copy + return true; } jsxc.debug('Incoming forwarded message', message); @@ -1687,7 +2067,8 @@ jsxc.debug('Incoming message', message); } - var body = $(message).find('body:first').text(); + var htmlBody = $(message).find('body[xmlns="' + Strophe.NS.XHTML + '"]').first(); + var body = $(message).find('>body').first().text() || htmlBody.text(); if (!body || (body.match(/\?OTR/i) && forwarded)) { return true; @@ -1705,7 +2086,7 @@ if (carbon) { var direction = (carbon.prop("tagName") === 'sent') ? jsxc.Message.OUT : jsxc.Message.IN; - bid = jsxc.jidToBid((direction === 'out') ? $(message).attr('to') : from); + bid = jsxc.jidToBid((direction === jsxc.Message.OUT) ? $(message).attr('to') : from); jsxc.gui.window.postMessage({ bid: bid, @@ -1737,13 +2118,24 @@ var chat = jsxc.storage.getUserItem('chat', bid) || []; if (chat.length === 0) { - jsxc.notice.add($.t('Unknown_sender'), $.t('You_received_a_message_from_an_unknown_sender') + ' (' + bid + ').', 'gui.showUnknownSender', [bid]); + jsxc.notice.add({ + msg: $.t('Unknown_sender'), + description: $.t('You_received_a_message_from_an_unknown_sender_') + ' (' + bid + ').' + }, 'gui.showUnknownSender', [bid]); } var msg = jsxc.removeHTML(body); msg = jsxc.escapeHTML(msg); - jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp); + var messageObj = new jsxc.Message({ + bid: bid, + msg: msg, + direction: jsxc.Message.IN, + encrypted: false, + forwarded: forwarded, + stamp: stamp + }); + messageObj.save(); return true; } @@ -1765,7 +2157,7 @@ jsxc.otr.create(bid); } - if (!forwarded && mid !== null && request.length && data !== null && (data.sub === 'both' || data.sub === 'from') && type === 'chat') { + if (!forwarded && mid !== null && request.length && (data.sub === 'both' || data.sub === 'from') && type === 'chat') { // Send received according to XEP-0184 jsxc.xmpp.conn.send($msg({ to: from @@ -1775,19 +2167,30 @@ })); } - if (jsxc.otr.objects.hasOwnProperty(bid)) { + var attachment = jsxc.xmpp.getAttachmentFromHtmlBody(htmlBody); + + if (attachment) { + body = null; + } + + if (jsxc.otr.objects.hasOwnProperty(bid) && body) { + // @TODO check for file upload url after decryption jsxc.otr.objects[bid].receiveMsg(body, { + _uid: mid, stamp: stamp, - forwarded: forwarded + forwarded: forwarded, + attachment: attachment }); } else { jsxc.gui.window.postMessage({ + _uid: mid, bid: bid, direction: jsxc.Message.IN, msg: body, encrypted: false, forwarded: forwarded, - stamp: stamp + stamp: stamp, + attachment: attachment }); } @@ -1795,9 +2198,116 @@ return true; }, + onErrorMessage: function(message) { + var bid = jsxc.jidToBid($(message).attr('from')); + + if (jsxc.gui.window.get(bid).length === 0 || !$(message).attr('id')) { + return true; + } + + if ($(message).find('item-not-found').length > 0) { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send_item-not-found') + }); + } else if ($(message).find('forbidden').length > 0) { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send_forbidden') + }); + } else if ($(message).find('not-acceptable').length > 0) { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send_not-acceptable') + }); + } else if ($(message).find('remote-server-not-found').length > 0) { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send_remote-server-not-found') + }); + } else if ($(message).find('service-unavailable').length > 0) { + if ($(message).find('[xmlns="' + Strophe.NS.CHATSTATES + '"]').length === 0) { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send_resource-unavailable') + }); + } + } else { + jsxc.gui.window.postMessage({ + bid: bid, + direction: jsxc.Message.SYS, + msg: $.t('message_not_send') + }); + } + + jsxc.debug('error message for ' + bid, $(message).find('error')[0]); + + return true; + }, + + /** + * Process message stanzas of type headline. + * + * @param {String} stanza Message stanza of type headline + * @return {Boolean} + */ + onHeadlineMessage: function(stanza) { + stanza = $(stanza); + + var from = stanza.attr('from'); + var domain = Strophe.getDomainFromJid(from); + + if (domain !== from) { + if (!jsxc.storage.getUserItem('buddy', jsxc.jidToBid(from))) { + return true; + } + } else if (domain !== Strophe.getDomainFromJid(jsxc.xmpp.conn.jid)) { + return true; + } + + var subject = stanza.find('subject:first').text() || $.t('Notification'); + var body = stanza.find('body:first').text(); + + jsxc.notice.add({ + msg: subject, + description: body, + type: (domain === from) ? 'announcement' : null + }, 'gui.showNotification', [subject, body, from]); + + return true; + }, + + /** + * Respond to version request (XEP-0092). + */ + onVersionRequest: function(stanza) { + stanza = $(stanza); + + var from = stanza.attr('from'); + var id = stanza.attr('id'); + + var iq = $iq({ + type: 'result', + to: from, + id: id + }).c('query', { + xmlns: Strophe.NS.VERSION + }).c('name').t('JSXC').up() + .c('version').t(jsxc.version); + + jsxc.xmpp.conn.sendIQ(iq); + + return true; + }, + /** * Triggerd if the rid changed - * + * * @param {integer} rid next valid request id * @private */ @@ -1805,9 +2315,80 @@ jsxc.storage.setItem('rid', rid); }, + getAttachmentFromHtmlBody: function(htmlBody) { + if (htmlBody.length !== 1) { + return; + } + + var attachment; + var httpUploadElement = htmlBody.find('a[data-type][data-name][data-size]'); + + if (httpUploadElement.length === 1) { + // deprecated syntax @since 3.2.1 + attachment = { + type: httpUploadElement.attr('data-type'), + name: httpUploadElement.attr('data-name'), + size: httpUploadElement.attr('data-size'), + }; + + if (httpUploadElement.attr('data-thumbnail') && httpUploadElement.attr('data-thumbnail').match(/^\s*data:[a-z]+\/[a-z0-9-+.*]+;base64,[a-z0-9=+/]+$/i)) { + attachment.thumbnail = httpUploadElement.attr('data-thumbnail'); + } + + if (httpUploadElement.attr('href') && httpUploadElement.attr('href').match(/^https:\/\//)) { + attachment.data = httpUploadElement.attr('href'); + } + + if (!attachment.type.match(/^[a-z]+\/[a-z0-9-+.*]+$/i) || !attachment.name.match(/^[\s\w.,-]+$/i) || !attachment.size.match(/^\d+$/i)) { + attachment = undefined; + + jsxc.warn('Invalid file type, name or size.'); + } + } else if (htmlBody.find('>a').length === 1) { + var linkElement = htmlBody.find('>a'); + var metaString = ''; + var thumbnail; + + if (linkElement.find('>img').length === 1) { + var imgElement = linkElement.find('>img'); + var src = imgElement.attr('src') || ''; + var altString = imgElement.attr('alt') || ''; + metaString = altString.replace(/^Preview:/, ''); + + if (src.match(/^\s*data:[a-z]+\/[a-z0-9-+.*]+;base64,[a-z0-9=+/]+$/i)) { + thumbnail = src; + } + } else { + metaString = linkElement.text(); + } + + var metaMatch = metaString.match(/^([a-z]+\/[a-z0-9-+.*]+)\|(\d+)\|([\s\w.,-]+)/); + + if (metaMatch) { + attachment = { + type: metaMatch[1], + size: metaMatch[2], + name: metaMatch[3], + }; + + if (thumbnail) { + attachment.thumbnail = thumbnail; + } + + if (linkElement.attr('href') && linkElement.attr('href').match(/^https?:\/\//)) { + attachment.data = linkElement.attr('href'); + } + } else { + jsxc.warn('Invalid file type, name or size.'); + } + } + + return attachment; + }, + /** * response to friendship request - * + * * @param {string} from jid from original friendship req * @param {boolean} approve */ @@ -1828,7 +2409,7 @@ /** * Add buddy to my friends - * + * * @param {string} username jid * @param {string} alias */ @@ -1853,9 +2434,9 @@ type: 'subscribe' })); - jsxc.storage.removeUserItem('add_' + bid); + jsxc.storage.removeUserItem('add', bid); } else { - jsxc.storage.setUserItem('add_' + bid, { + jsxc.storage.setUserItem('add', bid, { username: username, alias: alias || null }); @@ -1864,7 +2445,7 @@ /** * Remove buddy from my friends - * + * * @param {type} jid */ removeBuddy: function(jid) { @@ -1899,39 +2480,59 @@ /** * Public function to send message. - * + * * @memberOf jsxc.xmpp * @param bid css jid of user * @param msg message * @param uid unique id */ - sendMessage: function(bid, msg, uid) { - if (jsxc.otr.objects.hasOwnProperty(bid)) { - jsxc.otr.objects[bid].sendMsg(msg, uid); + sendMessage: function(message) { + var bid = message.bid; + var msg = message.msg; + + var mucRoomNames = (jsxc.xmpp.conn.muc && jsxc.xmpp.conn.muc.roomNames) ? jsxc.xmpp.conn.muc.roomNames : []; + var isMucBid = mucRoomNames.indexOf(bid) >= 0; + + if (jsxc.otr.objects.hasOwnProperty(bid) && !isMucBid) { + jsxc.otr.objects[bid].sendMsg(msg, message); } else { - jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data('jid'), msg, uid); + jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data('jid'), msg, message); } }, /** * Create message stanza and send it. - * + * * @memberOf jsxc.xmpp * @param jid Jabber id * @param msg Message * @param uid unique id * @private */ - _sendMessage: function(jid, msg, uid) { + _sendMessage: function(jid, msg, message) { + // @TODO put jid into message object var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid)) || {}; var isBar = (Strophe.getBareJidFromJid(jid) === jid); var type = data.type || 'chat'; + message = message || {}; var xmlMsg = $msg({ to: jid, type: type, - id: uid - }).c('body').t(msg); + id: message._uid + }); + + if (message.type === jsxc.Message.HTML && msg === message.msg && message.htmlMsg) { + xmlMsg.c('body').t(msg); + + xmlMsg.up().c('html', { + xmlns: Strophe.NS.XHTML_IM + }).c('body', { + xmlns: Strophe.NS.XHTML + }).h(message.htmlMsg).up(); + } else { + xmlMsg.c('body').t(msg); + } if (jsxc.xmpp.carbons.enabled && msg.match(/^\?OTR/)) { xmlMsg.up().c("private", { @@ -1939,6 +2540,12 @@ }); } + if (msg.match(/^\?OTR/)) { + xmlMsg.up().c("no-permanent-store", { + xmlns: jsxc.CONST.NS.HINTS + }); + } + if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) { // Add request according to XEP-0184 xmlMsg.up().c('request', { @@ -1946,12 +2553,19 @@ }); } + if (jsxc.xmpp.conn.chatstates && !jsxc.xmpp.chatState.isDisabled()) { + // send active event (XEP-0085) + xmlMsg.up().c('active', { + xmlns: Strophe.NS.CHATSTATES + }); + } + jsxc.xmpp.conn.send(xmlMsg); }, /** * This function loads a vcard. - * + * * @memberOf jsxc.xmpp * @param bid * @param cb @@ -1975,7 +2589,7 @@ /** * Retrieves capabilities. - * + * * @memberOf jsxc.xmpp * @param jid * @returns List of known capabilities @@ -1997,7 +2611,7 @@ /** * Test if jid has given features - * + * * @param {string} jid Jabber id * @param {string[]} feature Single feature or list of features * @param {Function} cb Called with the result as first param. @@ -2049,7 +2663,7 @@ /** * Handle carbons (XEP-0280); - * + * * @namespace jsxc.xmpp.carbons */ jsxc.xmpp.carbons = { @@ -2057,7 +2671,7 @@ /** * Enable carbons. - * + * * @memberOf jsxc.xmpp.carbons * @param cb callback */ @@ -2083,7 +2697,7 @@ /** * Disable carbons. - * + * * @memberOf jsxc.xmpp.carbons * @param cb callback */ @@ -2109,7 +2723,7 @@ /** * Enable/Disable carbons depending on options key. - * + * * @memberOf jsxc.xmpp.carbons * @param err error message */ @@ -2126,273 +2740,11 @@ } }; +/* global Favico, emojione*/ /** - * Load message object with given uid. - * - * @class Message - * @memberOf jsxc - * @param {string} uid Unified identifier from message object - */ -/** - * Create new message object. + * Handle functions for chat window's and buddylist * - * @class Message - * @memberOf jsxc - * @param {object} args New message properties - * @param {string} args.bid - * @param {direction} args.direction - * @param {string} args.msg - * @param {boolean} args.encrypted - * @param {boolean} args.forwarded - * @param {boolean} args.sender - * @param {integer} args.stamp - * @param {object} args.attachment Attached data - * @param {string} args.attachment.name File name - * @param {string} args.attachment.size File size - * @param {string} args.attachment.type File type - * @param {string} args.attachment.data File data - */ - -jsxc.Message = function() { - - /** @member {string} */ - this._uid = null; - - /** @member {boolean} */ - this._received = false; - - /** @member {boolean} */ - this.encrypted = false; - - /** @member {boolean} */ - this.forwarded = false; - - /** @member {integer} */ - this.stamp = new Date().getTime(); - - if (typeof arguments[0] === 'string' && arguments[0].length > 0 && arguments.length === 1) { - this._uid = arguments[0]; - - this.load(this._uid); - } else if (typeof arguments[0] === 'object' && arguments[0] !== null) { - $.extend(this, arguments[0]); - } - - if (!this._uid) { - this._uid = new Date().getTime() + ':msg'; - } -}; - -/** - * Load message properties. - * - * @memberof jsxc.Message - * @param {string} uid - */ -jsxc.Message.prototype.load = function(uid) { - var data = jsxc.storage.getUserItem('msg', uid); - - if (!data) { - jsxc.debug('Could not load message with uid ' + uid); - } - - $.extend(this, data); -}; - -/** - * Save message properties and create thumbnail. - * - * @memberOf jsxc.Message - * @return {Message} this object - */ -jsxc.Message.prototype.save = function() { - var history; - - if (this.bid) { - history = jsxc.storage.getUserItem('history', this.bid) || []; - - if (history.indexOf(this._uid) < 0) { - if (history.length > jsxc.options.get('numberOfMsg')) { - jsxc.Message.delete(history.pop()); - } - } else { - history = null; - } - } - - if (Image && this.attachment && this.attachment.type.match(/^image\//i) && this.attachment.data) { - var sHeight, sWidth, sx, sy; - var dHeight = 100, - dWidth = 100; - var canvas = $("").get(0); - - canvas.width = dWidth; - canvas.height = dHeight; - - var ctx = canvas.getContext("2d"); - var img = new Image(); - - img.src = this.attachment.data; - - if (img.height > img.width) { - sHeight = img.width; - sWidth = img.width; - sx = 0; - sy = (img.height - img.width) / 2; - } else { - sHeight = img.height; - sWidth = img.height; - sx = (img.width - img.height) / 2; - sy = 0; - } - - ctx.drawImage(img, sx, sy, sWidth, sHeight, 0, 0, dWidth, dHeight); - - this.attachment.thumbnail = canvas.toDataURL(); - - if (this.direction === 'out') { - // save storage - this.attachment.data = null; - } - } - - var data; - - if (this.attachment && this.attachment.size > jsxc.options.maxStorableSize && this.direction === 'in') { - jsxc.debug('Attachment to large to store'); - - data = this.attachment.data; - this.attachment.data = null; - this.attachment.persistent = false; - - //TODO inform user - } - - jsxc.storage.setUserItem('msg', this._uid, this); - - if (history) { - history.unshift(this._uid); - - jsxc.storage.setUserItem('history', this.bid, history); - } - - if (data && this.attachment) { - this.attachment.data = data; - } - - return this; -}; - -/** - * Remove object from storage. - * - * @memberOf jsxc.Message - */ -jsxc.Message.prototype.delete = function() { - jsxc.Message.delete(this._uid); -}; - -/** - * Returns object as jquery object. - * - * @memberOf jsxc.Message - * @return {jQuery} Representation in DOM - */ -jsxc.Message.prototype.getDOM = function() { - return jsxc.Message.getDOM(this._uid); -}; - -/** - * Mark message as received. - * - * @memberOf jsxc.Message - */ -jsxc.Message.prototype.received = function() { - this._received = true; - this.save(); - - this.getDOM().addClass('jsxc_received'); -}; - -/** - * Returns true if the message was already received. - * - * @memberOf jsxc.Message - * @return {boolean} true means received - */ -jsxc.Message.prototype.isReceived = function() { - return this._received; -}; - -/** - * Remove message with uid. - * - * @memberOf jsxc.Message - * @static - * @param {string} uid message uid - */ -jsxc.Message.delete = function(uid) { - var data = jsxc.storage.getUserItem('msg', uid); - - if (data) { - jsxc.storage.removeUserItem('msg', uid); - - if (data.bid) { - var history = jsxc.storage.getUserItem('history', data.bid) || []; - - history = $.grep(history, function(el) { - return el !== uid; - }); - - jsxc.storage.setUserItem('history', data.bid); - } - } -}; - -/** - * Returns message object as jquery object. - * - * @memberOf jsxc.Message - * @static - * @param {string} uid message uid - * @return {jQuery} jQuery representation in DOM - */ -jsxc.Message.getDOM = function(uid) { - return $('#' + uid.replace(/:/g, '-')); -}; - -/** - * Message direction can be incoming, outgoing or system. - * - * @typedef {(jsxc.Message.IN|jsxc.Message.OUT|jsxc.Message.SYS)} direction - */ - -/** - * @constant - * @type {string} - * @default - */ -jsxc.Message.IN = 'in'; - -/** - * @constant - * @type {string} - * @default - */ -jsxc.Message.OUT = 'out'; - -/** - * @constant - * @type {string} - * @default - */ -jsxc.Message.SYS = 'sys'; - -/* global Favico, emojione*/ -/** - * Handle functions for chat window's and buddylist - * - * @namespace jsxc.gui + * @namespace jsxc.gui */ jsxc.gui = { /** Smilie token to file mapping */ @@ -2433,20 +2785,35 @@ ':jabber:': ['jabber'], ':xmpp:': ['xmpp'], ':jsxc:': ['jsxc'], - ':owncloud:': ['owncloud'] + ':owncloud:': ['owncloud'], + ':nextcloud:': ['nextcloud'] }, 'emojione': emojione.emojioneList }, /** * Different uri query actions as defined in XEP-0147. - * + * * @namespace jsxc.gui.queryActions */ queryActions: { /** xmpp:JID?message[;body=TEXT] */ message: function(jid, params) { - var win = jsxc.gui.window.open(jsxc.jidToBid(jid)); + var bid = jsxc.jidToBid(jid); + + if (!jsxc.storage.getUserItem('buddy', bid)) { + // init contact + jsxc.storage.saveBuddy(bid, { + jid: jid, + name: bid, + status: 0, + sub: 'none', + res: [], + rnd: Math.random() + }); + } + + var win = jsxc.gui.window.open(bid); if (params && typeof params.body === 'string') { win.find('.jsxc_textinput').val(params.body); @@ -2462,7 +2829,7 @@ subscribe: function(jid, params) { jsxc.gui.showContactDialog(jid); - if (params && typeof params.name) { + if (params && typeof params.name === 'string') { $('#jsxc_alias').val(params.name); } }, @@ -2482,7 +2849,7 @@ /** * Creates application skeleton. - * + * * @memberOf jsxc.gui */ init: function() { @@ -2491,6 +2858,8 @@ return; } + jsxc.changeUIState(jsxc.CONST.UISTATE.INITIATING); + jsxc.gui.regShortNames = new RegExp(emojione.regShortNames.source + '|(' + Object.keys(jsxc.gui.emoticonList.core).join('|') + ')', 'gi'); $('body').append($(jsxc.gui.template.get('windowList'))); @@ -2530,7 +2899,7 @@ // prepare regexp for emotions $.each(jsxc.gui.emotions, function(i, val) { // escape characters - var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1'); + var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1'); //lgtm [js/incomplete-sanitization] reg = '(' + reg.split(' ').join('|') + ')'; jsxc.gui.emotions[i][2] = new RegExp(reg, 'g'); }); @@ -2542,7 +2911,7 @@ /** * Init tooltip plugin for given jQuery selector. - * + * * @param {String} selector jQuery selector * @memberOf jsxc.gui */ @@ -2559,7 +2928,7 @@ /** * Updates Information in roster and chatbar - * + * * @param {String} bid bar jid */ update: function(bid) { @@ -2582,7 +2951,7 @@ jsxc.gui.updatePresence(bid, jsxc.CONST.STATUS[data.status]); // Change name and add title - ue.find('.jsxc_name:first').add(spot).text(data.name).attr('title', $.t('is_', { + ue.find('.jsxc_name:first').add(spot).text(data.name).attr('title', bid + ' ' + $.t('is_', { status: $.t(jsxc.CONST.STATUS[data.status]) })); @@ -2625,90 +2994,14 @@ ri.find('.jsxc_name').attr('title', info); - jsxc.gui.updateAvatar(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar); - }, - - /** - * Update avatar on all given elements. - * - * @memberOf jsxc.gui - * @param {jQuery} el Elements with subelement .jsxc_avatar - * @param {string} jid Jid - * @param {string} aid Avatar id (sha1 hash of image) - */ - updateAvatar: function(el, jid, aid) { - - var setAvatar = function(src) { - if (src === 0 || src === '0') { - if (typeof jsxc.options.defaultAvatar === 'function') { - jsxc.options.defaultAvatar.call(el, jid); - return; - } - jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid); - return; - } - - el.find('.jsxc_avatar').removeAttr('style'); - - el.find('.jsxc_avatar').css({ - 'background-image': 'url(' + src + ')', - 'text-indent': '999px' - }); - }; - - if (typeof aid === 'undefined') { - setAvatar(0); - return; - } - - var avatarSrc = jsxc.storage.getUserItem('avatar', aid); - - if (avatarSrc !== null) { - setAvatar(avatarSrc); - } else { - var handler_cb = function(stanza) { - jsxc.debug('vCard', stanza); - - var vCard = $(stanza).find("vCard > PHOTO"); - var src; - - if (vCard.length === 0) { - jsxc.debug('No photo provided'); - src = '0'; - } else if (vCard.find('EXTVAL').length > 0) { - src = vCard.find('EXTVAL').text(); - } else { - var img = vCard.find('BINVAL').text(); - var type = vCard.find('TYPE').text(); - src = 'data:' + type + ';base64,' + img; - } - - // concat chunks - src = src.replace(/[\t\r\n\f]/gi, ''); - - jsxc.storage.setUserItem('avatar', aid, src); - setAvatar(src); - }; - - var error_cb = function(msg) { - jsxc.warn('Could not load vcard.', msg); - - jsxc.storage.setUserItem('avatar', aid, 0); - setAvatar(0); - }; + jsxc.gui.avatar.update(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar); - // workaround for https://github.com/strophe/strophejs/issues/172 - if (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) { - jsxc.xmpp.conn.vcard.get(handler_cb, error_cb); - } else { - jsxc.xmpp.conn.vcard.get(handler_cb, Strophe.getBareJidFromJid(jid), error_cb); - } - } + $(document).trigger('update.gui.jsxc', [bid]); }, /** * Updates scrollbar handlers. - * + * * @memberOf jsxc.gui */ updateWindowListSB: function() { @@ -2723,7 +3016,7 @@ /** * Scroll window list by offset. - * + * * @memberOf jsxc.gui * @param offset */ @@ -2765,7 +3058,7 @@ /** * Toggle list with timeout, like menu or settings - * + * * @memberof jsxc.gui */ toggleList: function(el) { @@ -2811,9 +3104,15 @@ * Creates and show loginbox */ showLoginBox: function() { - // Set focus to password field - $(document).on("complete.dialog.jsxc", function() { - $('#jsxc_password').focus(); + // Set focus to username or password field + $(document).one("complete.dialog.jsxc", function() { + setTimeout(function() { + if ($("#jsxc_username").val().length === 0) { + $("#jsxc_username").focus(); + } else { + $('#jsxc_password').focus(); + } + }, 50); }); jsxc.gui.dialog.open(jsxc.gui.template.get('loginBox')); @@ -2839,6 +3138,8 @@ onAuthFail(); } else { $(document).on('authfail.jsxc', onAuthFail); + $(document).on('connfail.jsxc', onAuthFail); + $(document).on('connected.jsxc', removeHandler); jsxc.xmpp.login(); } @@ -2849,6 +3150,8 @@ alert.show(); jsxc.gui.dialog.resize(); + removeHandler(); + $('#jsxc_dialog').find('button').trigger('btnfinished.jsxc'); $('#jsxc_dialog').find('input').one('keypress', function() { @@ -2856,11 +3159,17 @@ jsxc.gui.dialog.resize(); }); } + + function removeHandler() { + $(document).off('authfail.jsxc', null, onAuthFail); + $(document).off('connfail.jsxc', null, onAuthFail); + $(document).off('connected.jsxc', null, removeHandler); + } }, /** * Creates and show the fingerprint dialog - * + * * @param {String} bid */ showFingerprints: function(bid) { @@ -2869,7 +3178,7 @@ /** * Creates and show the verification dialog - * + * * @param {String} bid */ showVerification: function(bid) { @@ -2994,7 +3303,7 @@ /** * Create and show approve dialog - * + * * @param {type} from valid jid */ showApproveDialog: function(from) { @@ -3028,7 +3337,7 @@ /** * Create and show dialog to add a buddy - * + * * @param {string} [username] jabber id */ showContactDialog: function(username) { @@ -3047,6 +3356,7 @@ if (val !== '') { jsxc.options.getUsers.call(this, val, function(list) { + $('#jsxc_userlist').empty(); $.each(list || {}, function(uid, displayname) { var option = $('