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'); +}); +} + + + +