/*! * Webogram v0.7.0 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE */ 'use strict' /* Directives */ angular.module('myApp.directives') .directive('myDialogsListMobile', function ($window, $timeout) { return { link: link } function link ($scope, element, attrs) { var dialogsColWrap = $('.im_dialogs_col_wrap')[0] var scrollableWrap = element[0] var headWrap = $('.tg_page_head')[0] var panelWrapSelector = attrs.modal ? '.mobile_modal_body .im_dialogs_panel' : '.im_dialogs_panel' var panelWrap = $(panelWrapSelector)[0] var moreNotified = false $scope.$on('ui_dialogs_search', updateSizes) $scope.$on('ui_dialogs_update', updateSizes) $scope.$on('ui_dialogs_append', function () { onContentLoaded(function () { moreNotified = false $timeout(function () { $(scrollableWrap).trigger('scroll') }) }) }) $scope.$on('ui_dialogs_change', function () { onContentLoaded(function () { moreNotified = false $timeout(function () { $(scrollableWrap).trigger('scroll') }) }) }) $(scrollableWrap).on('scroll', function (e) { if (!element.is(':visible')) return if (!moreNotified && scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) { $scope.$emit('dialogs_need_more') moreNotified = true } }) function updateSizes () { if (!panelWrap || !panelWrap.offsetHeight) { panelWrap = $(panelWrapSelector)[0] } if (attrs.modal) { $(element).css({ height: $($window).height() - (panelWrap ? panelWrap.offsetHeight : 58) - 46 }) return } if (!headWrap || !headWrap.offsetHeight) { headWrap = $('.tg_page_head')[0] } if (!dialogsColWrap || !dialogsColWrap.offsetHeight) { dialogsColWrap = $('.im_dialogs_col_wrap')[0] } $(element).css({ height: $($window).height() - (headWrap ? headWrap.offsetHeight : 46) - (panelWrap ? panelWrap.offsetHeight : 58) - parseInt($(dialogsColWrap).css('paddingBottom') || 0) }) } $($window).on('resize', updateSizes) updateSizes() setTimeout(updateSizes, 1000) } }) .directive('myHistoryMobile', function ($window, $timeout, $rootScope, $transition) { return { link: link } function link ($scope, element, attrs) { var historyWrap = $('.im_history_wrap', element)[0] var historyMessagesEl = $('.im_history_messages', element)[0] var scrollableWrap = $('.im_history_scrollable_wrap', element)[0] var scrollable = $('.im_history_scrollable', element)[0] var bottomPanelWrap = $('.im_bottom_panel_wrap', element)[0] var sendFormWrap = $('.im_send_form_wrap', element)[0] var headWrap = $('.tg_page_head')[0] var pinnedPanelEl = $('.im_history_pinned_panel', element)[0] var sendForm = $('.im_send_form', element)[0] var moreNotified = false var lessNotified = false onContentLoaded(function () { scrollableWrap.scrollTop = scrollableWrap.scrollHeight }) $scope.$on('ui_history_append_new', function (e, options) { if (!atBottom && !options.my) { return } var pr = parseInt($(scrollableWrap).css('paddingRight')) $(scrollableWrap).addClass('im_history_to_bottom') $(scrollable).css({bottom: 0, marginLeft: -Math.ceil(pr / 2)}) onContentLoaded(function () { $(scrollableWrap).removeClass('im_history_to_bottom') $(scrollable).css({bottom: '', marginLeft: ''}) scrollableWrap.scrollTop = scrollableWrap.scrollHeight updateBottomizer() }) }) function changeScroll () { var unreadSplit var focusMessage // console.trace('change scroll') if (focusMessage = $('.im_message_focus:visible', scrollableWrap)[0]) { var ch = scrollableWrap.clientHeight var st = scrollableWrap.scrollTop var ot = focusMessage.offsetTop var h = focusMessage.clientHeight if (!st || st + ch < ot || st > ot + h) { scrollableWrap.scrollTop = Math.max(0, ot - Math.floor(ch / 2) + 26) } atBottom = false } else if (unreadSplit = $('.im_message_unread_split:visible', scrollableWrap)[0]) { // console.log('change scroll unread', unreadSplit.offsetTop) scrollableWrap.scrollTop = Math.max(0, unreadSplit.offsetTop - 52) atBottom = false } else { // console.log('change scroll bottom') scrollableWrap.scrollTop = scrollableWrap.scrollHeight atBottom = true } $timeout(function () { $(scrollableWrap).trigger('scroll') scrollTopInitial = scrollableWrap.scrollTop }) } $scope.$on('ui_history_change', function () { var pr = parseInt($(scrollableWrap).css('paddingRight')) $(scrollableWrap).addClass('im_history_to_bottom') $(scrollable).css({bottom: 0, marginLeft: -Math.ceil(pr / 2)}) onContentLoaded(function () { $(scrollableWrap).removeClass('im_history_to_bottom') $(scrollable).css({bottom: '', marginLeft: ''}) updateSizes(true) moreNotified = false lessNotified = false changeScroll() }) }) $scope.$on('ui_history_change_scroll', function () { onContentLoaded(changeScroll) }) $scope.$on('ui_history_focus', function () { if (!atBottom) { scrollableWrap.scrollTop = scrollableWrap.scrollHeight atBottom = true } }) $scope.$on('ui_history_prepend', function () { var sh = scrollableWrap.scrollHeight var st = scrollableWrap.scrollTop var pr = parseInt($(scrollableWrap).css('paddingRight')) var ch = scrollableWrap.clientHeight $(scrollableWrap).addClass('im_history_to_bottom') scrollableWrap.scrollHeight // Some strange Chrome bug workaround $(scrollable).css({bottom: -(sh - st - ch), marginLeft: -Math.ceil(pr / 2)}) var upd = function () { $(scrollableWrap).removeClass('im_history_to_bottom') $(scrollable).css({bottom: '', marginLeft: ''}) if (scrollTopInitial >= 0) { changeScroll() } else { scrollableWrap.scrollTop = st + scrollableWrap.scrollHeight - sh } updateBottomizer() moreNotified = false $timeout(function () { if (scrollableWrap.scrollHeight != sh) { $(scrollableWrap).trigger('scroll') } }) clearTimeout(timer) unreg() }, timer = setTimeout(upd, 0), unreg = $scope.$on('$viewContentLoaded', upd) }) $scope.$on('ui_history_append', function () { var sh = scrollableWrap.scrollHeight onContentLoaded(function () { atBottom = false updateBottomizer() lessNotified = false if (scrollTopInitial >= 0) { changeScroll() } $timeout(function () { if (scrollableWrap.scrollHeight != sh) { $(scrollableWrap).trigger('scroll') } }) }) }) $scope.$on('ui_panel_update', function (e, data) { onContentLoaded(function () { updateSizes() if (data && data.blur) { $scope.$broadcast('ui_message_blur') } else { $scope.$broadcast('ui_message_send') } $timeout(function () { $(scrollableWrap).trigger('scroll') }) }) }) $scope.$on('ui_selection_clear', function () { if (window.getSelection) { if (window.getSelection().empty) { // Chrome window.getSelection().empty() } else if (window.getSelection().removeAllRanges) { // Firefox window.getSelection().removeAllRanges() } } else if (document.selection) { // IE? document.selection.empty() } }) $scope.$on('ui_editor_resize', updateSizes) $scope.$on('ui_height', function () { onContentLoaded(updateSizes) }) var atBottom = true var scrollTopInitial = -1 $(scrollableWrap).on('scroll', function (e) { if (!element.is(':visible') || $(scrollableWrap).hasClass('im_history_to_bottom')) { return } var st = scrollableWrap.scrollTop atBottom = st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight if (scrollTopInitial >= 0 && scrollTopInitial != st) { scrollTopInitial = -1 } if (!moreNotified && st <= 300) { moreNotified = true $scope.$emit('history_need_more') } else if (!lessNotified && st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) { lessNotified = true $scope.$emit('history_need_less') } }) function updateSizes (heightOnly) { if (!element.is(':visible') && !$(element[0].parentNode.parentNode).is(':visible')) { return } if ($(sendFormWrap).is(':visible')) { $(sendFormWrap).css({ height: $(sendForm).height() }) } if (!headWrap || !headWrap.offsetHeight) { headWrap = $('.tg_page_head')[0] } if (!pinnedPanelEl || !pinnedPanelEl.offsetHeight) { pinnedPanelEl = $('.im_history_pinned_panel', element)[0] } var pinnedHeight = pinnedPanelEl && pinnedPanelEl.offsetHeight || 0 var historyH = $($window).height() - bottomPanelWrap.offsetHeight - (headWrap ? headWrap.offsetHeight : 46) - pinnedHeight $(historyWrap).css({ height: historyH }) updateBottomizer() if (heightOnly === true) return if (atBottom) { onContentLoaded(function () { scrollableWrap.scrollTop = scrollableWrap.scrollHeight }) } } function updateBottomizer () {} $($window).on('resize', updateSizes) updateSizes() onContentLoaded(updateSizes) } }) .directive('myContactsListMobile', function ($window, $timeout) { return { link: link } function link ($scope, element, attrs) { var searchWrap = $('.contacts_modal_search')[0] var panelWrap = $('.contacts_modal_panel')[0] function updateSizes () { $(element).css({ height: $($window).height() - (panelWrap && panelWrap.offsetHeight || 0) - (searchWrap && searchWrap.offsetHeight || 0) - 64 }) } $($window).on('resize', updateSizes) $scope.$on('contacts_change', function () { onContentLoaded(updateSizes) }) onContentLoaded(updateSizes) } }) .directive('myCountriesListMobile', function ($window, $timeout) { return { link: link } function link ($scope, element, attrs) { var searchWrap = $('.countries_modal_search')[0] var panelWrap = $('.countries_modal_panel')[0] function updateSizes () { $(element).css({ height: $($window).height() - (panelWrap && panelWrap.offsetHeight || 0) - (searchWrap && searchWrap.offsetHeight || 0) - (46 + 18) }) } $($window).on('resize', updateSizes) onContentLoaded(updateSizes) } }) .directive('myInfiniteScrollerMobile', function () { return { link: link, scope: true } function link ($scope, element, attrs) { var scrollableWrap = element[0] var moreNotified = false $(scrollableWrap).on('scroll', function (e) { if (!element.is(':visible')) return if (!moreNotified && scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) { moreNotified = true $scope.$apply(function () { $scope.slice.limit += ($scope.slice.limitDelta || 20) }) onContentLoaded(function () { moreNotified = false }) } }) } })