").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/data/themes.telegram.org/css/jquery-ui.min.css b/data/themes.telegram.org/css/jquery-ui.min.css
new file mode 100644
index 0000000000..4e14d72f69
--- /dev/null
+++ b/data/themes.telegram.org/css/jquery-ui.min.css
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.12.0 - 2016-09-10
+* http://jqueryui.com
+* Includes: draggable.css, core.css, resizable.css
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.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-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;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.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}
\ No newline at end of file
diff --git a/data/themes.telegram.org/css/themes.css b/data/themes.telegram.org/css/themes.css
new file mode 100644
index 0000000000..b0afb81f13
--- /dev/null
+++ b/data/themes.telegram.org/css/themes.css
@@ -0,0 +1,2001 @@
+body {
+ font-family: 'Roboto', sans-serif;
+ font-size: 15px;
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+.btn,
+a.btn,
+button.btn {
+ font-size: 13px;
+ font-weight: 500;
+ line-height: 18px;
+ text-transform: uppercase;
+ border-radius: 5px;
+ padding: 8px 16px 6px;
+ border: none;
+}
+.btn:active {
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.125);
+}
+.btn-xs,
+a.btn-xs,
+button.btn-xs {
+ font-size: 11px;
+ line-height: 14px;
+ padding: 4px 7px 2px;
+}
+.btn-sm,
+a.btn-sm,
+button.btn-sm {
+ padding: 5px 14px 4px;
+}
+.btn-lg,
+a.btn-lg,
+button.btn-lg {
+ padding: 9px 16px 8px;
+}
+.btn-primary {
+ background-color: #238fe1;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active {
+ background-color: #068cd4;
+}
+.btn-default {
+ background-color: transparent;
+ color: #0086d3;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.open > .dropdown-toggle.btn-default {
+ color: #0086d3;
+ background-color: #e8f3fa;
+ box-shadow: none;
+}
+.btn-default.btn-danger {
+ color: #d14e4e;
+ background-color: transparent;
+}
+.btn-default.btn-danger:hover,
+.btn-default.btn-danger:focus,
+.btn-default.btn-danger:active {
+ color: #d14e4e;
+ background-color: #fcdfde;
+}
+.btn-link:active {
+ box-shadow: none;
+}
+.btn-muted {
+ color: #1a1a1a;
+ background-color: #f2f2f2;
+}
+
+.click {
+ cursor: pointer;
+}
+.click:hover {
+ text-decoration: underline;
+}
+
+.btn:focus,
+.btn:active:focus,
+button:focus,
+button:active:focus,
+input.form-control:focus,
+textarea.form-control:focus,
+input.form-control,
+textarea.form-control {
+ outline: none;
+ box-shadow: none;
+}
+input.form-control[disabled],
+textarea.form-control[disabled] {
+ cursor: auto;
+ background-color: #fff;
+}
+
+i.emoji {
+ font-style: normal;
+ box-sizing: content-box;
+}
+i.emoji > b {
+ font-weight: normal;
+}
+.emoji_default i.emoji {
+ background: none !important;
+}
+.emoji_image i.emoji {
+ width: 1.25em;
+ vertical-align: top;
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ background: no-repeat 2px 50%;
+ background-position-y: calc(50% - 1px);
+ background-size: 1.25em 1.25em;
+ text-indent: -10em;
+ padding: 3px 3px 3px 2px;
+ margin: -3px -2px;
+}
+.emoji_image .rtl i.emoji {
+ padding-left: 3px;
+ padding-right: 2px;
+}
+.emoji_image i.emoji > b {
+ letter-spacing: 12em;
+ pointer-events: none;
+}
+
+img.emoji {
+ width: 1.25em;
+ height: 1.25em;
+ padding: 0 1px;
+ vertical-align: top;
+ vertical-align: text-top;
+ box-sizing: content-box;
+ cursor: inherit;
+}
+a:hover img.emoji {
+ border-bottom: 1px solid;
+ padding: 0 2px;
+ margin: 0 -1px;
+}
+
+.form-control {
+ font-size: 14px;
+ padding: 12px 0;
+}
+
+.container,
+.container-fluid {
+ position: relative;
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 0;
+ padding-right: 0;
+ width: auto;
+ max-width: 920px;
+ box-sizing: content-box;
+}
+
+.bg-image {
+ background: #f7f7f7 no-repeat center;
+ background-size: cover;
+}
+.strong {
+ font-weight: 500;
+}
+
+.th-aside {
+ margin: -5px 15px 0;
+}
+.th-content {
+ position: relative;
+ margin: 0 0 75px;
+}
+
+.th-header,
+.th-markdown h3,
+.th-markdown h4 {
+ font-size: 13px;
+ line-height: 17px;
+ font-weight: bold;
+ padding: 2px 0;
+ margin: 25px 0 7px;
+ text-transform: uppercase;
+}
+.th-markdown h5,
+.th-markdown h6 {
+ font-size: 14px;
+ line-height: 21px;
+ font-weight: 500;
+ padding: 0;
+ margin: 15px 0 4px;
+}
+li.th-logo:last-child .th-logo-title {
+ display: inline;
+}
+.th-content .th-header {
+ margin-left: 15px;
+}
+
+.th-article {
+ margin: 15px 0 0;
+}
+.th-article-date {
+ display: block;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 23px;
+ margin-bottom: 2px;
+}
+.th-article-text,
+.th-markdown p {
+ font-size: 14px;
+ line-height: 21px;
+ margin: 0;
+}
+
+.th-list-empty-wrap {
+ transition: opacity .2s ease, visibility .2s ease;
+}
+.th-list-empty-wrap.ohide {
+ height: 0;
+}
+.th-list-empty {
+ font-size: 14px;
+ line-height: 22px;
+ color: #70767b;
+ padding: 32px 0;
+ text-align: center;
+}
+
+.th-contest {
+ display: block;
+ font-size: 14px;
+ line-height: 22px;
+ padding: 15px 0;
+}
+a.th-contest:hover {
+ text-decoration: none;
+}
+.th-contest + .th-contest {
+ border-top: 1px solid #f0f0f0;
+}
+.th-contest-title {
+ font-weight: 500;
+ color: #000;
+}
+.th-contest-period {
+ color: #70767b;
+}
+.th-badge {
+ font-size: 11px;
+ line-height: 13px;
+ padding: 3px 5px 2px;
+ text-transform: uppercase;
+ display: inline-block;
+ vertical-align: 1px;
+ margin-left: 10px;
+ border-radius: 3px;
+ background-color: #70767b;
+ color: #fff;
+}
+.th-badge-new {
+ background-color: #238fe1;
+}
+.th-header .th-badge {
+ margin-top: -1px;
+}
+
+
+a.th-dl-button {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ display: block;
+ font-size: 15px;
+ color: #FFF;
+ background: #3092e6;
+ padding: 1px 15px;
+ height: 42px;
+ line-height: 41px;
+ text-align: center;
+ white-space: nowrap;
+ z-index: 10;
+}
+a.th-dl-button:hover,
+a.th-dl-button:active {
+ color: #FFF;
+ background: #2789DE;
+ text-decoration: none;
+}
+.th-dl-button-try {
+ padding: 4px 11px;
+ border: 1px solid #fff;
+ border-radius: 3px;
+ margin-left: 12px;
+}
+.th-main {
+ display: flex;
+ min-width: 320px;
+ min-height: 100vh;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: wrap;
+ padding: 40px 0 0;
+}
+.th-main-content {
+ text-align: center;
+ padding: 40px 10px 50px;
+ max-width: 360px;
+}
+.th-main-content h1 {
+ font-size: 19px;
+ margin: 30px 0 12px;
+}
+.th-main-content p {
+ font-size: 15px;
+ line-height: 21px;
+}
+.th-dl-button b,
+.th-main-content b {
+ font-weight: 500;
+}
+.th-main-icon {
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ background: url('data:image/svg+xml,%3Csvg height="100" viewBox="0 0 99 100" width="99" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="%230f9ae4" fill-rule="evenodd" transform="translate(1 10)"%3E%3Cpath d="m27.3299021 54.5971404h-18.10461067c-1.43756152 0-2.60293538-1.1653738-2.60293538-2.6029353v-4.6001193c0-1.4375615 1.16537386-2.6029354 2.60293538-2.6029354h44.33143827c1.4375615 0 2.6029354 1.1653739 2.6029354 2.6029354v4.6001193c0 1.4375615-1.1653739 2.6029353-2.6029354 2.6029353h-18.7064012c1.6846715 5.5624133 2.909254 13.7612262 3.8405519 18.6182864 1.5083556 7.8666285-3.3765692 10.8252812-7.5417783 10.8252812-4.1652092 0-9.050134-4.0981559-7.5417784-11.9647845.9094191-4.7429541 2.0985044-12.2582658 3.7225784-17.4787831zm6.318501 23.0116168c1.1715729-1.1715728 1.1715729-3.0710678 0-4.2426407-1.1715728-1.1715728-3.0710678-1.1715728-4.2426406 0-1.1715729 1.1715729-1.1715729 3.0710679 0 4.2426407 1.1715728 1.1715729 3.0710678 1.1715729 4.2426406 0z" transform="matrix(.70710678 .70710678 -.70710678 .70710678 54.743154 -3.329808)"/%3E%3Cpath d="m77.1933507 24.2305175c-.7172516 2.1075474-1.3658738 3.7094858-1.9458666 4.8058152-1.0903132 2.0609607-2.8787787 4.7364008-5.3653967 8.0263201l-.0000567-.0000428c-.1665298.2203272-.1229184.5339368.0974089.7004666.1359339.1027429.3148283.1291989.4746818.0701988 2.214469-.8173353 3.8392008-1.5394142 4.8741954-2.1662369 2.7545174-1.6682153 5.2193283-4.9280761 6.789222-5.748253.0547696-.0286138.1094841-.0570595.1641434-.0853368l3.4642799 3.8146338c1.4658869 1.6141369 1.3689762 4.1049302-.2178938 5.6002917l-19.6429269 18.5101969c-1.5505328 1.4611198-3.9741965 1.4505083-5.5118758-.0241324l-22.7127168-21.7815899c-1.5599561-1.4960042-1.6493731-3.9606385-.2019256-5.5657514 3.4953029-3.876034 6.5445731-8.1539982 9.1478107-12.8338925 2.7821293-5.0014916 4.9920761-10.32968627 6.6298403-15.98458416l-.0000102-.00000297c.251986-.87006109 1.1615848-1.37110997 2.0316459-1.119124.2915046.08442519.5538686.24807467.7578989.47273924z"/%3E%3C/g%3E%3C/svg%3E') no-repeat center;
+}
+a.th-login-editor-btn {
+ margin-top: 25px;
+ display: inline-block;
+ font-size: 14px;
+ line-height: 20px;
+ padding: 11px 25px;
+ font-weight: 500;
+ text-transform: uppercase;
+ border-radius: 4px;
+ background-color: #3092e6;
+ color: #fff;
+ cursor: pointer;
+}
+a.th-login-editor-btn:hover {
+ background-color: #2789DE;
+ text-decoration: none;
+ color: #fff;
+}
+.th-login-editor-btn:before {
+ display: inline-block;
+ content: '';
+ width: 20px;
+ height: 17px;
+ margin-right: 15px;
+ vertical-align: top;
+ position: relative;
+ top: 2px;
+ background: url('data:image/svg+xml,%3Csvg height="17" viewBox="0 0 20 17" width="20" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="m1.375 7.318c5.369-2.399 8.949-3.98 10.74-4.744 5.114-2.182 6.177-2.561 6.87-2.574.152-.003.493.036.713.22.187.155.238.364.262.511.025.147.055.482.031.744-.277 2.987-1.476 10.235-2.086 13.58-.259 1.416-.767 1.89-1.259 1.937-1.069.101-1.882-.725-2.917-1.422-1.621-1.09-1.636-.811-3.174-1.911-1.376-.983-1.084-2.256-.048-3.36.271-.289 3.799-4.174 3.89-4.573.011-.05.138-.698.03-.796-.107-.098-.606-.101-.72-.075-.163.038-2.447 1.6-6.852 4.686-.735.518-1.401.77-1.997.757-.658-.015-1.923-.382-2.863-.695-1.153-.385-2.07-.588-1.99-1.241.041-.34.498-.688 1.37-1.044z" fill="%23fff" fill-rule="evenodd"/%3E%3C/svg%3E') no-repeat;
+}
+
+.th-theme {
+ display: block;
+ font-size: 14px;
+ line-height: 22px;
+ padding: 16px 15px 16px 30px;
+ margin: 0 -15px;
+ position: relative;
+ min-height: 68px;
+ transition: all .2s ease;
+}
+a.th-theme:hover {
+ text-decoration: none;
+}
+a.th-theme:focus {
+ box-shadow: none;
+ outline: none;
+}
+.th-theme + .th-theme {
+ margin-top: 1px;
+}
+.th-theme + .th-theme:before {
+ position: absolute;
+ display: block;
+ content: '';
+ border-top: 1px solid #f0f0f0;
+ margin: 0 15px;
+ top: -1px;
+ left: 90px;
+ right: 0;
+}
+.th-theme-photo {
+ display: inline-block;
+ vertical-align: top;
+ width: 44px;
+ height: 44px;
+ border-radius: 22px;
+ background: #efefef;
+ text-align: center;
+ overflow: hidden;
+ margin-right: 12px;
+ float: left;
+}
+.th-theme-photo img {
+ width: 100%;
+}
+.th-theme-photo .photo-char {
+ font-size: 20px;
+ vertical-align: middle;
+ line-height: 44px;
+ color: #999;
+}
+.th-theme-title {
+ font-size: 15px;
+ font-weight: 500;
+ color: #000;
+}
+.th-theme-label {
+ color: #808080;
+}
+.th-theme-thumb {
+ display: inline-block;
+ width: 74px;
+ height: 46px;
+ float: left;
+ margin: -1px 16px -1px 0;
+ border-radius: 5px;
+ background: #efefef no-repeat center;
+ background-size: cover;
+ overflow: hidden;
+}
+.th-theme-edit-btn {
+ float: right;
+ margin: 6px 0 6px 12px;
+}
+
+.th-theme-header {
+ margin: 30px 0 20px 15px;
+ transition: all .2s ease;
+}
+.th-theme-header-body {
+ max-width: 100%;
+ padding: 5px 15px 5px 0;
+ float: left;
+}
+.th-theme-header .th-theme-thumb {
+ margin-top: 1px;
+ margin-bottom: 1px;
+}
+.th-theme-header .th-theme-title {
+ font-size: 19px;
+ line-height: 25px;
+}
+.th-theme-header .th-theme-label {
+ margin-top: 5px;
+}
+.th-theme-header .th-theme-title,
+.th-theme-header .th-theme-label {
+ margin-left: 90px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.th-theme-header .th-theme-buttons {
+ float: right;
+ padding: 5px 0;
+ margin: 4px 15px 4px 18px;
+ transition: all .2s ease;
+}
+.th-theme-buttons .btn {
+ float: right;
+ padding: 12px 20px 10px;
+}
+.th-theme-buttons .btn ~ .btn {
+ margin-right: 10px;
+}
+.header-btn-wrap .th-theme-buttons {
+ margin: 2px 15px;
+}
+.header-btn-wrap .th-theme-buttons .btn {
+ padding: 9px 18px 7px;
+}
+
+.th-theme-placeholder {
+ padding: 83px 20px;
+ text-align: center;
+ color: #6b6e70;
+}
+
+.th-theme-source-placeholder {
+ position: absolute;
+ border: 1px solid #e0e0e0;
+ background: #fff;
+ width: 100%;
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+.th-theme-ph-icon {
+ display: inline-block;
+ width: 100px;
+ height: 75px;
+ background: url('data:image/svg+xml,%3Csvg height="100" viewBox="0 0 100 100" width="100" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg transform="translate(3 28)"%3E%3Cellipse cx="15.144928" cy="44.604" fill="%23b0b5b9" rx="2.391304" ry="2.3895"/%3E%3Cg stroke="%23b0b5b9" stroke-width="3"%3E%3Cpath d="m15.3715001 35.7495h-9.00184687c-1.70492762 0-3.08704453-1.3821169-3.08704453-3.0870445v-3.197911c0-1.7049276 1.38211691-3.0870445 3.08704453-3.0870445h27.11576597c1.7049277 0 3.0870446 1.3821169 3.0870446 3.0870445v3.197911c0 1.7049276-1.3821169 3.0870445-3.0870446 3.0870445h-9.3852697c.206947.8758938.4121073 1.8418942.6220916 2.9141213.2731117 1.39457 1.0405032 5.708952 1.1417756 6.2348279.9880491 5.1306323-1.9487771 8.3740508-6.0843967 8.3740508-4.0352661 0-7.0768151-3.9144561-6.0843968-9.0677766.0166922-.0866775.8030719-4.3734735 1.0846051-5.7639316.1991151-.9834052.3944975-1.876227.5916718-2.6912918z" transform="matrix(.70710678 .70710678 -.70710678 .70710678 33.997168 -2.426423)"/%3E%3Cpath d="m20.9827863 20.3419695c2.6373452-2.7862367 4.8531008-5.9254117 6.6491303-9.4213645 1.5944154-3.10351318 2.8204251-6.40139185 3.6782858-9.89607714.3020098-1.23011078 1.5440173-1.98252205 2.7741489-1.68055451.4152612.10193658.7937574.31792949 1.0927589.62359449l19.1544605 19.58133886c1.4837739 1.5168414 1.4741029 3.9441897-.0217103 5.44916l-14.2812632 14.36869-20.1089697-17.9016076z" transform="matrix(.99939083 .0348995 -.0348995 .99939083 .687639 -1.314761)"/%3E%3C/g%3E%3C/g%3E%3Cg fill="%23b0b5b9"%3E%3Ccircle cx="30.75" cy="10.444444" r="3.077904" transform="matrix(.70710678 .70710678 -.70710678 .70710678 64.391804 -5.684427)"/%3E%3Cpath d="m49.5 71c.8284271 0 1.5.6715729 1.5 1.5v6c0 3.5898509 2.9101491 6.5 6.5 6.5h21c4.1421356 0 7.5-3.3578644 7.5-7.5v-54c0-4.1421356-3.3578644-7.5-7.5-7.5h-21.5c-3.3137085 0-6 2.6862915-6 6v4.5c0 .8284271-.6715729 1.5-1.5 1.5-.8284271 0-1.5-.6715729-1.5-1.5v-6c0-4.1421356 3.3578644-7.5 7.5-7.5h23.5c5.5228475 0 10 4.4771525 10 10v55c0 5.5228475-4.4771525 10-10 10h-22.5c-4.6944204 0-8.5-3.8055796-8.5-8.5v-7c0-.8284271.6715729-1.5 1.5-1.5z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E') no-repeat -9px -13px;
+}
+.th-theme-ph-title {
+ font-size: 18px;
+ line-height: 24px;
+ font-weight: 500;
+ margin: 10px 0 15px;
+}
+.th-theme-ph-buttons {
+ margin: 30px 0 0;
+}
+.th-no-content .th-theme-buttons,
+.th-no-content .th-theme-source-code-wrap,
+.th-no-content .th-theme-thumb svg {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+.th-no-content .th-theme-source-code-wrap .CodeMirror {
+ height: 376px;
+}
+.th-no-content .th-theme-source-placeholder {
+ opacity: 1;
+ visibility: visible;
+ pointer-events: auto;
+}
+.th-theme-import-btn {
+ margin: 4px 0;
+}
+
+.th-theme-content-buttons {
+ text-align: center;
+ margin: 30px 0;
+}
+
+.th-theme-thumb svg,
+.th-theme-source-placeholder,
+.th-theme-source-code-wrap {
+ transition: all .2s ease;
+}
+.th-theme-source-code-wrap .CodeMirror {
+ border: 1px solid #e0e0e0;
+ min-height: 376px;
+ height: auto;
+ border-width: 1px 0;
+}
+.th-theme-source-code-wrap .CodeMirror pre {
+ font-size: 14px;
+ line-height: 18px;
+ padding: 0 14px;
+}
+.th-theme-source-code-wrap .CodeMirror-lines {
+ padding: 7px 0;
+}
+.th-theme-source-code-wrap .CodeMirror-widget {
+ display: inline-block;
+ position: relative;
+ vertical-align: top;
+}
+.th-theme-source-code-wrap .codemirror-colorview {
+ position: absolute;
+ top: 0;
+ vertical-align: top;
+ margin: 2px 7px 2px 0;
+ border: 1px solid #ededed;
+ width: 14px;
+ height: 14px;
+ border-radius: 7px;
+}
+.th-theme-source-code-wrap .codemirror-colorview .codemirror-colorview-background {
+ border-radius: 7px;
+}
+body .codemirror-colorpicker .colorpicker-body > .colorsets > .menu {
+ display: none;
+}
+body .codemirror-colorpicker .colorpicker-body > .colorsets > .color-list {
+ margin-right: 6px;
+}
+body .codemirror-colorpicker .colorpicker-body > .colorsets > .color-list .add-color-item {
+ line-height: 13px;
+}
+.th-theme-source-code-wrap .codemirror-colorview,
+body .codemirror-colorpicker .colorpicker-body > .colorsets > .color-list .color-item .empty,
+body .codemirror-colorpicker .colorpicker-body > .control > .opacity > .opacity-container,
+body .codemirror-colorpicker .colorpicker-body > .control > .empty,
+body .codemirror-colorpicker .colorpicker-body > .colorsets > .color-list .color-item .empty,
+body .codemirror-colorpicker .colorpicker-body > .color-chooser .color-chooser-container .colorsets-list .colorsets-item .items .color-item {
+ vertical-align: top;
+ background-image: url('data:image/gif;base64,R0lGODlhGAAYAIABAKysrP///yH5BAEAAAEALAAAAAAYABgAAAIyhI8Wy70JgZshJuoswk0fzngKWIlk6Z2iRK6q2cIn6Maprb03LXM1v/P1MD9hkDikrAoAOw==');
+ background-size: 12px;
+ background-position: center;
+}
+body .codemirror-colorpicker .colorpicker-body > .information > .information-item > .input-field .postfix {
+ line-height: 19px;
+ padding-right: 4px;
+}
+body .codemirror-colorpicker .colorpicker-body > .control > .opacity > .opacity-container > .color-bar {
+ border-radius: 3px;
+}
+.th-theme-source-code {
+ font-family: monospace, 'Courier New';
+ font-size: 14px;
+ line-height: 18px;
+ padding: 7px 14px;
+ border: 1px solid #e0e0e0;
+ color: #000;
+}
+.cm-keycol,
+.cm-valcol {
+ display: inline-block;
+ box-sizing: content-box;
+}
+.cm-valcol,
+.cm-val {
+ padding-left: 21px;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #e0e0e0;
+ margin-bottom: -1px;
+ position: relative;
+ z-index: 1;
+}
+.nav-tabs>li>a {
+ text-transform: uppercase;
+ font-weight: 500;
+ position: relative;
+ border-radius: 0;
+ border: none;
+ color: #999;
+}
+.nav-tabs>li>a:hover,
+.nav-tabs>li>a:focus {
+ background-color: transparent;
+}
+.nav-tabs>li.active>a,
+.nav-tabs>li.active>a:hover,
+.nav-tabs>li.active>a:focus {
+ color: #0088cc;
+ border: none;
+}
+.nav-tabs>li.active>a:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 4px;
+ border-radius: 2px 2px 0 0;
+ background-color: #238fe1;
+}
+
+
+
+
+.th-back {
+ padding: 18px 19px;
+ vertical-align: top;
+ margin: 0 0 0 -15px;
+ cursor: pointer;
+}
+.th-back:before {
+ position: relative;
+ top: 2px;
+ content: '';
+ display: inline-block;
+ width: 18px;
+ height: 16px;
+ background: url('/img/translations/icons.png?8') no-repeat -5px -105px;
+}
+@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
+ .th-back:before {
+ background-image: url('/img/translations/icons_2x.png?8');
+ background-size: 26px 752px;
+ }
+}
+
+.th-subheader {
+ font-size: 16px;
+ font-weight: 500;
+ padding: 15px 0;
+ margin: 0;
+}
+.th-subheader .th-badge {
+ font-size: 12px;
+ line-height: 18px;
+ padding: 3px 7px 2px;
+ min-width: 19px;
+ margin-left: 7px;
+}
+
+.th-section-block {
+ padding: 20px 15px 0 56px;
+}
+.th-actions {
+ display: inline-block;
+ margin-left: -13px;
+}
+.th-action-item {
+ display: block;
+ position: relative;
+ padding: 11px 40px 11px 58px;
+ font-weight: 500;
+}
+/*.th-action-item:hover {
+ text-decoration: none;
+}
+.th-action-item .th-action-label:hover {
+ text-decoration: underline;
+}*/
+.th-action-item:before {
+ position: absolute;
+ top: 4px;
+ left: 6px;
+ display: inline-block;
+ width: 32px;
+ height: 32px;
+ content: '';
+ background: url('/img/translations/icons.png?8') no-repeat -10px -548px;
+}
+@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
+ .th-action-item:before {
+ background-image: url('/img/translations/icons_2x.png?8');
+ background-size: 26px 752px;
+ }
+}
+.action-share:before {
+ background-position: 6px -453px;
+}
+.action-edit:before {
+ background-position: 4px -485px;
+}
+.action-team:before {
+ background-position: 1px -514px;
+}
+
+.arrow-link {
+ font-size: 15px;
+ font-weight: 500;
+ cursor: pointer;
+}
+.arrow-link:after {
+ display: inline-block;
+ width: 8px;
+ height: 12px;
+ content: '';
+ background: url('/img/translations/icons.png?8') no-repeat -10px -548px;
+ margin-left: 7px;
+ vertical-align: -1px;
+}
+@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
+ .arrow-link:after {
+ background-image: url('/img/translations/icons_2x.png?8');
+ background-size: 26px 752px;
+ }
+}
+
+.form-group .input {
+ direction: ltr;
+ unicode-bidi: isolate;
+}
+.form-group.rtl {
+ text-align: right;
+}
+.form-group.rtl .input {
+ direction: rtl;
+}
+
+.fill {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+
+.fullname {
+ font-weight: 500;
+ border-bottom: 1px solid #de8833;
+}
+.my.fullname {
+ border-bottom: 3px double #de8833;
+}
+a.fullname:hover {
+ text-decoration: none;
+ border-bottom-color: inherit;
+}
+
+.close {
+ position: relative;
+ width: 22px;
+ height: 22px;
+ opacity: 1;
+}
+.close:hover {
+ opacity: 1;
+}
+.close:before,
+.close:after {
+ display: inline-block;
+ position: absolute;
+ background: #c0c0c0;
+ left: 50%;
+ top: 50%;
+ content: '';
+ width: 16px;
+ height: 2px;
+ margin: -1px 0 0 -8px;
+ border-radius: 1px;
+ transform: rotateZ(45deg) scaleY(.95);
+ transition: background-color .2s ease;
+}
+.close:after {
+ transform: rotateZ(-45deg) scaleY(.95);
+}
+.close:hover:before,
+.close:hover:after {
+ background: #a8a8a8;
+}
+
+.arrow-left,
+.arrow-right {
+ display: inline-block;
+ width: 16px;
+ height: 14px;
+ position: relative;
+ opacity: 0.4;
+ transition: opacity .2s ease;
+}
+.arrow-left:before,
+.arrow-left:after,
+.arrow-right:before,
+.arrow-right:after {
+ display: inline-block;
+ position: absolute;
+ content: '';
+ left: 0;
+ top: 50%;
+}
+.arrow-left:before,
+.arrow-right:before {
+ transform: rotateZ(45deg);
+ width: 10px;
+ height: 10px;
+ border: 2px solid #222;
+ margin: -5px 0 0 2px;
+ border-width: 0 0 2px 2px;
+}
+.arrow-left:after,
+.arrow-right:after {
+ background: #222;
+ width: 14px;
+ height: 2px;
+ margin: -1px 0 0 2px;
+}
+.arrow-right:before {
+ margin-left: 4px;
+ border-width: 2px 2px 0 0;
+}
+.arrow-right:after {
+ margin-left: 0;
+}
+
+.binding {
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: 400;
+ font-size: 92%;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.binding:before {
+ content: "\e144";
+}
+
+.ohide {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+
+.shide {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ height: 0 !important;
+}
+
+.sxhide {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ width: 0 !important;
+}
+
+.no-transition,
+.no-transition * {
+ transition: none !important;
+}
+
+.nav-pills > li > a {
+ padding: 10px 15px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 15px;
+ font-weight: 500;
+ line-height: 22px;
+}
+.nav-pills > li.divider {
+ border-bottom: 1px solid #ededed;
+ padding-bottom: 7px;
+ margin-bottom: 7px;
+}
+.nav-pills > li > a .th-badge {
+ font-size: 11px;
+ padding: 2px 5px 0;
+ margin-top: 2px;
+ background: #0f9ae4;
+ float: right;
+}
+.nav-pills > li.active > a .th-badge {
+ background: #fff;
+ color: #0f9ae4;
+}
+.nav-stacked > li + li {
+ margin-top: 0;
+}
+
+.popup-buttons .btn-link {
+ padding: 10px 15px 8px;
+ border-radius: 2px;
+}
+.popup-buttons .btn-link + .btn-link {
+ margin-left: 2px;
+}
+.popup-buttons .btn-link:hover {
+ background: #e6f1f7;
+ text-decoration: none;
+}
+.popup-buttons .btn-link:active {
+ background: #d4e6f1;
+}
+.popup-buttons .btn-link:focus {
+ text-decoration: none;
+}
+.btn.disabled,
+.btn[disabled],
+.popup-buttons .btn-link.disabled,
+.popup-buttons .btn-link[disabled] {
+ color: #b5d1e6;
+ opacity: 1;
+}
+
+.input {
+ white-space: pre-wrap;
+ position: relative;
+ z-index: 0;
+}
+.input.empty[data-placeholder] {
+ position: relative;
+}
+.input.empty[data-placeholder]:before {
+ position: absolute;
+ left: 0;
+ right: 0;
+ content: attr(data-placeholder);
+ transition: color .2s ease;
+ color: #919699;
+ font-weight: normal;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ pointer-events: none;
+ z-index: -1;
+}
+.input.empty[data-placeholder]:focus:before {
+ color: #ccc;
+}
+input.th-form-control,
+textarea.th-form-control,
+.input.th-form-control {
+ padding-left: 0;
+ padding-right: 0;
+ border: none;
+ height: auto;
+ resize: none;
+ box-shadow: inset 0 -1px 0 #f0f0f0;
+ transition: box-shadow .2s ease, color .2s ease;
+}
+input.th-form-control + .th-form-control-underline {
+ box-shadow: 0 -1px 0 #f0f0f0;
+ transition: box-shadow .2s ease;
+ margin-bottom: -2px;
+ height: 2px;
+}
+input.th-form-control[readonly],
+textarea.th-form-control[readonly],
+.input.th-form-control[readonly],
+input.th-form-control[disabled],
+textarea.th-form-control[disabled],
+.input.th-form-control[disabled] {
+ cursor: auto;
+ background: #fff;
+}
+input.th-form-control:focus,
+textarea.th-form-control:focus,
+.input.th-form-control:focus {
+ box-shadow: inset 0 -2px 0 #39ade7;
+}
+input.th-form-control:focus + .th-form-control-underline {
+ box-shadow: 0 -2px 0 #39ade7;
+}
+input.th-form-control[readonly]:focus,
+textarea.th-form-control[readonly]:focus,
+.input.th-form-control[readonly]:focus,
+input.th-form-control[disabled]:focus,
+textarea.th-form-control[disabled]:focus,
+.input.th-form-control[disabled]:focus {
+ box-shadow: inset 0 -1px 0 #f0f0f0;
+}
+.input.th-form-control {
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.input.th-form-control::-webkit-scrollbar {
+ display: none;
+}
+
+.login-popup-container section {
+ line-height: 23px;
+ max-width: 600px;
+}
+.login-popup-container h2 {
+ font-size: 24px;
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+.login-popup-container p {
+ margin-bottom: 18px;
+}
+.login-popup-container p.help-block {
+ margin-top: 18px;
+ margin-bottom: -7px;
+}
+.login-popup-container .form-control {
+ max-width: 280px;
+}
+
+.dots-animated:after {
+ position: absolute;
+ display: inline-block;
+ animation: dotty steps(1, end) 1s infinite;
+ content: '...';
+}
+
+@-webkit-keyframes dotty {
+ 0%, 100% { content: ''; }
+ 25% { content: '.'; }
+ 50% { content: '..'; }
+ 75% { content: '...'; }
+}
+@keyframes dotty {
+ 0%, 100% { content: ''; }
+ 25% { content: '.'; }
+ 50% { content: '..'; }
+ 75% { content: '...'; }
+}
+
+@-webkit-keyframes upload-circle {
+ from { transform: rotateZ(-90deg); }
+ to { transform: rotateZ(270deg); }
+}
+@keyframes upload-circle {
+ from { transform: rotateZ(-90deg); }
+ to { transform: rotateZ(270deg); }
+}
+
+header {
+ width: 100%;
+ margin: 0;
+ position: fixed;
+ z-index: 100;
+ background: #fff;
+}
+header .header-wrap {
+ padding: 9px 0 8px;
+ position: relative;
+ background: #fff;
+ box-shadow: 0 1px rgba(0, 0, 0, .12);
+ z-index: 2;
+}
+header + main {
+ padding-top: 59px;
+}
+
+header.has-search + main section.th-content {
+ padding-top: 49px;
+}
+header.has-message + main {
+ margin-top: 112px;
+}
+header .btn-lg {
+ padding: 11px 12px 10px;
+}
+.header-panel {
+ position: relative;
+ padding: 0 15px;
+ z-index: 7;
+}
+.header-panel .header-breadcrumb {
+ height: 41px;
+ overflow: hidden;
+}
+.header-auth {
+ float: right;
+ margin-left: 15px;
+}
+.header-btn-wrap {
+ float: right;
+ transition: all .2s ease;
+ width: 0;
+}
+.header-btn-oshow .header-btn-wrap {
+ opacity: 1;
+ visibility: visible;
+ pointer-events: auto;
+ width: auto;
+}
+.header-btn-wrap,
+.header-btn-oshow .th-theme-header {
+ opacity: 0;
+ visibility: visible;
+ pointer-events: auto;
+}
+.header-auth-item {
+ display: inline-block;
+ vertical-align: top;
+ padding: 11px 0;
+ font-weight: 500;
+ white-space: nowrap;
+}
+.header-auth-item + .header-auth-item {
+ margin-left: 15px;
+}
+.header-auth-link {
+ display: inline-block;
+ vertical-align: top;
+}
+.header-auth-photo {
+ display: inline-block;
+ vertical-align: top;
+ width: 32px;
+ height: 32px;
+ border-radius: 16px;
+ background: #efefef;
+ text-align: center;
+ overflow: hidden;
+ margin: -7px 0 -7px 0;
+}
+.header-auth-photo img {
+ width: 100%;
+}
+.header-auth-photo .photo-char {
+ font-size: 14px;
+ vertical-align: middle;
+ line-height: 32px;
+ color: #999;
+}
+.header-search-item {
+ padding-bottom: 18px;
+ margin-bottom: -18px;
+ overflow: hidden;
+}
+.header-auth-name {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 190px;
+ color: #0086d3;
+}
+.header-auth-name:after {
+ content: '';
+ display: inline-block;
+ width: 12px;
+ height: 7px;
+ background: url('/img/translations/icons.png?8') no-repeat -7px -324px;
+ margin: 0 0 2px 7px;
+}
+@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
+ .header-auth-name:after {
+ background-image: url('/img/translations/icons_2x.png?8');
+ background-size: 26px 752px;
+ }
+}
+.header-auth-name.dropdown-toggle {
+ cursor: pointer;
+}
+.header-auth-name + .dropdown-menu {
+ top: -21px;
+ left: auto;
+ right: -4px;
+}
+@media (min-width: 1420px) {
+ .header-auth-name + .dropdown-menu {
+ left: -4px;
+ right: auto;
+ }
+}
+
+.header-message {
+ background: #1e98d4;
+ text-align: center;
+ color: #fff;
+ padding: 13px 15px;
+}
+.header-message a {
+ color: #fff;
+ text-decoration: underline;
+}
+.header-message .hide-button {
+ color: #fff;
+ margin: -11px -12px -10px 12px;
+ font-weight: normal;
+ float: right;
+}
+
+header .breadcrumb > .active,
+header .breadcrumb > .active a {
+ color: #222;
+}
+header .breadcrumb > .placeholder {
+ color: #999;
+}
+header .breadcrumb > li {
+ padding: 11px 0;
+ font-size: 15px;
+ line-height: 1.3333333;
+ font-weight: 500;
+ position: relative;
+}
+header .breadcrumb > li > a,
+header .breadcrumb > li.active > strong {
+ display: inline-block;
+ text-overflow: ellipsis;
+ vertical-align: top;
+ overflow: hidden;
+ max-width: 190px;
+}
+header .container-fluid .breadcrumb > li > a,
+header .container-fluid .breadcrumb > li.active > strong {
+ max-width: 240px;
+}
+header .breadcrumb > li.active > a {
+ overflow: visible;
+ max-width: none;
+}
+header .breadcrumb > li:before {
+ content: '';
+}
+header .breadcrumb > li:after {
+ content: "\00a0/\00a0";
+ padding: 0 8px;
+ color: #d4d4d4;
+}
+header .breadcrumb > li:last-child:after {
+ content: '';
+}
+header .input-group-addon.breadcrumb > li:last-child:after {
+ content: "\00a0/\00a0";
+}
+header .header-breadcrumb .dropdown {
+ position: static;
+}
+header .header-breadcrumb .dropdown-menu {
+ left: auto;
+ top: 48px;
+ margin: 0 0 0 -15px;
+ min-width: 0;
+ font-size: 15px;
+ border: none;
+ box-shadow: 0 0 2px rgba(0, 0, 0, .15);
+}
+header .header-breadcrumb .dropdown.open > .dropdown-menu {
+ display: inline;
+}
+header .header-breadcrumb .dropdown.open > .dropdown-menu > li {
+ display: block;
+}
+header .header-breadcrumb .dropdown.open > .dropdown-menu > li > a {
+ padding: 10px 35px 10px 15px;
+ margin: 0;
+ color: #2e87ca;
+}
+header .header-breadcrumb .dropdown.open > .dropdown-menu > li > a:hover {
+ background-color: #f0f6fa;
+ color: #2e87ca;
+}
+header .header-breadcrumb .dropdown.open > .dropdown-menu > li.active > a:hover,
+header .header-breadcrumb .dropdown.open > .dropdown-menu > li.active > a {
+ background-color: #1e98d4;
+ color: #fff;
+ font-weight: 500;
+ position: relative;
+}
+.buttons-wrap {
+ padding: 15px 0;
+}
+.buttons-wrap .btn {
+ margin-left: -15px;
+}
+
+.header-breadcrumb .breadcrumb {
+ background: none;
+ border: transparent;
+ padding: 0;
+ margin: 0;
+ overflow: visible;
+}
+.header-breadcrumb-simple .breadcrumb {
+ overflow: hidden;
+}
+.header-breadcrumb-simple .breadcrumb > .active {
+ display: inline;
+}
+.header-breadcrumb .input-label {
+ font-weight: normal;
+}
+.input-group .input-dropdown {
+ display: table-cell;
+ position: relative;
+}
+.input-dropdown .form-control {
+ height: auto;
+ border: transparent;
+ background: transparent;
+ color: #222;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ padding: 11px 16px 11px 1px;
+ margin-left: -1px;
+ border-radius: 0 !important;
+ transition: color .2s ease;
+}
+.form-control::-webkit-input-placeholder {
+ transition: color .2s ease;
+ color: #999;
+}
+.form-control::-moz-placeholder {
+ transition: color .2s ease;
+ color: #999;
+}
+.form-control:-ms-input-placeholder {
+ transition: color .2s ease;
+ color: #999;
+}
+.form-control:focus::-webkit-input-placeholder {
+ color: #ccc;
+}
+.form-control:focus::-moz-placeholder {
+ color: #ccc;
+}
+.form-control:focus:-ms-input-placeholder {
+ color: #ccc;
+}
+.has-section-status .input-dropdown .form-control {
+ padding-right: 50px;
+}
+
+
+.progress-bar {
+ width: 0;
+ transition: width .4s linear, box-shadow .3s ease;
+}
+.progress-bar.no-transition {
+ transition: none;
+}
+.progress-bar.no-shown {
+ box-shadow: inset 0 0 0 #39ade7;
+}
+
+header .progress-bar {
+ position: absolute;
+ z-index: 1;
+ bottom: 0;
+ height: 3px;
+ box-shadow: inset 0 -2px 0 #39ade7;
+}
+
+.btn-inactive {
+ cursor: auto;
+ pointer-events: none;
+}
+
+.nav-menu {
+ padding: 10px 0 30px;
+}
+@media (min-width: 768px) {
+ .nav-menu.nav-menu-can-fix {
+ position: fixed;
+ top: 68px;
+ bottom: 0;
+ overflow-y: scroll;
+ }
+ header.has-message + main .nav-menu.nav-menu-can-fix {
+ top: 112px;
+ }
+ .nav-menu.nav-menu-can-fix::-webkit-scrollbar {
+ display: none;
+ }
+}
+
+.section-header {
+ position: relative;
+ overflow: hidden;
+}
+
+.header-labels {
+ position: absolute;
+ font-size: 13px;
+ line-height: 16px;
+ height: 0;
+ bottom: 0;
+ right: 0;
+}
+.header-labels .help-labels {
+ position: relative;
+ white-space: nowrap;
+}
+.header-labels .help-label {
+ position: absolute;
+ padding: 4px 10px;
+ right: 0;
+ color: #aaa;
+}
+.header-labels .help-label a {
+ color: #555;
+ cursor: pointer;
+}
+
+section h3 .header-count {
+ margin-left: 10px;
+ color: #999;
+}
+
+.popup-form {
+ margin: 25px 0 0;
+ overflow: visible !important;
+}
+
+.radio-row {
+ display: block;
+ margin: 5px -5px;
+ padding: 5px;
+ font-weight: normal;
+ overflow: hidden;
+ cursor: pointer;
+}
+.radio-row .radio {
+ position: absolute;
+ left: -5000px;
+}
+.radio-row .radio + .radio-label {
+ position: relative;
+ line-height: 18px;
+ padding: 0;
+}
+.radio-row .radio + .radio-label:before {
+ display: inline-block;
+ content: '';
+ width: 18px;
+ height: 18px;
+ border-radius: 9px;
+ border: 2px solid #999;
+ vertical-align: top;
+ margin: 0 12px 0 0;
+ padding: 0;
+}
+.radio-row .radio:checked + .radio-label:before {
+ border-color: #319bd8;
+}
+.radio-row .radio:checked + .radio-label:after {
+ display: inline-block;
+ content: '';
+ width: 8px;
+ height: 8px;
+ border-radius: 4px;
+ background: #319bd8;
+ vertical-align: top;
+ margin: 5px;
+ padding: 0;
+ position: absolute;
+ left: 0;
+}
+.radio-row .radio.disabled + .radio-label,
+.radio-row .radio[disabled] + .radio-label {
+ opacity: 0.65;
+}
+
+.radio-item .radio-input + .radio-label,
+.checkbox-item .checkbox-input + .checkbox-label {
+ vertical-align: top;
+ line-height: 19px;
+ padding-top: 1px;
+}
+
+
+.section-label {
+ font-size: 15px;
+ font-weight: normal;
+ margin: 0 5px 0 12px;
+ float: right;
+}
+.section-label-success {
+ color: #449d44;
+}
+.section-label-danger {
+ color: #c9302c;
+}
+.section-label-info {
+ color: #31b0d5;
+}
+.section-btn .glyphicon,
+.section-label .glyphicon {
+ font-size: 17px;
+ position: static;
+ vertical-align: middle;
+}
+.section-btn .label {
+ padding: 0 4px;
+}
+.section-label .label {
+ padding: 0 2px;
+ vertical-align: middle;
+}
+
+.list-group-item-heading .section-label {
+ font-size: 13px;
+}
+.list-group-item-heading .section-label .glyphicon {
+ font-size: 14px;
+}
+
+#dev_page_content_wrap {
+ padding: 0 25px 10px;
+ max-width: none;
+}
+#dev_page_content,
+#dev_page_content p {
+ font-size: 15px;
+ line-height: 1.6;
+}
+#dev_page_content_wrap h1,
+#dev_page_content_wrap h2,
+#dev_page_content_wrap h3,
+#dev_page_content_wrap h4,
+.page-content-wrap h3 {
+ font-weight: 500;
+ position: relative;
+}
+#dev_page_content_wrap h1 {
+ font-size: 21px;
+ margin: 27px 0 12px;
+}
+#dev_page_content_wrap h2,
+#dev_page_content_wrap h3 {
+ font-size: 19px;
+ margin: 27px 0 12px;
+}
+#dev_page_content_wrap h4,
+#dev_page_content_wrap h5 {
+ font-size: 17px;
+ margin: 27px 0 10px;
+}
+#dev_page_content_wrap pre,
+#dev_page_content_wrap code {
+ font-family: monospace, 'Courier New';
+ font-size: 87%;
+}
+#dev_page_content_wrap pre {
+ line-height: 18px;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+ padding: 6px 12px;
+ border: none;
+ background: #f4f8fb;
+}
+#dev_page_content_wrap code {
+ color: inherit;
+ background: #ecf3f8;
+}
+#dev_page_content_wrap blockquote {
+ border-color: #179cde;
+ padding: 5px 17px;
+}
+#dev_page_content_wrap b,
+#dev_page_content_wrap strong {
+ font-weight: 500;
+}
+#dev_page_content_wrap .dev_page_image {
+ display: block;
+ max-width: 100% !important;
+ margin: 0 auto;
+ padding: 10px 0px 5px;
+}
+
+#dev_page_content_wrap a.anchor,
+.page-content-wrap a.anchor {
+ position: absolute;
+ height: 1px;
+ top: -70px;
+}
+header.has-message + main #dev_page_content_wrap a.anchor,
+header.has-message + main .page-content-wrap a.anchor {
+ top: -114px;
+}
+#dev_page_content_wrap a.anchor-link,
+.page-content-wrap a.anchor-link {
+ text-decoration: none;
+ line-height: 1;
+ margin-left: -0.7em;
+
+ cursor: default;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+
+ border-top: 10px solid transparent;
+ margin-top: -10px;
+ outline: 0;
+}
+
+#dev_page_content_wrap a.anchor-link i.anchor-icon,
+.page-content-wrap a.anchor-link i.anchor-icon {
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: 400;
+ font-size: 62%;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ margin-top: 2px;
+ opacity: 0;
+
+ cursor: pointer;
+ padding: 0;
+ position: relative;
+ z-index: 10;
+
+ -webkit-transition: opacity .2s ease-in-out;
+ -moz-transition: opacity .2s ease-in-out;
+ -ms-transition: opacity .2s ease-in-out;
+ -o-transition: opacity .2s ease-in-out;
+ transition: opacity .2s ease-in-out;
+}
+#dev_page_content_wrap a.anchor-link i.anchor-icon:before,
+.page-content-wrap a.anchor-link i.anchor-icon:before {
+ content: "\e144";
+}
+@media (min-width: 992px) {
+ #dev_page_content_wrap a.anchor-link,
+ .page-content-wrap a.anchor-link {
+ margin-left: -1.1em;
+ }
+ #dev_page_content_wrap a.anchor-link i.anchor-icon,
+ .page-content-wrap a.anchor-link i.anchor-icon {
+ font-size: 85%;
+ }
+}
+
+#dev_page_content_wrap h1 a.anchor-link i.anchor-icon {
+ margin-top: 4px;
+}
+
+#dev_page_content_wrap h1:hover a.anchor-link i.anchor-icon,
+#dev_page_content_wrap h2:hover a.anchor-link i.anchor-icon,
+#dev_page_content_wrap h3:hover a.anchor-link i.anchor-icon,
+#dev_page_content_wrap h4:hover a.anchor-link i.anchor-icon,
+.page-content-wrap h3:hover a.anchor-link i.anchor-icon {
+ opacity: 0.6;
+}
+#dev_page_content_wrap i.anchor-icon:hover,
+.page-content-wrap i.anchor-icon:hover {
+ opacity: 1 !important;
+}
+
+#dev_side_nav_cont .dev_side_nav_wrap {
+ position: relative;
+ display: none;
+}
+@media (min-width: 768px) {
+ #dev_side_nav_cont .dev_side_nav_wrap {
+ display: block;
+ }
+}
+#dev_side_nav_cont .dev_side_nav {
+ position: static;
+ width: auto;
+}
+#dev_side_nav_cont .dev_side_nav > ul {
+ width: auto;
+ float: none;
+ background: none;
+ padding: 7px 0;
+}
+#dev_side_nav_cont .dev_side_nav > ul::-webkit-scrollbar {
+ display: none;
+}
+#dev_side_nav_cont .dev_side_nav > ul.affix-top,
+#dev_side_nav_cont .dev_side_nav > ul.affix,
+#dev_side_nav_cont .dev_side_nav > ul.affix-bottom {
+ position: static;
+}
+#dev_side_nav_cont .dev_side_nav li {
+ float: none !important;
+}
+#dev_side_nav_cont .dev_side_nav li:before {
+ display: none;
+}
+#dev_side_nav_cont .dev_side_nav li a {
+ border-left: 3px solid transparent;
+ padding: 9px 15px 9px 12px;
+ font-size: 13px;
+ font-weight: normal;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: block;
+}
+#dev_side_nav_cont .dev_side_nav li li a {
+ padding: 6px 15px 6px 22px;
+ font-size: 12px;
+ font-weight: 400;
+}
+#dev_side_nav_cont .dev_side_nav li a:hover {
+ background: #f0f6fa !important;
+}
+#dev_side_nav_cont .dev_side_nav li.active > a {
+ border-left: 3px solid #1e98d4;
+}
+#dev_side_nav_cont .dev_side_nav li ul {
+ display: none;
+}
+#dev_side_nav_cont .dev_side_nav li.active ul {
+ display: block;
+}
+
+main.intro,
+main.docs {
+ padding-bottom: 43px;
+}
+
+main.docs #dev_page_content_wrap h1#dev_page_title {
+ font-size: 24px;
+ margin: 12px 0 12px;
+}
+
+main.intro #dev_page_content_wrap h1#dev_page_title {
+ padding: 12px 0 12px;
+ margin: 0;
+ font-weight: 500;
+ font-size: 18px;
+}
+
+.popup-container {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: rgba(0,0,0,.6);
+ z-index: 101;
+ display: -webkit-flex;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.popup {
+ max-width: 100%;
+ word-wrap: break-word;
+ margin: 15px;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: 0 0 12px rgba(0, 0, 0, .3);
+}
+.popup section {
+ position: relative;
+ padding-bottom: 60px;
+}
+.popup h4 {
+ font-size: 18px;
+ margin: 5px 0 15px;
+}
+.popup h4 ~ h4 {
+ margin-top: 25px;
+}
+.popup-body {
+ padding: 20px;
+}
+.login-popup-container .popup-body {
+ padding: 15px 25px 25px;
+}
+@media (min-width: 560px) {
+ .popup {
+ margin: 50px;
+ }
+ .popup-body {
+ padding: 30px 35px;
+ }
+ .login-popup-container .popup-body {
+ padding: 50px 60px;
+ }
+}
+@media (min-width: 768px) {
+ .popup {
+ max-width: 600px;
+ }
+}
+.popup .popup-text {
+ margin: 0;
+ line-height: 24px;
+ position: relative;
+ z-index: 1;
+}
+.popup .popup-buttons {
+ margin: -17px -15px -10px;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+}
+
+
+
+.form-group label,
+.popup-text b,
+.th-markdown strong {
+ font-weight: 500;
+}
+.form-group-buttons {
+ margin-top: 30px;
+}
+
+
+a.th-header-right-btn,
+button.th-header-right-btn {
+ font-size: 12px;
+ line-height: 14px;
+ padding: 4px 10px 3px;
+ margin: 1px 0 1px 7px;
+ border-radius: 3px;
+ position: relative;
+ float: right;
+ z-index: 1;
+}
+
+.th-filter-wrap {
+ display: inline-block;
+ position: relative;
+ margin: -3px -9px 0 0;
+ float: right;
+ z-index: 1;
+}
+.th-dropdown {
+ display: inline-block;
+ font-size: 13px;
+ line-height: 15px;
+ padding: 5px 12px;
+ border-radius: 3px;
+ color: #0086d3;
+}
+.th-dropdown.dropdown-toggle {
+ cursor: pointer;
+}
+.th-dropdown.dropdown-toggle:hover,
+.open .th-dropdown.dropdown-toggle {
+ background: #f0f4f7;
+}
+.th-dropdown-wrap span.dropdown-menu {
+ left: auto;
+ right: 0;
+ margin: 7px 0 0;
+ border: 1px solid rgba(0, 0, 0, .06);
+ border-radius: 4px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ overflow: hidden;
+ min-width: 150px;
+}
+.th-dropdown-wrap span.dropdown-menu > ul.dropdown-menu {
+ position: static;
+ display: block;
+ float: none;
+ border: none;
+ box-shadow: none;
+ border-radius: 0;
+ min-width: 0;
+ margin: 0 -20px 0 0;
+ padding: 7px 20px 7px 0;
+ max-height: 235px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.th-dropdown-wrap ul.dropdown-menu > li > .th-dropdown-item {
+ display: block;
+ cursor: pointer;
+ padding: 6px 36px 6px 15px;
+ margin: 0;
+ position: relative;
+ color: #222;
+}
+.th-dropdown-wrap ul.dropdown-menu > li > .th-dropdown-item:hover,
+.th-dropdown-wrap ul.dropdown-menu > li > .th-dropdown-item:focus {
+ background-color: #f4f4f4;
+ color: #222;
+}
+.th-dropdown-wrap ul.dropdown-menu > li.selected > .th-dropdown-item:after {
+ content: '';
+ display: inline-block;
+ position: absolute;
+ pointer-events: none;
+ bottom: 0;
+ right: 0;
+ top: 0;
+ margin: auto 13px;
+ width: 15px;
+ height: 12px;
+ background-image: url('data:image/svg+xml,%3Csvg viewBox="0 0 15 12" width="15" height="12" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M 2 6 L 5.5 9.5 L 13 3" stroke="%23228fe1" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/%3E%3C/svg%3E');
+}
+.th-places-wrap {
+ display: inline-block;
+ position: relative;
+ margin: 10px 0 0 4px;
+ float: right;
+}
+.th-places-wrap .th-dropdown {
+ font-weight: 500;
+ text-align: center;
+ width: 36px;
+}
+
+
+
+@media (min-width: 720px) {
+ .container {
+ padding-left: 15px;
+ padding-right: 15px;
+ }
+ .th-aside {
+ width: 308px;
+ float: right;
+ margin: -5px 15px 35px;
+ }
+ .th-content {
+ min-width: 308px;
+ margin-top: -5px;
+ }
+ .th-aside + .th-content {
+ margin-right: 410px;
+ }
+ .th-logo-title {
+ display: inline;
+ }
+ .th-aside > a.th-header-right-btn,
+ .th-aside > button.th-header-right-btn {
+ margin-top: 26px;
+ }
+ .th-dropdown-wrap span.dropdown-menu {
+ left: 0;
+ right: auto;
+ }
+ .th-theme-header .th-theme-buttons {
+ margin-right: 0;
+ }
+ .th-theme-source-code-wrap .CodeMirror {
+ border-width: 1px;
+ }
+}
diff --git a/data/translations.telegram.org/en.html b/data/translations.telegram.org/en.html
new file mode 100644
index 0000000000..f20b3e6ed1
--- /dev/null
+++ b/data/translations.telegram.org/en.html
@@ -0,0 +1,333 @@
+
+
+
+
+
Translations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Search in: English All Apps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Feel free to join the discussion of this language pack.
+ View Discussion
+
+
+
+
+
+ Anyone can switch their Telegram interface to English by following this link:
+
+
+
+
+
+
+
+
English
+
English
+
Please open this link on a desktop to help translate Telegram into English :
+
+
+
Feel free to join the discussion of this language pack.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/tsf.telegram.org/js/tsf.js b/data/tsf.telegram.org/js/tsf.js
new file mode 100644
index 0000000000..b793849eea
--- /dev/null
+++ b/data/tsf.telegram.org/js/tsf.js
@@ -0,0 +1,1236 @@
+(function($) {
+ $.fn.redraw = function() {
+ return this.map(function(){ this.offsetTop; return this; });
+ };
+ $.fn.prepareSlideX = function(callback) {
+ return this.map(function(){
+ $(this).css({width: this.scrollWidth, overflow: 'hidden'});
+ return this;
+ }).one('transitionend', function(){
+ $(this).css({width: '', overflow: ''});
+ callback && callback.call(this);
+ }).redraw();
+ };
+ $.fn.prepareSlideY = function(callback) {
+ return this.map(function(){
+ $(this).css({height: this.scrollHeight, overflow: 'hidden'});
+ return this;
+ }).one('transitionend', function(){
+ $(this).css({height: '', overflow: ''});
+ callback && callback.call(this);
+ }).redraw();
+ };
+ $.fn.animOff = function(this_el) {
+ if (this_el) {
+ return this.css('transition', 'none').redraw();
+ }
+ return this.addClass('no-transition').redraw();
+ };
+ $.fn.animOn = function(this_el) {
+ if (this_el) {
+ return this.redraw().css('transition', '');
+ }
+ return this.redraw().removeClass('no-transition');
+ };
+ $.fn.fadeShow = function() {
+ return this.removeClass('ohide');
+ };
+ $.fn.fadeHide = function() {
+ return this.addClass('ohide');
+ };
+ $.fn.isFadeHidden = function() {
+ return this.hasClass('ohide');
+ };
+ $.fn.fadeToggle = function(state) {
+ if (state === true || state === false) {
+ state = !state;
+ }
+ return this.toggleClass('ohide', state);
+ };
+ $.fn.slideShow = function(callback) {
+ return this.prepareSlideY(callback).removeClass('shide');
+ };
+ $.fn.slideHide = function(callback) {
+ if (callback == 'remove') {
+ callback = function(){ $(this).remove(); };
+ }
+ return this.prepareSlideY(callback).addClass('shide');
+ };
+ $.fn.isSlideHidden = function() {
+ return this.hasClass('shide');
+ };
+ $.fn.slideToggle = function(state, callback) {
+ if (state === true || state === false) {
+ state = !state;
+ }
+ return this.prepareSlideY(callback).toggleClass('shide', state);
+ };
+ $.fn.highlight = function(delay) {
+ var $this = this;
+ $this.addClass('highlight');
+ setTimeout(function() { $this.removeClass('highlight'); }, delay);
+ return $this;
+ };
+ $.fn.scrollIntoView = function(options) {
+ options = options || {}
+ return this.first().each(function() {
+ var padding = options.padding || 0,
+ duration = options.duration || 0;
+ var $item = $(this),
+ $cont = $item.scrollParent(),
+ scrollTop = $cont.scrollTop(),
+ positionTop = 0,
+ paddingTop = 0,
+ itemHeight = $item.outerHeight(),
+ isBody = false;
+ if ($cont.get(0) === document) {
+ isBody = true;
+ $cont = $(window);
+ positionTop = $item.offset().top;
+ paddingTop = $('header').height() + 1;
+ } else {
+ positionTop = $item.offset().top - $cont.offset().top + scrollTop;
+ }
+ if (options.slidedEl) {
+ if (options.slidedEl === 'this') {
+ options.slidedEl = this;
+ }
+ $(options.slidedEl, this).each(function() {
+ itemHeight += (this.scrollHeight - this.clientHeight);
+ });
+ }
+ var itemTop = positionTop,
+ itemBottom = itemTop + itemHeight,
+ contHeight = $cont.height(),
+ contTop = scrollTop + padding + paddingTop,
+ contBottom = scrollTop + contHeight - padding,
+ scrollTo = null;
+ if (itemTop < contTop) {
+ scrollTo = itemTop - padding - paddingTop;
+ } else if (itemBottom > contBottom) {
+ if (itemHeight > contHeight - padding - padding) {
+ scrollTo = itemTop - padding - paddingTop;
+ } else {
+ scrollTo = itemBottom - contHeight + padding;
+ }
+ }
+ if (scrollTo) {
+ if (duration) {
+ if (isBody) {
+ $cont = $('html');
+ }
+ $cont.stop().animate({scrollTop: scrollTo}, duration);
+ } else {
+ $cont.scrollTop(scrollTo);
+ }
+ }
+ });
+ };
+ $.fn.initSearch = function(options) {
+ var $field = this;
+ var curValue = $field.val();
+ var curSelectedIndex = false;
+ var curResult = [];
+ var curRenderedIndex = 0;
+ var dataWaiting = false;
+ var keyUpTimeout = null;
+ var blurTimeout = null;
+ var isFocused = false;
+ options = options || {};
+ if (!options.searchEnabled) {
+ options.searchEnabled = function(){ return true; };
+ }
+ $field.data('options', options);
+
+ function onKeyDown(e) {
+ switch (e.which) {
+ case Keys.ESC:
+ $field.blur();
+ break;
+ case Keys.RETURN:
+ select(curSelectedIndex);
+ break;
+ case Keys.UP:
+ var index;
+ if (!curSelectedIndex) {
+ if (options.$enter && options.enterEnabled()) {
+ index = false;
+ } else {
+ break;
+ }
+ } else {
+ index = curSelectedIndex - 1;
+ }
+ hover(index, true);
+ break;
+ case Keys.DOWN:
+ var index;
+ if (curSelectedIndex === false) {
+ index = 0;
+ } else {
+ index = curSelectedIndex + 1;
+ }
+ if (index > curResult.length - 1) {
+ break;
+ }
+ hover(index, true);
+ break;
+ default:
+ return;
+ }
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+
+ function onKeyUp(e) {
+ console.log(+new Date, 'cancelblur3');
+ clearTimeout(blurTimeout);
+ var value = $field.val();
+ clearTimeout(keyUpTimeout);
+ if (curValue !== value) {
+ // if (e.type == 'keyup') {
+ // keyUpTimeout = setTimeout(function() {
+ // valueChange();
+ // }, 50);
+ // } else {
+ valueChange();
+ options.onInput && options.onInput(value);
+ // }
+ }
+ }
+
+ function check(item, queryLower) {
+ if (!queryLower.length) {
+ return 0;
+ }
+ for (var j = 0; j < item._values.length; j++) {
+ var valueLower = item._values[j];
+ if (valueLower == queryLower) {
+ return valueLower.length;
+ }
+ }
+ for (var j = 0; j < item._values.length; j++) {
+ var valueLower = item._values[j];
+ if (valueLower.indexOf(queryLower) !== -1) {
+ return valueLower.length;
+ }
+ }
+ return false;
+ }
+
+ function search(data, query) {
+ if (!query.length) {
+ return [];
+ }
+ var time = +(new Date);
+ var queryLower = query.toLowerCase();
+ var result = [];
+ for (var i = 0; i < data.length; i++) {
+ var item = data[i];
+ var valueScore = check(item, queryLower);
+ if (valueScore !== false) {
+ item._score = valueScore;
+ item._i = i;
+ result.push(item);
+ }
+ }
+ result.sort(function(item1, item2) {
+ return (item1._score - item2._score) || (item1._i - item2._i);
+ });
+ for (i = 0; i < result.length; i++) {
+ var item = result[i];
+ delete item._score;
+ delete item._i;
+ }
+ console.log('search: ' + (((new Date) - time) / 1000) + 's');
+ return result;
+ }
+
+ function render(result, query, from_index) {
+ var time = +(new Date);
+ var queryLower = query.toLowerCase();
+ from_index = from_index || 0;
+ var html = '';
+ if (result.length > 0) {
+ for (var i = from_index, j = 0; i < result.length && j < 50; i++, j++) {
+ var item = result[i];
+ var item_html = '
' + options.renderItem(item, query) + '
';
+ html += item_html;
+ }
+ curRenderedIndex = i;
+ } else {
+ html = options.renderNoItems ? options.renderNoItems(query) : '';
+ curRenderedIndex = 0;
+ }
+ if (!from_index) {
+ options.$results.html(html);
+ } else if (html) {
+ options.$results.append(html);
+ }
+ console.log('render: from ' + from_index + ', ' + j + ' lines, ' + (((new Date) - time) / 1000) + 's');
+ }
+
+ function renderLoading() {
+ curRenderedIndex = 0;
+ options.$results.html(options.renderLoading ? options.renderLoading() : '');
+ }
+
+ function renderEmpty() {
+ curRenderedIndex = 0;
+ options.$results.html('');
+ }
+
+ function close() {
+ console.log(+new Date, 'close');
+ clearTimeout(keyUpTimeout);
+ if (!options.$results.hasClass('collapsed')) {
+ if (options.$enter && options.enterEnabled()) {
+ options.$enter.removeClass('selected');
+ }
+ options.$results.addClass('collapsed');
+ options.onClose && options.onClose();
+ }
+ }
+
+ function open() {
+ clearTimeout(blurTimeout);
+ hover(curSelectedIndex, true);
+ options.$results.removeClass('collapsed');
+ options.onOpen && options.onOpen();
+ }
+
+ function onFocus() {
+ isFocused = true;
+ var value = $field.val();
+ if (curValue != value ||
+ options.searchEnabled() && options.getData() === false) {
+ valueChange();
+ }
+ open();
+ }
+
+ function onBlur() {
+ if (!isFocused) return;
+ console.log(+new Date, 'onblur');
+ isFocused = false;
+ clearTimeout(blurTimeout);
+ blurTimeout = setTimeout(close, 100);
+ }
+
+ function valueChange() {
+ console.log(+new Date, 'cancelblur1');
+ clearTimeout(blurTimeout);
+ clearTimeout(keyUpTimeout);
+ var value = $field.val();
+ curValue = value;
+ console.log('valueChange', options.searchEnabled());
+ if (options.searchEnabled()) {
+ var data = options.getData();
+ if (data === false) {
+ if (!dataWaiting) {
+ dataWaiting = true;
+ $field.one('dataready.search', function() {
+ dataWaiting = false;
+ valueChange();
+ });
+ }
+ if (curValue.length) {
+ renderLoading();
+ } else {
+ renderEmpty();
+ }
+ return;
+ }
+ curResult = search(data, curValue);
+ var index = false;
+ if (curValue.length) {
+ render(curResult, curValue);
+ if (curResult.length && (!options.$enter || !options.enterEnabled())) {
+ index = 0;
+ }
+ } else {
+ renderEmpty();
+ }
+ } else {
+ curResult = [];
+ var index = false;
+ renderEmpty();
+ }
+ hover(index, true);
+ }
+
+ function hover(i, adjust_scroll) {
+ $('.search-item.selected', options.$results).removeClass('selected');
+ curSelectedIndex = i;
+ if (curSelectedIndex !== false) {
+ var selectedEl = $('.search-item', options.$results).get(curSelectedIndex);
+ if (!selectedEl) {
+ curSelectedIndex = false;
+ } else {
+ $(selectedEl).addClass('selected');
+ if (adjust_scroll) {
+ adjustScroll($(selectedEl));
+ }
+ if (Math.abs(curSelectedIndex - curRenderedIndex) < 5) {
+ render(curResult, curValue, curRenderedIndex);
+ }
+ }
+ }
+ if (options.$enter && options.enterEnabled()) {
+ options.$enter.toggleClass('selected', curSelectedIndex === false);
+ }
+ }
+
+ function select(i) {
+ if (i === false) {
+ if (options.$enter && options.enterEnabled()) {
+ $field.blur();
+ options.onEnter(curValue);
+ close();
+ }
+ return;
+ }
+ $field.blur();
+ options.onSelect(curResult[i]);
+ close();
+ }
+
+ function onItemMouseOver() {
+ hover($(this).data('i'));
+ }
+
+ function onResultsScroll(e) {
+ if (this.scrollTop > this.scrollHeight - this.clientHeight - 1000) {
+ render(curResult, curValue, curRenderedIndex);
+ }
+ }
+
+ function onResultsMouseWheel(e) {
+ var d = e.originalEvent.wheelDelta;
+ if((this.scrollTop === (this.scrollHeight - this.clientHeight) && d < 0) ||
+ (this.scrollTop === 0 && d > 0)) {
+ e.preventDefault();
+ }
+ }
+
+ function onItemClick(e) {
+ if (e.metaKey || e.ctrlKey) return true;
+ console.log(+new Date, 'cancelblur2');
+ clearTimeout(blurTimeout);
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ select($(this).data('i'));
+ }
+
+ function adjustScroll($itemEl) {
+ var scrollTop = options.$results.scrollTop(),
+ itemTop = $itemEl.position().top + scrollTop,
+ itemHeight = $itemEl.outerHeight(),
+ itemBottom = itemTop + itemHeight,
+ contHeight = options.$results.height() || 300;
+
+ if (itemTop < scrollTop) {
+ options.$results.scrollTop(itemTop);
+ } else if (itemBottom > scrollTop + contHeight) {
+ options.$results.scrollTop(itemBottom - contHeight);
+ }
+ }
+
+ if (options.$enter && options.enterEnabled()) {
+ options.$enter.on('mouseover.search', onItemMouseOver);
+ options.$enter.on('mousedown.search', onItemClick);
+ options.$enter.data('i', false);
+ }
+ options.$results.on('mouseover.search', '.search-item', onItemMouseOver);
+ options.$results.on('mousedown.search', '.search-item', onItemClick);
+ options.$results.on('scroll.search', onResultsScroll);
+ options.$results.on('mousewheel.search', onResultsMouseWheel);
+ $field.on('keydown.search', onKeyDown);
+ $field.on('keyup.search', onKeyUp);
+ $field.on('focus.search', onFocus);
+ $field.on('blur.search', onBlur);
+ $field.on('input.search', onKeyUp);
+
+ $field.on('datachange.search', function() {
+ valueChange();
+ });
+
+ options.$results.addClass('collapsed');
+ return this;
+ };
+ $.fn.destroySearch = function() {
+ var $field = this;
+ var options = $field.data('options');
+ if (options.$enter && options.enterEnabled()) {
+ options.$enter.off('.search');
+ }
+ options.$results.off('.search');
+ $field.off('.search');
+ return this;
+ };
+ $.fn.hasField = function(name) {
+ return this.first().map(function() {
+ if (this.tagName == 'FORM') {
+ if (this[name]) {
+ return true;
+ }
+ return $('.input[data-name]', this).filter(function() {
+ return ($(this).attr('data-name') == name);
+ }).size() > 0;
+ }
+ return false;
+ }).get(0) || false;
+ };
+ $.fn.field = function(name) {
+ return this.first().map(function() {
+ if (this.tagName == 'FORM') {
+ if (this[name]) {
+ return this[name];
+ }
+ return $('.input[data-name]', this).filter(function() {
+ return ($(this).attr('data-name') == name);
+ }).get(0);
+ }
+ });
+ };
+ $.fn.reset = function(val) {
+ return this.each(function() {
+ if (this.tagName == 'FORM') {
+ this.reset();
+ $('.input[data-name]', this).each(function() {
+ $(this).text($(this).attr('data-value')).trigger('input');
+ });
+ }
+ });
+ };
+ $.fn.defaultValue = function(val) {
+ if (typeof val !== 'undefined') {
+ return this.each(function() {
+ if (this.tagName == 'TEXTAREA' || this.tagName == 'INPUT') {
+ this.defaultValue = val;
+ } else {
+ $(this).attr('data-value', val);
+ }
+ });
+ }
+ return this.first().map(function() {
+ if (this.tagName == 'TEXTAREA' || this.tagName == 'INPUT') {
+ return this.defaultValue || '';
+ } else {
+ return $(this).attr('data-value') || '';
+ }
+ }).get(0) || '';
+ };
+ $.fn.value = function(val) {
+ if (typeof val !== 'undefined') {
+ return this.each(function() {
+ if (this.tagName == 'TEXTAREA' || this.tagName == 'INPUT') {
+ this.value = val;
+ } else {
+ $(this).text(val).trigger('input');
+ }
+ });
+ }
+ return this.first().map(function() {
+ if (this.tagName == 'TEXTAREA' || this.tagName == 'INPUT') {
+ return this.value || '';
+ } else {
+ return $(this).text() || '';
+ }
+ }).get(0) || '';
+ };
+
+ $.fn.initTextarea = function() {
+ function getRangeText(range) {
+ var div = document.createElement('DIV');
+ div.appendChild(range.cloneContents());
+ return getText(div, true);
+ }
+ function isBlockEl(el) {
+ var blockTags = {ADDRESS: 1, ARTICLE: 1, ASIDE: 1, AUDIO: 1, BLOCKQUOTE: 1, CANVAS: 1, DD: 1, DIV: 1, DL: 1, FIELDSET: 1, FIGCAPTION: 1, FIGURE: 1, FIGURE: 1, FIGCAPTION: 1, FOOTER: 1, FORM: 1, H1: 1, H2: 1, H3: 1, H4: 1, H5: 1, H6: 1, HEADER: 1, HGROUP: 1, HR: 1, LI: 1, MAIN: 1, NAV: 1, NOSCRIPT: 1, OL: 1, OUTPUT: 1, P: 1, PRE: 1, SECTION: 1, TABLE: 1, TFOOT: 1, UL: 1, VIDEO: 1};
+ return (el.nodeType == el.ELEMENT_NODE && blockTags[el.tagName]);
+ }
+ function isMetadataEl(el) {
+ var metadataTags = {HEAD: 1, TITLE: 1, BASE: 1, LINK: 1, META: 1, STYLE: 1, SCRIPT: 1};
+ return (el.nodeType == el.ELEMENT_NODE && metadataTags[el.tagName]);
+ }
+ function getText(el, safe_last_br) {
+ var child = el.firstChild, blocks = [], block = '';
+ while (child) {
+ if (child.nodeType == child.TEXT_NODE) {
+ block += child.nodeValue;
+ } else if (child.nodeType == child.ELEMENT_NODE && !isMetadataEl(child)) {
+ if (child.tagName == 'BR') {
+ block += '\n';
+ } else if (!isBlockEl(child)) {
+ block += getText(child);
+ } else {
+ if (block.length > 0) {
+ if (block.substr(-1) == '\n') {
+ block = block.slice(0, -1);
+ }
+ blocks.push(block);
+ block = '';
+ }
+ blocks.push(getText(child, safe_last_br));
+ }
+ }
+ child = child.nextSibling;
+ }
+ if (block.length > 0) {
+ if (!safe_last_br && block.substr(-1) == '\n') {
+ block = block.slice(0, -1);
+ }
+ blocks.push(block);
+ }
+ return blocks.join('\n');
+ }
+ function getTextNodesIn(node) {
+ var textNodes = [];
+ if (node.nodeType == node.TEXT_NODE) {
+ textNodes.push(node);
+ } else {
+ for (var i = 0, len = node.childNodes.length; i < len; ++i) {
+ textNodes.push.apply(textNodes, getTextNodesIn(node.childNodes[i]));
+ }
+ }
+ return textNodes;
+ }
+ function editableClosest(el) {
+ while (el) {
+ if (el.nodeType == el.ELEMENT_NODE &&
+ el.getAttribute('contenteditable') == 'true') {
+ return el;
+ }
+ el = el.parentNode;
+ }
+ return null;
+ }
+ function nonEditableClosest(el) {
+ while (el) {
+ if (el.tagName == 'INS' &&
+ el.getAttribute('contenteditable') == 'false') {
+ return el;
+ }
+ el = el.parentNode;
+ }
+ return null;
+ }
+ function setSelectionRange(el, start, end) {
+ var sel = window.getSelection();
+ sel.removeAllRanges();
+ var textNodes = getTextNodesIn(el);
+ var charCount = 0, endCharCount, i, textNode, node, offset, nonEditEl;
+ for (i = 0, charCount = 0; textNode = textNodes[i++]; ) {
+ endCharCount = charCount + textNode.length;
+ if (start >= charCount && (start < endCharCount ||
+ (start == endCharCount && i <= textNodes.length))) {
+ if (nonEditEl = nonEditableClosest(textNode)) {
+ var range = document.createRange();
+ if (start < end) range.setStartBefore(nonEditEl);
+ else range.setStartAfter(nonEditEl);
+ node = range.startContainer;
+ offset = range.startOffset;
+ } else {
+ node = textNode;
+ offset = start - charCount;
+ }
+ sel.collapse(node, offset);
+ break;
+ }
+ charCount = endCharCount;
+ }
+ if (start != end) {
+ for (i = 0, charCount = 0; textNode = textNodes[i++]; ) {
+ endCharCount = charCount + textNode.length;
+ if (end >= charCount && (end < endCharCount ||
+ (end == endCharCount && i <= textNodes.length))) {
+ if (nonEditEl = nonEditableClosest(textNode)) {
+ var range = document.createRange();
+ if (start < end) range.setStartAfter(nonEditEl);
+ else range.setStartBefore(nonEditEl);
+ node = range.startContainer;
+ offset = range.startOffset;
+ } else {
+ node = textNode;
+ offset = end - charCount;
+ }
+ sel.extend(node, offset);
+ break;
+ }
+ charCount = endCharCount;
+ }
+ }
+ }
+ function onKeyDown(e) {
+ if ((e.metaKey || e.ctrlKey) && !e.altKey &&
+ e.which == 90) { // Z
+ e.preventDefault();
+ if (e.shiftKey) {
+ redo(this);
+ } else {
+ undo(this);
+ }
+ }
+ else if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey &&
+ e.which == 89) { // Y
+ e.preventDefault();
+ redo(this);
+ }
+ else if ((e.metaKey || e.ctrlKey) &&
+ !e.shiftKey && !e.altKey && e.which == 73) { // I
+ e.preventDefault();
+ $(this).data('$tokens').filter(':not(.used)').eq(0).trigger('click');
+ }
+ else if (!e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey &&
+ (e.which == Keys.LEFT || e.which == Keys.RIGHT || e.which == Keys.BACKSPACE)) {
+ var isLeft = e.which == Keys.LEFT || e.which == Keys.BACKSPACE;
+ var isBackspace = e.which == Keys.BACKSPACE;
+ var sel = window.getSelection();
+ if (sel.isCollapsed && sel.focusNode) {
+ if (sel.focusNode.nodeType == sel.focusNode.TEXT_NODE) {
+ var newOffset = sel.focusOffset + (isLeft ? -1 : 1);
+ if (newOffset < 0) {
+ var prevNode = sel.focusNode.previousSibling;
+ if (prevNode.nodeType == prevNode.ELEMENT_NODE) {
+ var range = document.createRange();
+ range.setStartBefore(prevNode);
+ if (isBackspace) {
+ range.setEnd(sel.focusNode, sel.focusOffset);
+ range.deleteContents();
+ $(sel.focusNode).closest('.input').trigger('input');
+ } else {
+ sel.collapse(range.startContainer, range.startOffset);
+ }
+ e.preventDefault();
+ }
+ } else if (newOffset > sel.focusNode.nodeValue.length) {
+ var nextNode = sel.focusNode.nextSibling;
+ if (nextNode.nodeType == nextNode.ELEMENT_NODE && nextNode.tagName != 'BR') {
+ var range = document.createRange();
+ range.setStartAfter(nextNode);
+ if (!isBackspace) {
+ sel.collapse(range.startContainer, range.startOffset);
+ }
+ e.preventDefault();
+ }
+ }
+ }
+ else if (sel.focusNode.nodeType == sel.focusNode.ELEMENT_NODE) {
+ var curNode = sel.focusNode.childNodes[sel.focusOffset];
+ if (isLeft) {
+ var prevNode = curNode ? curNode.previousSibling : sel.focusNode.lastChild;
+ if (prevNode && prevNode.nodeType == prevNode.ELEMENT_NODE) {
+ if (isBackspace) {
+ var range = document.createRange();
+ range.selectNode(prevNode);
+ range.deleteContents();
+ $(sel.focusNode).closest('.input').trigger('input');
+ } else {
+ sel.collapse(sel.focusNode, sel.focusOffset - 1);
+ }
+ e.preventDefault();
+ } else if (prevNode && prevNode.nodeType == prevNode.TEXT_NODE) {
+ if (isBackspace) {
+ var range = document.createRange();
+ range.setStart(prevNode, prevNode.nodeValue.length - 1);
+ range.setEnd(prevNode, prevNode.nodeValue.length);
+ range.deleteContents();
+ $(sel.focusNode).closest('.input').trigger('input');
+ } else {
+ sel.collapse(prevNode, prevNode.nodeValue.length - 1);
+ }
+ e.preventDefault();
+ }
+ } else {
+ if (curNode && curNode.nodeType == curNode.ELEMENT_NODE && curNode.tagName != 'BR') {
+ sel.collapse(sel.focusNode, sel.focusOffset + 1);
+ e.preventDefault();
+ } else if (curNode && curNode.nodeType == curNode.TEXT_NODE) {
+ sel.collapse(curNode, 1);
+ e.preventDefault();
+ }
+ }
+ }
+ }
+ }
+ }
+ function getFieldRange(field) {
+ var sel = window.getSelection();
+ if (sel.anchorNode && sel.focusNode) {
+ var rng = document.createRange();
+ rng.setStart(field, 0);
+ rng.setEnd(sel.anchorNode, sel.anchorOffset);
+ var startOffset = getRangeText(rng).length;
+ rng.setEnd(sel.focusNode, sel.focusOffset);
+ var endOffset = getRangeText(rng).length;
+ return {startOffset: startOffset, endOffset: endOffset};
+ }
+ var offset = field.childNodes.length;
+ if (field.lastChild && field.lastChild.tagName == 'BR') {
+ offset--;
+ }
+ return {startOffset: offset, endOffset: offset};
+ }
+ function setFieldRange(field, fieldRange) {
+ if (fieldRange) {
+ setSelectionRange(field, fieldRange.startOffset, fieldRange.endOffset);
+ }
+ }
+ function update(field, text, fieldRange) {
+ var tokens = $(field).data('tokens');
+ var avail_tokens = [];
+ $.each(tokens, function(i, value) {
+ avail_tokens[i] = cleanHTML(value);
+ });
+ var avail_count = tokens.length;
+ var $tokens = $(field).data('$tokens');
+ var html = cleanHTML(text);
+ if (avail_count > 0) {
+ html = html.replace(TOKEN_REGEX, function(s) {
+ var i = avail_tokens.indexOf(s);
+ if (i >= 0) {
+ avail_tokens[i] = null;
+ avail_count--;
+ var $token = $tokens.eq(i);
+ if (!$token.hasClass('used')) {
+ $token.prepareSlideX().addClass('used');
+ }
+ return '
' + s + ' ';
+ } else {
+ return s;
+ }
+ });
+ $tokens.each(function(i) {
+ if (avail_tokens[i] !== null) {
+ var $token = $(this);
+ if ($token.hasClass('used')) {
+ $token.prepareSlideX().removeClass('used');
+ }
+ }
+ });
+ }
+ $tokens.parents('.key-add-tokens-wrap').toggleClass('empty', !avail_count);
+ html = html.replace(/
/g, '\n') + '
';
+ if ($(field).html() === html) return;
+
+ fieldRange = fieldRange || getFieldRange(field);
+ $(field).html(html);
+ setFieldRange(field, fieldRange);
+ }
+ function onInput() {
+ var field = this;
+ var $field = $(this);
+ var text = getText(field);
+ update(field, text);
+
+ var history = $field.data('history');
+ var fieldRange = getFieldRange(field);
+ var prevSelRange = $field.data('prevSelRange');
+ var time = +(new Date);
+ history.list = history.index >= 0 ? history.list.slice(0, history.index + 1) : [];
+ if (history.index >= 0 && history.list[history.index]) {
+ var entry = history.list[history.index];
+ if (entry.text == text) {
+ return;
+ }
+ if (time - entry.time < 1000 &&
+ entry.redoSel.startOffset == entry.redoSel.endOffset &&
+ (entry.text.length - entry.redoSel.endOffset) ==
+ (text.length - fieldRange.endOffset)) {
+ entry.text = text;
+ entry.redoSel = fieldRange;
+ return;
+ }
+ entry.undoSel = prevSelRange;
+ }
+ history.list.push({text: text, redoSel: fieldRange, time: time});
+ history.index++;
+ }
+ function undo(field) {
+ var $field = $(field);
+ var history = $field.data('history');
+ if (history.index > 0) {
+ history.index--;
+ var entry = history.list[history.index];
+ update(field, entry.text, entry.undoSel);
+ }
+ }
+ function redo(field) {
+ var $field = $(field);
+ var history = $field.data('history');
+ if (history.index < history.list.length - 1) {
+ history.index++;
+ var entry = history.list[history.index];
+ update(field, entry.text, entry.redoSel);
+ }
+ }
+ function onSelectionChange() {
+ $(this).data('prevSelRange', getFieldRange(this));
+ var sel = window.getSelection();
+ if (sel.isCollapsed) {
+ var nonEditEl;
+ if (nonEditEl = nonEditableClosest(sel.focusNode)) {
+ var range = document.createRange();
+ if (sel.focusOffset < $(nonEditEl).text().length / 2) {
+ range.setStartBefore(nonEditEl);
+ } else {
+ range.setStartAfter(nonEditEl);
+ }
+ sel.collapse(range.startContainer, range.startOffset);
+ }
+ else if (sel.focusNode === this && sel.focusOffset == this.childNodes.length && this.lastChild && this.lastChild.nodeType == 'BR') {
+ sel.collapse(this, this.childNodes.length - 1);
+ }
+ else if (sel.focusNode.nodeType == sel.focusNode.TEXT_NODE && sel.focusOffset == sel.focusNode.nodeValue.length) {
+ var range = document.createRange();
+ range.setStartAfter(sel.focusNode);
+ sel.collapse(range.startContainer, range.startOffset);
+ }
+ }
+ }
+
+ if (!$(document).data('selectionchange_inited')) {
+ $(document).data('selectionchange_inited', true);
+ document.execCommand('autoUrlDetect', false, false);
+ $(document).on('selectionchange', function() {
+ var sel = window.getSelection();
+ var anchorField, focusField;
+ var field, offset;
+ if (sel.anchorNode && (anchorField = editableClosest(sel.anchorNode))) {
+ $(anchorField).triggerHandler('selectionchange');
+ }
+ if (sel.focusNode && (focusField = editableClosest(sel.focusNode)) &&
+ anchorField != focusField) {
+ $(focusField).triggerHandler('selectionchange');
+ }
+ if (!sel.focusNode &&
+ document.activeElement &&
+ document.activeElement.getAttribute('contenteditable') == 'true') {
+ field = document.activeElement;
+ offset = field.childNodes.length;
+ if (field.lastChild.tagName == 'BR') {
+ offset--;
+ }
+ sel.collapse(field, offset);
+ }
+ });
+ }
+
+ return this.each(function() {
+ var field = this;
+ var $field = $(field);
+ $field.attr('contenteditable', 'true');
+
+ function insertTag(e) {
+ e.preventDefault();
+ document.execCommand('insertText', false, $(this).attr('data-token'));
+ $field.focus();
+ }
+
+ $field.data('history', {list: [], index: -1});
+
+ var tokens_attr = $field.attr('data-tokens');
+ var tokens = tokens_attr ? tokens_attr.split(' ') : [];
+
+ var $tokensBtns = $('
');
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i] = tokens[i].replace('\xa0', ' ');
+ var $token = $('
');
+ $token.attr('data-token', token).appendTo($tokensBtns);
+ }
+ var ua = navigator.userAgent || '',
+ is_mac = ua.indexOf('Mac') >= 0 ||
+ ua.indexOf('AppleWebKit') >= 0 &&
+ /Mobile\/\w+/.test(ua);
+ var shortcut = is_mac ? '⌘I' : 'Ctrl+I';
+ $tokensBtns.attr('data-shortcut', shortcut).wrap('
').parent().wrap('
').parent().toggleClass('empty', !tokens.length).insertAfter($field);
+ var $tokens = $('.field-ins-btn', $tokensBtns);
+ $tokens.on('click.tr-textarea', insertTag);
+ $field.data('$tokens', $tokens);
+ $field.data('tokens', tokens);
+
+ $field.on('selectionchange.tr-textarea', onSelectionChange);
+ $field.on('keydown.tr-textarea', onKeyDown);
+ $field.on('input.tr-textarea', onInput);
+ $field.trigger('input');
+ });
+
+ };
+ $.fn.destroyTextarea = function() {
+ return this.off('.tr-textarea').each(function() {
+ $(this).data('$tokens').off('.tr-textarea');
+ });
+ };
+
+})(jQuery);
+
+
+var Auth = {
+ login: function(user) {
+ $.ajax({
+ url: '/auth/login',
+ type: 'POST',
+ data: user,
+ dataType: 'json',
+ success: function (result) {
+ location.reload();
+ },
+ error: function (xhr) {
+ alert(xhr.responseText || 'Unknown error');
+ }
+ });
+ }
+};
+
+var Nav = {
+ init: function() {
+ $(window).resize(Nav.update);
+ Nav.update();
+ },
+ update: function() {
+ var $nav_menu = $('.nav-menu');
+ $nav_menu.addClass('nav-menu-can-fix');
+ if ($nav_menu.css('position') == 'fixed') {
+ $nav_menu.width($nav_menu.parent().width());
+ } else {
+ $nav_menu.css('width', 'auto');
+ }
+ }
+};
+
+function wrapLangValue(lang_value, is_rtl, highlight) {
+ var html = '';
+ var rtl_class = (is_rtl ? ' rtl' : '');
+ if ($.isArray(lang_value) ||
+ $.isPlainObject(lang_value)) {
+ html += '
';
+ for (var p = 0; p < 6; p++) {
+ if (typeof lang_value[p] === 'undefined') continue;
+ html += '' + wrapHighlight(lang_value[p], highlight, true) + ' ';
+ first = false;
+ }
+ html += ' ';
+ return html;
+ }
+ return '
' + wrapHighlight(lang_value, highlight, true) + ' ';
+}
+
+function cleanHTML(value) {
+ return value.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/\n/g, '
');
+}
+
+function wrapHighlight(value, highlight, wrap_tag) {
+ value = cleanHTML(value);
+ if (highlight) {
+ var pattern = cleanHTML(highlight).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
+ value = value.replace(new RegExp(pattern, 'gi'), '
$&<\/strong>');
+ }
+ if (wrap_tag) {
+ value = value.replace(TOKEN_REGEX, '$& ');
+ }
+ return value;
+}
+
+
+
+
+
+
+
+
+function tableFiltersInit() {
+Aj.onLoad(function(state) {
+ $('.tr-round-tab').on('click', function(e) {
+ $(this).parent().find('.tr-round-tab').removeClass('tr-round-tab-current');
+ $(this).addClass('tr-round-tab-current');
+ var filter = $(this).data('filter');
+ var $tbody = $('tbody.tbody-' + filter);
+ $tbody.parent().find('tbody').hide();
+ $tbody.show();
+ });
+});
+Aj.onUnload(function(state) {
+ $('.tr-round-tab').off('click');
+});
+}
+
+function myStatsInit() {
+
+Aj.onLoad(function(state) {
+ $('.bio-edit-btn').on('click', function(e) {
+ $('.bio-saved').hide();
+ $('.bio-edit').show();
+ });
+ $('.bio-save-btn').on('click', function(e) {
+ Aj.apiRequest('saveBio', {
+ bio: $('.bio-input').val()
+ }, function(result) {
+ if (result.error) {
+ return showAlert(result.error);
+ }
+ if (result.ok) {
+ $('.bio-value').html(result.bio_html);
+ var input = $('.bio-input').get(0);
+ input.value = input.defaultValue = result.bio_text;
+ $('.bio-saved').show();
+ $('.bio-edit').hide();
+ }
+ });
+ });
+ $('.bio-cancel-btn').on('click', function(e) {
+ $('.bio-saved').show();
+ $('.bio-edit').hide();
+ var input = $('.bio-input').get(0);
+ input.value = input.defaultValue;
+ });
+ $('.graph-checkbox').on('change', function(e) {
+ Aj.apiRequest('saveGraphAvail', {
+ avail: $('.graph-checkbox').prop('checked') ? 1 : 0
+ }, function(result) {
+ if (result.error) {
+ return showAlert(result.error);
+ }
+ });
+ });
+});
+Aj.onUnload(function(state) {
+ $('.bio-edit-btn').off('click');
+ $('.bio-save-btn').off('click');
+ $('.bio-cancel-btn').off('click');
+ $('.graph-checkbox').off('change');
+});
+}
+
+function rightsInit() {
+
+Aj.onLoad(function(state) {
+ $('.tr-members-add-form').on('submit', function(e) {
+ e.preventDefault();
+ var form = this;
+ var blockEl = $(this).parents('.tr-members-block');
+ Aj.apiRequest('rightsSearchMember', {
+ number: form.short_number.value,
+ query: this.query.value
+ }, function(result) {
+ if (result.member_html) {
+ var rowEl = $(result.member_html);
+ var phone = rowEl.attr('data-phone');
+ if (!$('.tr-member-row-wrap[data-phone="' + phone + '"]', blockEl).size()) {
+ rowEl.addClass('shide').prependTo($('.tr-members', blockEl)).slideShow();
+ openEditMember(rowEl);
+ }
+ }
+ if (result.error) {
+ return showAlert(result.error);
+ }
+ form.reset();
+ form.query.blur();
+ });
+ });
+ function openEditMember(rowEl) {
+ var nameEl = $('.tr-member-name-short', rowEl);
+ var inputEl = $('.tr-member-name-input', rowEl);
+ var width = nameEl.width();
+ nameEl.width(width);
+ inputEl.width(width + 50);
+ rowEl.addClass('tr-member-row-edit');
+ setTimeout(function() {
+ $('.tr-member-name-input', rowEl).focus().select();
+ }, 100);
+ }
+ function editMember(rowEl, add) {
+ if (!add && $(rowEl).hasClass('tr-member-row-add')) {
+ return;
+ }
+ var nameEl = $('.tr-member-name-short', rowEl);
+ var inputEl = $('.tr-member-name-input', rowEl);
+ var inputDom = inputEl.get(0);
+ if (add || inputDom.value != inputDom.defaultValue) {
+ var name = inputEl.val();
+ var phone = rowEl.attr('data-phone');
+ var blockEl = rowEl.parents('.tr-members-block');
+ var form = $('.tr-members-add-form', blockEl);
+ Aj.apiRequest('rightsEditAgent', {
+ number: form.get(0).short_number.value,
+ phone: phone,
+ name: name
+ }, function(result) {
+ if (result.error) {
+ return showAlert(result.error);
+ }
+ });
+ if (add) {
+ rowEl.removeClass('tr-member-row-add');
+ var blockEl = rowEl.parents('.tr-members-block');
+ $('.tr-header-counter', blockEl).text($('.tr-member-row-wrap:not(.tr-member-row-add)', blockEl).size() || '');
+ }
+ $('.tr-member-row-wrap[data-phone="' + phone + '"]').each(function() {
+ var nameEl = $('.tr-member-name-short', this);
+ var inputEl = $('.tr-member-name-input', this);
+ var inputDom = inputEl.get(0);
+ nameEl.text(name);
+ nameEl.attr('style', 'width:auto!important');
+ var width = nameEl.width();
+ nameEl.width(width);
+ inputEl.width(width);
+ inputDom.defaultValue = name;
+ });
+ }
+ rowEl.removeClass('tr-member-row-edit');
+ }
+ $(document).on('submit', '.tr-member-edit-form', function(e) {
+ e.preventDefault();
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ editMember(rowEl);
+ });
+ $(document).on('blur', '.tr-member-name-input', function() {
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ editMember(rowEl);
+ });
+ $(document).on('click', '.tr-member-name-short', function() {
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ openEditMember(rowEl);
+ });
+ $(document).on('click', '.add-member-btn', function() {
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ editMember(rowEl, true);
+ });
+ $(document).on('click', '.cancel-member-btn', function() {
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ rowEl.slideHide('remove');
+ });
+ $(document).on('click', '.delete-member-btn', function() {
+ var blockEl = $(this).parents('.tr-members-block');
+ var form = $('.tr-members-add-form', blockEl);
+ var rowEl = $(this).parents('.tr-member-row-wrap');
+ Aj.apiRequest('rightsDeleteAgent', {
+ number: form.get(0).short_number.value,
+ phone: rowEl.attr('data-phone'),
+ }, function(result) {
+ if (result.ok) {
+ rowEl.slideHide(function() {
+ $(this).remove();
+ $('.tr-header-counter', blockEl).text($('.tr-member-row-wrap:not(.tr-member-row-add)', blockEl).size() || '');
+ });
+ }
+ if (result.error) {
+ return showAlert(result.error);
+ }
+ });
+ });
+});
+Aj.onUnload(function(state) {
+ $('.tr-members-add-form').off('submit');
+ $(document).off('submit', '.tr-member-edit-form');
+ $(document).off('blur', '.tr-member-name-input');
+ $(document).off('click', '.tr-member-name-short');
+ $(document).off('click', '.add-member-btn');
+ $(document).off('click', '.cancel-member-btn');
+ $(document).off('click', '.delete-member-btn');
+});
+}
+
+
+
+