403Webshell
Server IP : 209.209.40.120  /  Your IP : 216.73.217.112
Web Server : Microsoft-IIS/10.0
System : Windows NT NEWWWW 10.0 build 17763 (Windows Server 2019) i586
User : NEWWWW$ ( 0)
PHP Version : 8.3.30
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/HostingSpaces/admin/chatme24.com/wwwroot/_frameworks/main/edge/js/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : C:/HostingSpaces/admin/chatme24.com/wwwroot/_frameworks/main/edge/js/messages.js
var CMessages = function(guid, guidPhoto, imHistoryMessages) {

    var $this=this;

    this.guid = guid;
    this.guidPhoto = guidPhoto;
    this.imHistoryMessages = imHistoryMessages*1;
    this.$pp=[];
    this.userTo=0;
    this.groupId=0;
    this.lastEnteredMessage='';
    this.dur=300;
    this.isInitLoad=false;
    this.imH = 0;
    this.imW = 0;
    this.eventState = {}

    this.userCache = {};

    this.setData = function(data){
        for (var key in data) {
           $this[key] = data[key];
        }
    }

    this.isCityPage = function(){
        return typeof isPageCity != 'undefined' && isPageCity;
    }

    this.show = function(uid,$el,groupUserId,groupId){
        closeNavbarMenuCollapse(function(){
            $this.showPrepare(uid,$el,groupUserId,groupId);
        })
    }

    this.showPrepare = function(uid,$el,groupUserId,groupId){
        //if(notPageLoad())return;
        uid=uid||0;
        groupUserId = defaultFunctionParamValue(groupUserId, false);
        groupId = defaultFunctionParamValue(groupId, false);
        $el=$el||[];
        if(!uid&&$el[0]&&$el.is('.disabled')){
            return;
        }

        //if($this.$pp.is('.animated'))return;
        if($this.$pp.is('.to_show')){
            $this.closePopup();
            return;
        }

        $this.$ppLoader=[];
        $this.$ppContentLoader=[];
        $this.clear();

        $this.$ppChat.append($this.$ppLoader=createLoader('pp_messages_loader',false));
        var $body=$('body');

        setPushStateHistory('im');
        $this.$pp.addClass('animated').one('hidden.bs.modal',function(){
            checkOpenModal();
            //$this.$pp.addClass('to_hide');
            //$this.clear();
            //$body.removeClass('message_open');
        }).one('hide.bs.modal',function(){
            //History windows
            $body.removeClass('message_open');
            $this.$pp.oneTransEndM(function(){
                $this.$pp.removeClass('to_show');
                $this.$pp.removeClass('animated');
                $this.clear();
            })
            if ($this.isCityPage()) {
                city.notResizeWindow = false;
                if (typeof cityInterface == 'object' && typeof cityInterface.resizeWindow == 'function') {
                    cityInterface.resizeWindow();
                }
            }
            $this.setGlobalMessagesCount();
        }).one('shown.bs.modal',function(){
            //console.log('shown.bs.modal');
        }).one('show.bs.modal',function(){
            $this.setHeightIm('');
            if(!isMobile()){
                var imH=$this.getHeightIm();
                $this.setHeightIm(imH);
                var imW=$this.getWidthIm();
                $this.setWidthIm(imW);
            }
            if ($this.isCityPage()) {
                city.notResizeWindow = true;
            }
            $this.$pp.addClass('to_show');
            $body.addClass('message_open');
            $this.open(uid,groupUserId,groupId);
        }).oneTransEndM(function(){
            $this.$pp.removeClass('animated')
        }).removeClass('to_hide').modal('show');
    }

    this.getGroupParam = function(uid){
        var result={group_im_id:0, from_group_id:0, to_group_id:0};
        if ($this._siteGroupId && uid != siteGuid) {
            if (siteGuid == $this._siteGroupUserId) {
                result={group_im_id:$this._siteGroupId, from_group_id:$this._siteGroupId, to_group_id:0};
            } else {
                result={group_im_id:$this._siteGroupId, from_group_id:0, to_group_id:$this._siteGroupId};
            }
        }
        return result;
    }

    $this._siteGroupId=0;
    $this._siteGroupUserId=0;
    this.open = function(uid,groupUserId,groupId){
        $this.actionOpenIm=false;
        $this.isSearchContact=false;
        $this.isShowOnlyOnline=false;

        $this._siteGroupId=siteGroupId,
        $this._siteGroupUserId=siteGroupUserId;

        var data={user_id:uid,is_mode_fb:isFbModeTitle};
        if(uid){
            groupUserId = defaultFunctionParamValue(groupUserId, false);
            groupId = defaultFunctionParamValue(groupId, false);

            var isUpdateSiteGroup=groupUserId !== false || groupId !== false;
            if (isUpdateSiteGroup) {
                groupUserId *=1;
                groupId *=1;
                var _siteGroupId=$this._siteGroupId,
                    _siteGroupUserId=$this._siteGroupUserId;
                $this._siteGroupId=groupId;
                $this._siteGroupUserId=groupUserId;
            }

            paramsGroup=$this.getGroupParam(uid);
            for (var key in paramsGroup) {
                data[key] = paramsGroup[key];
            }

            if (isUpdateSiteGroup) {
                $this._siteGroupId=_siteGroupId;
                $this._siteGroupUserId=_siteGroupUserId;
            }
        }

        var fnOpen=function(){
            debugLog('IM open', data);
            $ajax(url_ajax+'?cmd=pp_messages', data, fnSuccess, fnError);
        },
        fnSuccess=function(res){
            if(!$this.$pp.is('.to_show'))return;
            var data=checkDataAjax(res);
            if(data!==false){
                //if(!imH)$this.endResizeIm();
                //$this.imH=imH;
                var $data=$(data);
                $this.$ppSidepanel.html($data.filter('.sidepanel').html()).removeClass('empty');
                $this.$ppContent.html($data.filter('.content').html());

                var online=$.cookie('edge_im_show_only_online'),
                    fnHideLoader=function(){
                        $this.hideLoader($this.initControls);
                    };
                if(online && online=='true'){
                    setTimeout(function(){
                        $this.showOnlyOnline(true);
                        setTimeout(fnHideLoader,250)
                    },1)
                }else{
                    fnHideLoader();
                }
            }else{
                $this.closePopup();
                alertServerError();
            }
        },
        fnError=function(){
            if(!$this.$pp.is('.to_show'))return;
            fnOpen();
        };
        fnOpen();
    }

    this.clear = function(){
        $this.$ppLoader[0]&&$this.$ppLoader.remove();
        $this.$ppChatContent.removeClass('to_show');
        $this.$ppSidepanel.empty();
        $this.$ppContent.empty();
        $this.deleteDataChats();
    }

    this.closePopup = function(){
        if(!$jq('body').is('.message_open'))return;
        $this.isInitLoad=false;
        if(!backStateHistory()){
            $this.close();
        }
    }

    this.close = function(){
		playImAudioMessageStopAll();
		if ($this.$ppAudioRecord.is('.record')){
			$this.runAudioRecorder();
		}
        $this.isInitLoad=false;
        $this.$pp.addClass('animated')
        $this.$ppSidepanel.addClass('empty');
        $this.$pp.modal('hide');
        $this.userTo=0;
        ImageDrawer.closeIm();
        $.post(url_ajax,{cmd:'delete_empty_im'});

        return false;
    }

    this.hideLoader = function(call){
        $this.$ppLoader.oneTransEnd(function(){
            $(this).remove();
        }).delay(10).toggleClass('hidden',0);
        $this.$ppChatContent.delay(50).oneTransEnd(function(){
            if(typeof call=='function')call();
        }).toggleClass('to_show',0);
    }

    this.isVisible = function(){
        return ($this.isInitLoad && $this.$pp[0] && $this.$pp.is('.to_show') && !$this.$ppSidepanel.is('.empty')) ? true : false;
    }

    this.isOpened = function(){
        return $this.$pp[0] && $this.$pp.is('.to_show') ? true : false;
    }

    this.setUserCacheData = function(uid,kUid,data){
        users_list[uid]=data.online*1;
        if (!$this.userCache[kUid]) {
            $this.userCache[kUid]={uid:uid};
        }
        for (var key in data) {
           $this.userCache[kUid][key] = data[key];
        }
        $this.userCache[kUid]['contact'] = $('#pp_message_user_'+kUid);
        $this.userCache[kUid]['preview_msg'] = $('#pp_message_user_preview_msg_'+kUid);
    }

    this.initUserChat = function(uid, groupId){
        var kUid=$this.getKeyUid(uid, groupId), pl;
        if (isMobile()) {
            pl=$('#im_viewport_'+kUid).scroll(function(){
                if(!$(this).scrollTop())$this.uploadingMsg(kUid, uid, groupId);

                //$('[data-tooltip-data="true"].init_data').tooltip('hide');
            });
        } else {
            var sb=$('#pp_message_list_message_'+kUid).tinyscrollbar({wheelSpeed:30,thumbSize:45})
                    .on('move',function(){
                    if($this.userCache[kUid]['pl'].contentPosition==0){
                        $this.uploadingMsg(kUid, uid, groupId)
                    }
            }),
            pl=sb.data('plugin_tinyscrollbar');
        }

        if (!$this.userCache[kUid]) {
            $this.userCache[kUid]={};
        }
        $this.userCache[kUid]['pl']=pl;
        $this.userCache[kUid]['trans'] = $('.im_trans_'+kUid);

        $this.userCache[kUid]['content'] = $('#pp_messages_user_title_info_'+kUid+',#pp_message_list_message_'+kUid);
        $this.userCache[kUid]['list_msg'] = $('#im_overview_'+kUid);

        $this.prepareImage($this.userCache[kUid]['list_msg'],pl);

        $this.initUserChatListMsg(kUid);
    }

    this.deleteDataOneChat = function(uid){
        delete $this.userCache[uid];
        delete users_list[uid];
    }

    this.deleteDataChats = function(){
        for (var uid in $this.userCache) {
            $this.deleteDataOneChat(uid);
        }
    }

    this.initUserChatListMsg = function(kUid,posY){
        kUid=kUid||$this.getKeyUid($this.userTo,$this.groupId);
        if(!kUid)return;

        $this.setAnimateUserChat(kUid,true);
        $this.reInitToScroll($this.userCache[kUid]['pl'],posY)
        setZeroTimeout(function(){
            $this.setAnimateUserChat(kUid)
        })
    }

    this.setAnimateUserChat = function(kUid, remove){
        if(!isMobile())$this.userCache[kUid]['trans'][remove?'removeClass':'addClass']('animate')
    }

    this.ppMsgMaxH=0;
    this.ppMsgMaxW=0;
    this.setMaxWidthMsg = function(check){
        var check=check||false;
        if (check && $this.ppMsgMaxW) {
            return;
        }

        if (!$('#msg_img_template_ration')[0]) {
            var msg='<div class="mod_im_msg_image"><img id="msg_img_template_ration" class="msg_img_template_ration" src="'+url_tmpl_images+'1px.png"></div>',
                $msg=$this.getTemplateMsg('template_ration', msg, '', 0, 0, 0, 0);
            $('#im_overview_template_ration').append($msg);
        }
        /*var d=isMobile()?152:160,
            w=$('#pp_message_list_message').width()-d;*/

        var d=isMobile()?0:15,
            w=$('#msg_img_template_ration').width()-d;
        $this.ppMsgMaxW=w;

        var d=1.777778;
        $jq('#style_header_im')[0].innerHTML=[
            ".mod_im_msg_video .one_media_youtube{width:", w,"px;","height:", Math.round(w/d), "px;}"
        ].join("");

        //debugLog('SET im width', [w, Math.round(w/d)]);

    }

    this.initLoad = function(){
        debugLog('IM initLoad - ' + $this.userTo, $this.groupId, $this.userCache);

        $this.setMaxWidthMsg();

        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        if($this.isVisChats()){
            $this.$ppMsg[0].innerHTML=$this.lastEnteredMessage;
        }else{
            $this.lastEnteredMessage='';
        }
        $this.$ppSearch.keydown(doOnEnter(function(){$this.searchContact()}));

        $this.ppMsgMaxH=parseInt($this.$ppMsg.css('maxHeight'), 10);
        $this.$ppMsg.autosize_editable({
			isSetScrollHeight:false,
			callback:$this.prepareListMsg,
			callbackResize:$this.prepareListMsg,
			callbackSend:$this.send})
        .on('input propertychange', function(){
            status_writing[$this.userTo] = parseInt(new Date()/1000);
            $this.lastEnteredMessage=this.innerHTML;
        }).focus(function(){
            //setTimeout(function(){scrollToEl($this.$ppMsg)},1000);
        })

        $this.$ppSend.click($this.send);
        //$this.initControls();
        $this.showSplashNoChats();
        $this.$ppUserMoreMenu.click(function(){
            if($this.isContentLoader())return;
            $this.prepareMoreMenu();
            if($this.$ppUserMoreMenuBl.is('.in')){
                $this.$ppUserMoreMenuBl.collapse('hide');
            }else{
                $this.$ppUserMoreMenuBl.collapse('show');
            }
        })
        if($this.userCache[kUid]!==undefined && $this.userCache[kUid].list_msg){

            var online=$.cookie('edge_im_show_only_online');
            online = online && online=='true';
            if (online && !$this.userCache[kUid]['online']) {
                $.cookie('edge_im_show_only_online', false)
            }
            $this.prepareMoreMenu();
            $this.changePlaceholderInput(kUid);
        }
        $this.initTooltipData();

        //this.prepareMoreMenu
        $this.isInitLoad=true;

        $this.setGlobalMessagesCount();

        $this.initPpImage();
    }

    this.setGlobalMessagesCount = function(){
        imMessagesCount=$('#message_notification_link').find('.count').data('counter')*1;
    }

    this.ppMsgH=0;
    this.prepareListMsg = function(ta,ta,posY){
        if(!$this.isOpened())return;
        $this.ppMsgH=ta;
        var taD=ta;
        if(taD>$this.ppMsgMaxH)taD=$this.ppMsgMaxH;
        var h=$this.$ppUserChatContent.height()-(taD+$this.$ppUserChatInfo.height());
		if ($this.$ppMessageAction.css('position') == 'absolute') {
			h -=$this.$ppMessageAction.height();
		}
        $this.$ppListMsg.css({height:h+'px'});
        $this.$ppSend.css({height:ta+'px'});
        $this.initUserChatListMsg(0,posY);
    }

    this.showSplashNoChats = function(){
        if($this.isVisChats()){
            $this.$ppUserMenu.show();
            $this.$ppSplashNoChats.removeClass('to_show');
        } else {
            $this.$ppUserMenu.hide();
            $this.$ppSplashNoChats.addClass('to_show');
        }
    }

    this.sendMsgControlsDisabled = function(disabled){
        disabled=disabled||false;
        $this.$ppMsg.prop('disabled',disabled);
        $this.$ppSend.prop('disabled',disabled);
        if (disabled) {
            $this.clearUploadImage(true);
            ImageDrawer.closeIm();
        }
        $this.$ppUploadImage[disabled?'addClass':'removeClass']('no_active');
    }

    this.initControls = function(){
        var disabled=$this.isVisChats()?false:true;
        $this.sendMsgControlsDisabled(disabled);
        var $contactAll=$('.contact', $this.$ppListContact);
        if($contactAll[0]){
            $this.$ppSearch.prop('disabled',false);
            $this.$ppBtnOnline.prop('disabled',false);
            if (!$contactAll.filter(':visible')[0]) {
                if(!$this.isSearchContact){
                    $this.$ppSearch.prop('disabled',true);
                }
                if (!$this.isShowOnlyOnline) {
                    $this.$ppBtnOnline.prop('disabled',true);
                }
            }
        } else {
            $this.$ppSearch.prop('disabled',true);
            $this.$ppBtnOnline.prop('disabled',true);
        }
    }

    this.isSearchContact=false;
    this.searchContact = function(empty){
        if($this.actionOpenIm)return;
        empty=empty||0;
        var search=$this.getNameSearch(),$contact,$activeIm=[];

        if(!$this.isSearchContact && !search && !empty){
            return;
        }
        var clOnline=$this.getClOnline();
        if (!search||empty) {
            $this.isSearchContact=false;
            $('li', $this.$ppListContact).removeClass('search');
            $contact=$('li'+clOnline, $this.$ppListContact);
            $this.changeActiveFirstChat($contact);
            return;
        }
        $this.isSearchContact=true;
        $('.pp_message_name', $this.$ppListContact).each(function(){
            var $el=$(this),s=$this.isNameSearch(this),
                $contact=$el.closest('.contact');
            if(s){
                if(!$activeIm[0]){
                    $activeIm=$contact;
                    $this.changeActiveFirstChat($contact,true);
                }
                $contact.addClass('search');
                var isShow=true;
                if(clOnline&&!$contact.is(clOnline)){
                    isShow=false;
                }
                $contact[isShow?'show':'hide']();
            }else{
                $contact.removeClass('search').hide();
            }
            $this.initControls();
        })
        if (!$this.isVisChats()) {
            $this.hideUserContent();
        }
    }

    this.showOnlyOnline = function(online, notBtnActive){
        if($this.actionOpenIm)return;
        if($this.isShowOnlyOnline==online)return;
        notBtnActive=notBtnActive||0;
        $this.isShowOnlyOnline=online;
        $.cookie('edge_im_show_only_online', online);
        var clSearch=$this.getClSearch(), $visible;

        if(!notBtnActive)$('#pp_messages_show_all, #pp_messages_show_online').toggleClass('active');
        if(online){
            $('.contact'+clSearch+':not(.online)', $this.$ppListContact).hide();
            $visible=$('.contact'+clSearch+'.online', $this.$ppListContact).show();
        }else{
            $visible=$('.contact'+clSearch, $this.$ppListContact).show();
        }
        console.log('%cIM: ShowOnlyOnline', 'background: #73afda', online);

        //console.log('ShowOnlyOnline', online, !notBtnActive);
        $this.changeActiveFirstChat($visible);
    }

    this.getClOnline = function(){
        return $this.isShowOnlyOnline?'.online ':'';
    }

    this.getClSearch = function(){
        return $this.isSearchContact?'.search':''
    }

    this.getNameSearch = function(){
        var name=trim($this.$ppSearch[0].value);
        $this.$ppSearch.val(name);
        return name.toLowerCase();
    }

    this.isNameSearch = function(el){
        return ~el.innerText.toLowerCase().indexOf($this.getNameSearch())
    }

    this.disabledActiveChat = function(){
        $('li.active', $this.$ppListContact).removeClass('active');
    }

    this.isVisChats = function(){
        return $this.getChats()[0];
    }

    this.getChats = function(){
        return $('.contact:visible', $this.$ppListContact);
    }

    this.getChatsFirst = function(){
        return $this.getChats().first()
    }

    this.setActiveFirstChat = function($firstIm){
        $this.disabledActiveChat();
        $firstIm.css('transition','none').addClass('first active');
        $firstIm.click();
        setTimeout(function(){$firstIm.removeAttr('style')},1);
    }

    this.changeActiveFirstChat = function($contact,noTrans){
        noTrans=noTrans||0;
        if(!$contact[0]){
			$this.changePlaceholder(l('write_your_message'));
            $this.hideUserContent();
            return;
        }
        var $active=$contact.filter('.active'),
            visActive=$active[0] && $active.is(':visible'),
            $activeIm=$active[0] ? $active : $contact.first();

        //console.log('ChangeActiveFirstChat',$active.is(':visible'));//,$active
        $this.disabledActiveChat();
        if(!visActive){
            $this.showContentLoader();
        }
        if(noTrans)$activeIm.css('transition','none');
        $this.changeIm($activeIm.addClass('first active').data('uid'), $activeIm.data('groupId'));
        $contact.show();
        setZeroTimeout(function(){$activeIm.removeAttr('style')});
    }

    this.hideUserContent = function(call){
        $this.userTo=0;
        $this.$ppContentUser.oneTransEnd(function(){
            if(typeof call=='function')call()
        }).addClass('to_hide');
        $this.initControls();
    }

    this.showPic = function(url,uid){
        onLoadImgToShow(url,[],function(){
            $('.pp_message_profile_pic_'+uid+'.to_hide').removeClass('to_hide')
        })
    }

    this.showOriginalMessage = function($el){
        $el.hide().next('.original_message').show();

        //$this.initUserChatListMsg();
        var kUid=$this.getKeyUid($this.userTo,$this.groupId);
        if(!kUid)return;

        //$this.setAnimateUserChat(kUid,true);
        $this.reInitToScroll($this.userCache[kUid]['pl'],'relative')

    }

    this.durMoveChat=300;
    this.moveImToFirst = function(kUid,onlyMove){
        var $li=$this.userCache[kUid]['contact'];
        if($li.is(':animated'))return;
        var $chatFirst=$('.contact', $this.$ppListContact);
        onlyMove=onlyMove||0;
        if($li[0]==$('.contact.active', $chatFirst)[0]||$li.is('.first')){
            $li.prependTo($this.$ppListContact).removeClass('first');
            return;
        }
        if($li[0]==$chatFirst[0]){
            if(!onlyMove){
                $this.disabledActiveChat();
                $li.addClass('active');
            }
            return;
        }
        if($this.$ppListContactBl[0].scrollTop){
            if(isVisiblePage){
                $this.$ppListContactBl.scrollTo(0, $this.dur*1.5, {axis:'y', queue:false, easing:'easeInOutCubic'});
            } else {
                $this.$ppListContactBl[0].scrollTop=0;
            }
        }
        var isHidden=$li.isHidden();
        if(onlyMove){
            console.log('%cIM: MoveImToFirst ONLYMOVE UPDATE SERVER', 'background: #73afda');
            //console.log('MoveImToFirst ONLYMOVE UPDATE SERVER');
            var $el=$this.$ppListContact, fnTo='prependTo';
            if ($chatFirst[0]) {
                if ($chatFirst[1]&&$li[0]==$chatFirst[1]) {
                    return;
                }
                $el=$chatFirst.eq(0);
                fnTo='insertAfter';
            }
            if(isHidden){
                console.log('%cIM: MoveImToFirst ONLYMOVE UPDATE SERVER HIDDEN', 'background: #73afda');
                $li[fnTo]($el);
            }else{
                console.log('%cIM: MoveImToFirst ONLYMOVE UPDATE SERVER VISIBLE', 'background: #73afda');
                $li.slideUp($this.durMoveChat, function(){
                    $li[fnTo]($el).slideDown($this.durMoveChat)
                })
            }
        }else{
            if(isHidden){
                console.log('%cIM: MoveImToFirst HIDDEN', 'background: #73afda');
                $this.disabledActiveChat();
                $li.show()
                $li.prependTo($this.$ppListContact);
                $li.addClass('active');
                $this.initControls();
            } else {
                console.log('%cIM: MoveImToFirst ACTIVE', 'background: #73afda');
                $li.slideUp($this.durMoveChat, function(){
                    $this.disabledActiveChat();
                    $li.prependTo($this.$ppListContact).addClass('active').slideDown($this.durMoveChat,$this.initControls)
                })
            }
        }
    }

    this.actionOpenIm=false;
    this.selUserTitleInfo='.pp_message_user_title_info';
    this.selUserListMsg='.pp_message_user_list_message';
    this.responseOpenIm = function(uid, groupId){
        $this.userTo=uid;
        $this.groupId=groupId;
        var kUid=$this.getKeyUid(uid, groupId);
        $this.moveImToFirst(kUid);
        $this.hideContentLoader();
        $($this.selUserTitleInfo,$this.$ppUserTitleInfo).hide();
        $($this.selUserListMsg,$this.$ppListMsg).hide();
        $this.sendMsgControlsDisabled();
    }

    this.slideMsgShow = function($listMsg, kUid){
        if($('#pp_message_user_'+kUid).is('.active'))return;

        $listMsg.find('.pp_message_msg_item').oneAnimationEnd(function(){
            $(this).removeClass('to_slide_show');
        }).addClass('to_slide_show');
    }

    this.showContentIm = function(kUid){
        $this.$ppContentUser.oneTransEnd(function(){
            $this.actionOpenIm=false;
        }).removeClass('to_hide');
        $this.prepareImage($this.userCache[kUid]['list_msg'], $this.userCache[kUid]['pl']);

        $this.userCache[kUid]['contact'].removeClass('first');
        setZeroTimeout($this.initControls);
        $this.prepareMoreMenu();
    }

    this.showContentLoader = function(){
        if (!$this.$ppContentLoader[0]) {
            $this.$ppContent.append($this.$ppContentLoader=createLoader('pp_messages_loader',false));//.addClass('box')
        } else {
            $this.$ppContentLoader.removeClass('hidden')
        }
        $this.sendMsgControlsDisabled(true);
    }

    this.hideContentLoader = function(){
        $this.$ppContentLoader[0]&&$this.$ppContentLoader.addClass('hidden');
    }

    this.isContentLoader = function(){
        return $this.$ppContentLoader[0]&&!$this.$ppContentLoader.is('.hidden');
    }

    this.openOneIm = function(uid, groupId, fromGroupId, toGroupId){
        console.log('OPEN NEW IM', uid, groupId, fromGroupId, toGroupId);

        var kUid=$this.getKeyUid(uid, groupId);

        fromGroupId=defaultFunctionParamValue(fromGroupId,false);
        toGroupId=defaultFunctionParamValue(toGroupId,false);
        if (fromGroupId===false) {
            fromGroupId=$this.userCache[kUid]['fromGroupId'];
        }
        if (toGroupId===false) {
            toGroupId=$this.userCache[kUid]['toGroupId'];
        }

        var data={user_id:uid,
                  group_im_id:groupId,
                  from_group_id:fromGroupId,
                  to_group_id:toGroupId,
                  is_mode_fb:'true',
                  upload_im:1,
                  upload_im_new:1};

        $.post(url_ajax+'?cmd=pp_messages',data,function(res){
            if(!$this.isVisible())return;
            var data=checkDataAjax(res);
            if(data!==false){
                var $data=$(trim(data));
                var $contactAll=$('li.contact', $this.$ppListContact),
                    $contact=$data.filter('li.contact').hide(),
                    $userInfo=$data.filter($this.selUserTitleInfo).hide().prependTo($this.$ppUserTitleInfo),
                    $listMsg=$data.filter($this.selUserListMsg).hide().prependTo($this.$ppListMsg),
                    clOnilne=$this.getClOnline(),
                    clSearch=$this.getClSearch(),
                    isShow=true;
                if(clOnilne&&!$contact.is(clOnilne)){
                    isShow=false;
                }
                if(clSearch){
                    if($this.isNameSearch($('.pp_message_name', $contact)[0])){
                        $contact.addClass('search')
                    }else{
                        isShow=false;
                    }
                }
                debugLog('IM: openOneIm', $contact[0].id);
                if ($('#'+$contact[0].id)[0]) {
                    debugLog('IM: openOneIm No Open', $contact[0].id);
                    return;
                }
                if($contactAll[0]){
                    if(isShow){
                        if(!$contactAll.filter(':visible')[0]){
                            $this.changeActiveFirstChat($contact.insertBefore($contactAll.first()),true);
                        }else{
                            $contact.removeClass('active').insertBefore($contactAll.first()).aSlideDown({dur:$this.durMoveChat});
                        }
                    }else{
                        $contact.removeClass('active').insertBefore($contactAll.first())
                    }
                }else{
                    $this.userTo=uid;
                    $contact.prependTo($this.$ppListContact).aSlideDown({dur:dur,complete:$this.initControls});
                    if($this.$ppSplashNoChats.is('.to_show')){
                        var dur=400;
                        $this.$ppSplashNoChats.oneTransEnd(function(){
                            $this.$ppUserMenu.fadeIn(dur);
                            $userInfo.fadeIn(dur);
                            $listMsg.fadeIn(dur);
                        }).removeClass('to_show');
                    }else{
                        $this.$ppUserMenu.show();
                        $userInfo.show();
                        $listMsg.show();
                    }
                }

            }
        })
    }

	this.changePlaceholder = function(plc){
		$this.$ppMsg.attr('data-placeholder-new', plc).data('placeholderNew', plc).trigger('placeholder');
	}

    this.changePlaceholderInput = function(kUid){
        var plc=l('write_your_message'),
            info=$this.userCache[kUid];
        if(info['groupId']){
            plc=info['fromGroupId'] ? l('reply_as_group_im') : l('reply_to_group_im');
        } else {
            plc=l('reply_to_user_im');
        }
        plc=plc.replace('{im_name}',info['imName']);
        plc=plc.replace('{im_name_real}',info['imNameReal']);

        var n=isMobile() ? 22 : 82,
            ln=plc.length;
        if (ln>(n+3)) {
            plc=plc.slice(0,n)
            plc=trim(plc) + '...';
        }
		$this.changePlaceholder(plc);
    }

    this.winFocusReadMsg = function(){
        if($this.isVisible()){
            var kUid=$this.getKeyUid($this.userTo, $this.groupId);
            var fromGroupId=$this.userCache[kUid]['fromGroupId'],
                toGroupId=$this.userCache[kUid]['toGroupId'],
            data={user_current:$this.userTo,
                  group_im_id:$this.groupId,
                  from_group_id:fromGroupId,
                  to_group_id:toGroupId,
                  is_mode_fb:'false'};
            $.post(url_server+'?cmd=read_msg',data);
        }
    }

    this.changeIm = function(uid, groupId){
        var kUid=$this.getKeyUid(uid, groupId);

        $this.changePlaceholderInput(kUid);
        $this.$ppMsg.text('').trigger('autosize').blur();

        $this.$ppListMsg.removeAttr('style');
        $this.$ppSend.removeAttr('style');

		var isRecord=$this.$ppAudioRecord.is('.record'),
			isDeleteRecord=$this.$ppAudioRecord.is('.im_audio_message_delete');
		if (isRecord || isDeleteRecord){
			$this.$ppAudioRecord.data('stop_process',1);
			$this.runAudioRecorder();
			//$this.$ppAudioRecord.data('stop_process',0);
		}

        var fromGroupId=$this.userCache[kUid]['fromGroupId'],
            toGroupId=$this.userCache[kUid]['toGroupId'],
            data={group_im_id:groupId,
                  from_group_id:fromGroupId,
                  to_group_id:toGroupId,
                  is_mode_fb:isFbModeTitle};

        if ($this.userCache[kUid]['content']) {
            data['user_current']=uid;

            $.post(url_server+'?cmd=activate_im',data,function(res){
                var data=checkDataAjax(res);
                if(data!==false){
                    clCounters.updateNewMsg(data);
                }
            });
            $this.responseOpenIm(uid, groupId);
            $this.userCache[kUid]['content'].show();

            $this.slideMsgShow($this.userCache[kUid]['list_msg'], kUid);
            $this.userCache[kUid]['list_msg'].find('.pp_message_msg_item.to_show').removeClass('to_show');
            $this.initUserChatListMsg(kUid);
            $this.showContentIm(kUid);
        } else {
            data['user_id']=uid;
            data['upload_im']=1;

            $.post(url_ajax+'?cmd=pp_messages',data,function(res){
                if(!$this.isVisible())return;
                var data=checkDataAjax(res);
                if(data!==false){
                    $this.removePreviewNewMsg(kUid);
                    var $data=$(trim(data));
                    $data.filter('.update_script_chat').appendTo('#update_server');
                    $this.responseOpenIm(uid, groupId);
                    $data.filter($this.selUserTitleInfo).prependTo($this.$ppUserTitleInfo);

                    var $msgList=$data.filter($this.selUserListMsg);
                    $this.slideMsgShow($msgList, kUid);
                    $msgList.prependTo($this.$ppListMsg);
                    $this.showContentIm(kUid);
                }else{
                    $this.$ppContentLoader.addClass('hidden');
                    $this.actionOpenIm=false;
                    $this.showContentIm(kUid);
                    $this.sendMsgControlsDisabled();
                    alertServerError(true);
                }
            })
        }
    }

    this.openIm = function(uid, groupId){
        uid *=1;
        groupId *=1;
        if ((uid==$this.userTo && $this.groupId==groupId)
            ||$this.actionOpenIm) return;

        $this.actionOpenIm=true;

        $this.showContentLoader();
        if ($this.$ppContentUser.is('.to_hide')) {
            $this.changeIm(uid, groupId);
        }else{
            $this.$ppContentUser.oneTransEnd(function(){
                $this.changeIm(uid, groupId)
            }).addClass('to_hide');
        }

		playImAudioMessagePauseAll();
    }

    this.reInitToScroll = function(pl,posY,call,noAnimate){
        posY=defaultFunctionParamValue(posY, 'bottom');
        noAnimate=noAnimate||false;
        if(posY===false)return;
        if(typeof call!='function')call=function(){};
        if(isMobile()) {
            if(posY=='relative')return;
            var t=600;
            if(posY=='bottom'){
                posY=noAnimate?pl[0].scrollHeight:'max';
            }
            if (noAnimate) {
                pl.stop();
                pl[0].scrollTop = posY;
                return;
            }
            pl.scrollTo(posY, t, {axis:'y', interrupt:true, easing:'easeOutExpo', onAfter:call});
        } else {
            /*if(posY=='bottom'&&((pl.contentSize-pl.trackSize)<=20)){
                posY=0;
            }*/
            pl.update(posY,call);
        }
    }

    this.getTemplateMsg = function(send, msg, msgOrig, audioMessageId, groupId, fromGroupId, toGroupId, sticker){
		if (typeof sticker != 'object' || typeof sticker.code == 'undefined') {
			sticker=false;
		}
        var linkProfile=urlPagesSite.profile_view,
            photoProfile=urlFiles+$this.guidPhoto;
        if(fromGroupId){
            var kUid=$this.getKeyUid($this.userTo, groupId);
            linkProfile=$this.userCache[kUid]['groupLink'];
            photoProfile=urlFiles+$this.userCache[kUid]['groupPhoto'];
        }
		var clStickerCl=sticker?'sticker_wrap_bl':'';

        return  $('<div id="pp_message_msg_'+send+'" data-msg="'+(he(msgOrig))+'" data-send="'+send+'" data-id="0" data-to-user-id="'+$this.userTo+'" data-msg-user-id="'+$this.guid+'" data-audio-message-id="' + audioMessageId + '" data-group-id="'+groupId+'" data-from-group-id="'+fromGroupId+'" data-to-group-id="'+toGroupId+'" class="pp_message_msg_item to_show replies '+clStickerCl+'">'+
                    '<button class="pp_message_profile_pic pp_message_profile_pic_'+$this.guid+'" onclick="redirectUrl(\''+linkProfile+'\');" style="background-image: url('+photoProfile+')"></button>'+
                    '<div class="msg to_send">'+
                        '<div class="text" data-tooltip-data="true" title="'+l('just_now')+'"><span class="im_message">'+msg+'</span></div>'+
                        '<div class="message_extension">'+
                            '<div class="message_more_menu">'+
                                '<div class="ellipsis">'+
                                    '<span></span>'+
                                '</div>'+
                                    '<ul id="pp_message_msg_menu_'+send+'" class="more_menu_collapse collapse more_msg_menu">'+
                                        '<li>'+
                                            '<a href="#" class="delete_from_me">'+
                                                '<span class="icon_fa" data-cl-loader="msg_loader_menu_more"><i class="fa fa-times" aria-hidden="true"></i></span>'+
                                                l('delete_for_me')+
                                            '</a>'+
                                        '</li>'+
                                        '<li>'+
                                            '<a href="#" class="delete_everywhere">'+
                                                '<span class="icon_fa" data-cl-loader="msg_loader_menu_more"><i class="fa fa-trash" aria-hidden="true"></i></span>'+
                                                l('delete_for_everyone')+
                                            '</a>'+
                                        '</li>'+
                                    '</ul>'+
                            '</div>'+
                            '<div id="msg_read_" data-mid="" class="icon_check_msg to_hide"></div>'+
                        '</div>'+
                    '</div>'+
                 '</div>');
    }

    this.prepareMsg = function(kUid,$msg){
        var $list=$this.userCache[kUid]['list_msg'],
            $lastMsg=$list.find('.pp_message_msg_item:not(.write)').last(),fn='appendTo',cont=$list;
        if($lastMsg[0]){
            if($lastMsg.data('msgUserId')==$msg.data('msgUserId')){
                if($msg.is('.write')){
                    $msg.find('.pp_message_profile_pic').hide();
                }else{
                    $msg.find('.pp_message_profile_pic').remove();
                }
            }
            cont=$lastMsg;
            fn='insertAfter';
        }
        var $lastMsgWr=$list.find('.pp_message_msg_item').last();
        if($lastMsgWr[0]&&$lastMsgWr.is('.write')){
            var is=$lastMsgWr.data('msgUserId')==$msg.data('msgUserId');
            $lastMsgWr.find('.pp_message_profile_pic')[is?'fadeOut':'fadeIn'](300);
            if (!$lastMsg[0]) {
                fn='insertBefore';
                cont=$lastMsgWr;
            }
        }
        return {msg:$msg, cont:cont, fn:fn};
    }

    /*this.showMsgOne = function($msg,t,call,notReInitScroll){
        var uid=$this.userTo;
        var data=$this.prepareMsg(uid,$msg);
        $msg = data.msg;
        notReInitScroll=notReInitScroll||0;
        $this.userCache[uid]['list_msg'].removeClass('animate');
        var scrollPl=$this.userCache[$this.userTo]['pl'];
        $msg.addClass('animate_sent').hide()[data.fn](data.cont)
            .slideDown({duration:t||250,
                        step:function(){
                            if(!notReInitScroll)$this.reInitToScroll(scrollPl)
                        },
                        complete:function(){
                            if(!notReInitScroll)$this.reInitToScroll(scrollPl)
                            if(typeof call=='function')call();
                            $msg.removeClass('animate_sent');
                            if(!$this.userCache[uid]['list_msg'].find('.animate_sent')[0]){
                               $this.userCache[uid]['list_msg'].addClass('animate');
                            }
                        }})
	}*/

    this.setNewMsg = function($msg,uid,groupId,kUid){
        var $prev=$this.userCache[kUid]['preview_msg'].addClass('to_new');
        if ($this.userTo == uid && $this.groupId == groupId) {
            $msg.addClass('to_new').delay(2000).removeClass('to_new',0);
            setTimeout(function(){
                $prev.is('.to_new')&&!$prev.is(':animated')&&$prev.removeClass('to_new');
            },2000)
        } else {
            $msg.addClass('to_new');
        }
    }

    this.removeNewMsg = function(kUid){
        $this.userCache[kUid]['preview_msg'].removeClass('to_new');
        $('.to_new',$this.userCache[kUid]['list_msg']).removeClass('to_new');
    }

    this.removePreviewNewMsg = function(kUid){
        $this.userCache[kUid]['preview_msg'].removeClass('to_new');
    }

    this.showMsgBouncein = function($msg,fnTo,$cont,scrollToY,call,notReInitScroll,update){
        var uid=$msg.data('toUserId'),
            groupId=$msg.data('groupId'),
            kUid=$this.getKeyUid(uid, groupId),
            $listMsg=[];

        var scrollPl=$this.userCache[kUid]['pl'];
        notReInitScroll=notReInitScroll||0;
        $cont=$cont||$this.userCache[kUid]['list_msg'];
        update=update||false;

        $this.prepareImage($msg,scrollPl);

        if (fnTo) {
            $listMsg=$this.userCache[kUid]['list_msg'].removeClass('animate');
        } else {
            var data=$this.prepareMsg(kUid,$msg);
            fnTo=data.fn;
            $cont=data.cont;
            $msg = data.msg;
        }

        if (($cont.is(':hidden')||$this.$ppContentUser.is('.to_hide'))
             &&!$cont.is('.pp_messages_upload_msg_loader')) {
            $msg.removeClass('to_show')[fnTo]($cont);
            if (update&&false) {
                if ($msg.is('.sent')) {
                    var $list=$this.userCache[kUid]['list_msg'];
                    $this.setNewMsg($msg,uid,groupId,kUid);
                    $list.off('mouseover').one('mouseover',function(){
                        $this.removeNewMsg(kUid);
                        $cont.removeClass('to_new');
                    });
                } else {
                    $this.removePreviewNewMsg(kUid);
                }
            }
            if(typeof call=='function')call();
            return;
        }


        $msg.oneAnimationEnd(function(){
            $msg.removeAttr('style');
            if(typeof call=='function')call();
            if(!notReInitScroll){
                if(typeof scrollToY == 'function'){
                    scrollToY()
                } else {
                    $this.reInitToScroll(scrollPl,scrollToY);
                }
            }
            $listMsg[0]&&$listMsg.addClass('animate');
        })[fnTo]($cont);
        setTimeout(function(){
            if(!notReInitScroll){
                if(typeof scrollToY == 'function'){
                    scrollToY()
                } else {
                    $this.reInitToScroll(scrollPl,scrollToY);
                }
            }
            $this.initTooltipData($msg);
        },10);
    }

    this.prepareImageResize = function(){
        if(!$this.isOpened())return;
        $this.setMaxWidthMsg();

        if($this.userTo){
            var kUid=$this.getKeyUid($this.userTo, $this.groupId);
            $this.prepareImage($this.userCache[kUid]['list_msg'], $this.userCache[kUid]['pl'], true);
        }

        $('.pp_message_user_list_message:hidden', $this.$ppContent ).find('.mod_im_msg_image img').each(function(){
            $(this).css({width:'',height:''}).data('set-params',false);
        })
    }

    this.prepareImage = function($node, pl, resize){
        $this.setMaxWidthMsg(true);
        pl=pl||false;
        var $images=$node.find('.mod_im_msg_image img');
        if (!$images[0])return $node;

        resize=resize||false;
        var ratio=0;

        //wWrap=$this.ppMsgMaxW||$images.eq(0).closest('.pp_message_msg_item').width() - 80;//original = 78
        wWrap=$this.ppMsgMaxW||$('#msg_img_template_ration').width();

        $images.each(function(){
            var $img=$(this);
            if($img.data('setParams')&&!resize) return false;

            $img.css({width:'',height:''}).data('set-params',true);
            var w=$img.data('width'),
                wOrig=w,
                h=$img.data('height'),
                hOrig=h,
                ratio=wWrap/w;
                if (w>wWrap) {
                    w=wWrap;
                    h=Math.round(h * ratio, 1);
                }
                var maxHeight=300,
                    dpr=window.devicePixelRatio
                if(dpr&&$jq('body').is('.city_body.city_mobile')){
                    maxHeight=Math.round(maxHeight*dpr);
                }
                if (h > maxHeight) {
                    ratio=maxHeight/hOrig;
                    w=Math.round(wOrig * ratio, 1);
                    h=maxHeight;
                }
            $img.css({width:w+'px',height:h+'px'});
            pl&&$this.reInitToScroll(pl);
        })

        return $node;
    }

    this.send = function(sticker){
		if (typeof sticker != 'object' || typeof sticker.code == 'undefined') {
			sticker=false;
		}
		sticker=defaultFunctionParamValue(sticker, false);
        if(!sticker && ($this.processUploadImage || $this.mediaRecorderProcess))return false;

		var audioMessageId=0;
		if (!sticker && $this.$ppAudioRecord[0]) {
			audioMessageId=$this.$ppMsg.data('im-audio-message-id');
			$this.$ppMsg.find('.im_audio_message_send_play').remove();
		}

		if(!sticker) {
			audioMessageId = $('.app_ios_im_audio_message_recorder').data('im-audio-message-id');
			if(typeof(audioMessageId) == 'undefined') {
				audioMessageId = 0;
			}
		}

		var msgIn=sticker||$this.$ppMsg[0].innerHTML,
			msgPrepare=smileTextPrepare(msgIn),
			msg=msgPrepare.msg, emoji=msgPrepare.emoji;

		if (msg == $this.$ppMsg.data('placeholder')) {
			msg = '';
		}

        var imageFromDrawer = ImageDrawer.getImage('im');

		if (!sticker){
			$this.$ppMsg.trigger('clear-caret-position');
			if(!msg && !audioMessageId && !$this.isImageLoaded && !imageFromDrawer){
				$this.$ppMsg.text('').trigger('autosize').focus();
				return false;
			}
		}

        var uid=$this.userTo,
            groupId=$this.groupId,
            kUid=$this.getKeyUid($this.userTo, groupId),
            fromGroupId=$this.userCache[kUid]['fromGroupId'],
            toGroupId=$this.userCache[kUid]['toGroupId'];

        if($this.$ppNewMsgLink.is('.disabled'))$this.$ppNewMsgLink.removeClass('disabled');

        $this.lastEnteredMessage='';
        var msgHtml=strToHtml(msg),
            send= +new Date,
            preload='';

        if(!sticker &&($this.isImageLoaded || audioMessageId || imageFromDrawer)){
            preload = '...';//l('image_loading');
        }/* else if(msg.match(/https?:\/\/\S+(?:jpg|jpeg|png|gif)/)) {///.jpg|.png|.jpeg|.gif/i.test(msg)
            preload = '...';//l('im_msg_processed');
        } else if (msg.match(/(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)
                    || msg.match(/(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/)) {
            preload = '...';//l('im_msg_processed');
        }*/

		msgPrepare = smileTextReplace(emoji, msg, msgHtml);
		msg = msgPrepare.msg;
		var msgTmpl=msgPrepare.msgTmpl;

		if(sticker){
			msg=sticker.code;
			msgTmpl=sticker.html;
		}

		var msgOrig=msgTmpl;//msgHtml;
        if (preload) {
            msgTmpl ='<div class="image_preload">' + preload + '</div>' + '\n' + msgTmpl;
            if (!msgOrig) {
                msgOrig = preload;
            }
        }

		msgOrig=trim(br2nl(msgOrig));
		msgOrig=msgOrig.replace(/\n|\t/g, ' ');

        var $msg=$this.getTemplateMsg(send, msgTmpl, msgOrig, audioMessageId, groupId, fromGroupId, toGroupId, sticker),
            $node=$msg.find('.msg > .text');

		if (sticker){
			$this.showMsgBouncein($msg);
		} else {
			$this.$ppMsg.text('').trigger('autosize',function(){
				$this.showMsgBouncein($msg);
			}).focus();
		}

        $this.updateMsgPreview($msg);

        msg=emojiToHtml(msg);

        $this.prepareMoreMenu();
        debugLog('IM: SEND msg',[kUid,msg],'#d0e8cd');

		var imageUpload = 0, indImageUpload =0;
		if (sticker) {

		} else {
			if ($this.$ppAudioRecord[0] && audioMessageId) {
				$this.$ppMsg.data('im-audio-message-id', 0);
				$this.$ppAudioRecord.removeClass('im_audio_message_delete');
			}
			imageUpload = $this.isImageLoaded?1:0;
			indImageUpload = $this.isImageLoaded;
		}

		$('.app_ios_im_audio_message_delete').removeClass('app_ios_im_audio_message_delete').data('im-audio-message-id', 0);

        var fnSend=function(retry){
            var data = {
                    user_to:uid,
                    group_im_id:groupId,
                    from_group_id:fromGroupId,
                    to_group_id:toGroupId,
                    msg:msg,
                    send:send,
                    to_delete:0,
                    retry:retry,
					audio_message_id:audioMessageId,
                    image_upload:imageUpload,
                    ind:indImageUpload,
                    image_drawer: imageFromDrawer
                };
			if (sticker) {
				data['sticker'] = sticker.data;
                data['image_drawer'] = '';
			}
            retry=retry||0;
            $.ajax({url:url_ajax+'?cmd=send_message',
                type:'POST',
                data:data,
                timeout: globalTimeoutAjax,
                //cache: false,
                success: function(res){
                    if(!$this.isVisible())return;
                    var data=checkDataAjax(res);
                    if(data!==false){
                        if(data=='redirect'){
                            redirectUrl(data['url'])
                        }else{
                            data=$(trim(data));
                            if(!data[0]){
                                debugLog('IM: SEND msg ERROR NO DATA',data,'#d0e8cd');
                                return;
                            }
                            debugLog('IM: SEND msg RESPONSE',true,'#d0e8cd');
                            var $msgRes=data.find('.pp_message_msg_item'),
                                mid=$msgRes.data('id'),sendId=$msgRes.data('send'),
                                dataMsg=$msgRes.data('msg');

                            if($msgRes.data('blockList')){
                                $msg.find('.message_extension').remove();
                            }
                            //if(!$('#pp_message_msg_'+mid)[0]&&!$('#pp_message_msg_'+sendId)[0]){
                            $msg.attr({'id':'pp_message_msg_'+mid,'data-id':mid,'data-msg':dataMsg}).data({id:mid,msg:dataMsg});
                            $msg.find('.icon_check_msg').data('mid', mid).attr({'id':'msg_read_'+mid,'data-mid':mid});
                            $msg.find('.more_msg_menu').attr({'pp_message_msg_menu_':'msg_read_'+mid});

                            $msg.find('.delete_from_me').click(function(){
                                $this.removeMsgFromChat(mid, true);
                                return false;
                            })
                            $msg.find('.delete_everywhere').click(function(){
                                $this.removeMsgFromChat(mid);
                                return false;
                            })
                            var txt=$msgRes.find('.msg > .text').html();
							txt=trim(txt.replace(/\n|\t/g,''));

                            if(txt!=$node.html()){
                                $this.updateMsgPreview($msg);
                                data.imagesLoaded(function(){
                                    $node.html(txt);
                                    if (!$msgRes.find('.smile, a')[0]) {
                                        $msg.data('msg', $msgRes.data('msg'));
                                    }
                                    $this.prepareImage($node,$this.userCache[kUid]['pl']);
                                    $this.reInitToScroll($this.userCache[kUid]['pl']);
                                })
                            }
                            $msg.find('.msg').removeClass('to_send');
                            //}
                        }
                    } else {
                        debugLog('IM: SEND msg error OR msg already sent',data,'#d0e8cd');
                        //$this.deleteMsg($msg, uid);
                    }
                },
                error: function(xhr, textStatus, errorThrown){
                    if(!$this.isVisible())return;
                    globalRetryAjaxTimeout(xhr, textStatus, errorThrown, function(){
                        debugLog('IM: retry send msg',true,'#d0e8cd');
                        fnSend(1);
                    })
                    //$this.deleteMsg($msg, uid);
                },
            })
        }
        fnSend();

        !sticker && $this.clearUploadImage();
        if(!sticker && imageFromDrawer) {
            ImageDrawer.closeIm();
        }

		return false;
    }

    this.uploadingMsg = function(kUid, uid, groupId){
        if($this.userCache[kUid]==undefined)return;

        var firstMid=$this.userCache[kUid]['first_msg_id'];
        if(!firstMid||$this.userCache[kUid]['ajax_upload_msg']||$('#pp_message_msg_'+firstMid)[0]) return;
        $this.userCache[kUid]['ajax_upload_msg']=true;
        //console.log('UPLOAD MSG', kUid);
        var $listBox=$this.userCache[kUid]['list_msg'];
        if($this.userCache[kUid]['loader']){
            $this.userCache[kUid]['loader'].show();
        }else{
            $this.userCache[kUid]['loader']=createLoader('pp_messages_upload_msg_loader',false).prependTo($listBox);
        }
        $this.reInitToScroll($this.userCache[kUid]['pl'], 0);

        $this.userCache[kUid]['limit_start']+=$this.imHistoryMessages;

        var fromGroupId=$this.userCache[kUid]['fromGroupId'],
            toGroupId=$this.userCache[kUid]['toGroupId'];

        var url=url_ajax+'?cmd=uploading_msg',
        dataRes={
            user_id:uid,
            limit_start:$this.userCache[kUid]['limit_start'],
            group_im_id:groupId,
            from_group_id:fromGroupId,
            to_group_id:toGroupId,
        },
        fnStopLoad=function(){
            if ($this.userTo!=uid && $this.groupId!=groupId) {
                $this.userCache[kUid]['loader'].aSlideUp({dur:200});
                $this.userCache[kUid]['ajax_upload_msg']=false;
                $this.userCache[kUid]['limit_start']-=$this.imHistoryMessages;
                return true;
            }
            return false;
        },
        fnSuccess=function(res){
            var data=checkDataAjax(res);
            if(data!==false){
                if (fnStopLoad())return;
                var $data=$(trim(data)), $listMsg=$data.find('.pp_message_msg_item');
                if($('#pp_message_msg_'+firstMid,$listMsg)[0]||!$listMsg[0]){
                    $this.userCache[kUid]['first_msg_id']=0;
                }
                var fnComplete=function(){
                    $this.showUploadingMsg(kUid,$listMsg);
                },
                loaderParam={
                    step:function(){$this.reInitToScroll($this.userCache[kUid]['pl'], 0)},
                    complete:fnComplete,
                    duration:300
                };
                $this.userCache[kUid]['loader'].aSlideUp({complete:fnComplete,param:loaderParam});
            }else{
                fnStopLoad();
                alertServerError();
            }
        },
        fnError=function(){
            if(!fnStopLoad())fnLoad();
        },
        fnLoad=function(){
            debugLog('IM uploadingMsg', dataRes);
            $ajax(url, dataRes, fnSuccess, fnError);
        };
        fnLoad();

        /*$.post(url_ajax+'?cmd=uploading_msg',dataRes, function(res){

            var data=checkDataAjax(res);
            if(data!==false){
                if ($this.userTo==uid) {
                    $this.userCache[uid]['loader'].aSlideUp({dur:200});
                    $this.userCache[uid]['ajax_upload_msg']=false;
                    return;
                }
                //console.log(data);
                var $data=$(trim(data)), $listMsg=$data.find('.pp_message_msg_item');
                if($('#pp_message_msg_'+firstMid,$listMsg)[0]||!$listMsg[0]){
                    $this.userCache[uid]['first_msg_id']=0;
                }
                var fnComplete=function(){
                    $this.showUploadingMsg(uid,$listMsg);
                },
                loaderParam={
                    step:function(){$this.reInitToScroll($this.userCache[uid]['pl'], 0)},
                    complete:fnComplete,
                    duration:300
                };
                $this.userCache[uid]['loader'].aSlideUp({complete:fnComplete,param:loaderParam});
            }else{
                $this.userCache[uid]['loader'].aSlideUp({dur:200});
                alertServerError();
                $this.userCache[uid]['ajax_upload_msg']=false;
            }
        })*/
    }

    this.showUploadingMsg = function(kUid,$listMsg){
        if(!$listMsg[0]){
            $this.userCache[kUid]['ajax_upload_msg']=false;
            return;
        }

        $this.prepareImage($listMsg,false);

        var $listUser=$this.userCache[kUid]['list_msg'],
            $msg, mid, t=1000, i=$listMsg.length-1, mUid, m=0,
            $firstMsg=$('.pp_message_msg_item:first',$this.userCache[kUid]['list_msg']),
            $firstPhoto=$firstMsg.find('.pp_message_profile_pic'),
            $elH=[], posY,
            fnReintScroll=function(is){
                is=is||false;
                posY=$firstMsg.position().top;
                if(is&&$elH[0]){
                    $elH.each(function(){
                        posY=posY-$(this).outerHeight(true);
                    })
                }
                /*if (posY>=$this.userCache[kUid]['pl'].contentSize-$this.userCache[kUid]['pl'].viewportSize) {
                    posY='bottom';
                }*/
                //(pl,posY,call,noAnimate)
                $this.reInitToScroll($this.userCache[kUid]['pl'], posY, false, !is);
            };

        $listUser.removeClass('animate');
        (function fu(){
            if(i<0){
                if ($listMsg[0]) {
                    $listMsg.insertAfter($this.userCache[kUid]['loader']);
                    fnReintScroll();
                    setZeroTimeout(function(){
                        if (isMobile()) {
                            $this.userCache[kUid]['ajax_upload_msg']=false;
                        } else {
                            $listUser.oneTransEnd(function(){
                                $listUser.toggleClass('animate_1 animate');
                                $this.userCache[kUid]['ajax_upload_msg']=false;
                            },'top').addClass('animate_1');
                        }
                        fnReintScroll(true)
                        $this.initTooltipData($listMsg);
                    })
                } else {
                    fnReintScroll();
                    !isMobile() && $listUser.addClass('animate');
                    $this.userCache[kUid]['ajax_upload_msg']=false;
                }
                return false;
            }

            $msg=$listMsg.eq(i);
            mUid=$msg.data('msgUserId');
            if($firstPhoto[0] && mUid==$firstMsg.data('msgUserId')){
                $firstPhoto.oneTransEnd(function(){
                    $(this).remove()
                },'opacity').css({opacity:0});
            }
            $firstPhoto=[];
            //$msg.addClass(mUid==$this.guid?'to_show_upload':'to_show_upload left');
            mid=$msg.data('id');
            if($('#pp_message_msg_'+mid,$this.$messagesBox)[0]){
                $msg.remove()
            } else {
                if(++m<4)$elH=m==1?$msg:$elH.add($msg);
            }
            i--; fu();
            /*if(!$('#pp_message_msg_'+mid,$this.$messagesBox)[0]){
                $msg.insertAfter($this.userCache[kUid]['loader']);
                fnReintScroll();
                /*$this.showMsgBouncein($msg.css({animationDuration:(t*=.7)+'ms'}),
                                      'insertAfter',
                                      $this.userCache[kUid]['loader'],
                                      fnReintScroll,
                                      function(){i--; fu();});*/
            /*} else{
                i--; fu();
            }*/
        })()
    }

    this.setLastId = function(mid){
        mid=mid*1;
        console.log('SET LAST ID', mid, (mid^0)!==mid, last_id>=mid);
        if((mid^0)!==mid||last_id>=mid)return;
        console.log('SET LAST ID :', mid);
        last_id=mid;
    }

    this.updateMsgPreviewToMoveFirst = function(uid,groupId,kUid,$msg){
        console.log('%cIM: updateMsgPreviewToMoveFirst', 'background: #73afda', uid,groupId,kUid);
        $this.moveImToFirst(kUid,true);
        if ($msg.is('.sent')) {//$this.userTo!=uid&&
            $this.setNewMsg($msg,uid,groupId,kUid);
        } else {
            $this.removePreviewNewMsg(kUid);
        }
        $this.updateMsgPreview($msg);
    }

    /* Update preview msg */
    this.updateMsgPreview = function($msg){
        var data=$msg.data(),
            toUid=data['toUserId'],
            groupId=data['groupId'],
            kUid=$this.getKeyUid(toUid, groupId);

        if(!$this.userCache[kUid])return;
        var mUid=data['msgUserId'],
            msg=data['msg'].toString(),
            $msgPreview=$('<div>'+msg+'</div>'),
            //msg=$msg.find('.msg > span').html(),
            $preview=$this.userCache[kUid]['preview_msg'],
            $youMsg=$preview.find('.you_message'),
            isHidden=$preview.isHidden(),
            $cont;

        if (!$msgPreview.find('.fa-picture-o, .fa-play-circle, i.image_preview, span')[0]) {
            msg=strToHtml(msg, true);
        }

        if ($preview.is(':empty')) {
            $preview.hide();
        }
        if($youMsg[0] && $this.guid==mUid){
            $cont=$youMsg;
        } else {
            $cont=$preview;
            if($this.guid==mUid){
                msg=l('you_message').replace(/{message}/, msg);
            }
        }

        if(data['msg'] === '' && data['audioMessageId']) {
            msg += '<i class="fa fa-play-circle" aria-hidden="true"></i>';
            //console.log('message player added', msg);
        }

        if(isHidden){
            $cont.html(msg).removeClass('to_hide');
        }else{
            $cont.stop().fadeOut(200,function(){
                $cont.html(msg).stop().fadeIn(200);
            })
        }
        if($preview.is(':hidden')){
            $preview.aSlideDown({dur:250});
        }
    }
    /* Update preview msg */

    this.notifNewMsg = function(){
        debugLog('IM: Notif Sound',mobileAppLoaded && !getGUserOption('sound'),'#d0e8cd');
        if(mobileAppLoaded && !getGUserOption('sound'))return;
        playSound();
    }

    this.notifFromNoVisibilityPage = function(){
        if($this.isVisible())return;
        $this.notifNewMsg();
    }

    this.updateServer = function($data){
        debugLog('IM: server update',$data[0]?true:false,'#d0e8cd');
        if(!$data[0])return;

        var $listMsg=$data.find('.pp_message_msg_item'),
            fnUpdateScriptAfter=function(){
                $data.find('script.script_update_after').appendTo('#update_server');
            };

        $data.find('script.script_update_before').appendTo('#update_server');
        if(!$listMsg[0]){
            fnUpdateScriptAfter();
            return;
        }
        debugLog('IM: server update ITEMS',$listMsg[0].length*1,'#d0e8cd');
        var toUserId, msgUserId, groupId, kUid, d=225, j=0;
        (function fu(){
            var $item=$listMsg.eq(j);
            if(!$item[0]){
                fnUpdateScriptAfter();
                return;
            }

            toUserId=$item.data('toUserId');
            groupId=$item.data('groupId');
            msgUserId=$item.data('msgUserId');
            kUid=$this.getKeyUid(toUserId, groupId);

            $this.setLastId($item.data('id'));
            if(!$('#'+$item[0].id)[0] && !$('#pp_message_msg_'+$item.data('send'))[0]){
                if ($this.userCache[kUid]) {

                    $this.updateMsgPreviewToMoveFirst(toUserId,groupId,kUid,$item);
                    if ($this.userCache[kUid]['list_msg']){
                        var $wr=$this.userCache[kUid]['list_msg'].find('.pp_message_msg_item.writing');
                        if($wr[0]){
                            $this.deleteMsg($wr, kUid, function(){
                                $this.showMsgBouncein($item.addClass('to_show'),false,false,'bottom',function(){
                                    j++; fu();
                                },0,true)
                            })
                        } else{
                            $this.showMsgBouncein($item.addClass('to_show'),false,false,'bottom',function(){
                                j++; fu();
                            },0,true)
                        }
                    } else {
                        j++; fu();
                    }
                } else {
                    $this.openOneIm(toUserId, groupId, $item.data('toGroupId'), $item.data('fromGroupId'));
                }
            }else{
                j++; fu();
            }
        })();
    }

    this.updateOnlineUsers = function(usersStatus){
        //console.log('ONLINE IM ONE',usersStatus);
        var l=Object.keys(usersStatus).length,i=1;
        for (var uid in usersStatus) {
            users_list[uid]=usersStatus[uid];
            $this.setOnlineUser(uid, usersStatus[uid]);
            if(l==i && $this.isShowOnlyOnline){
                $this.showOnlyOnline(true,true);
            }
            i++;
        }
    }

    this.setOnlineUser = function(uid, status){
        var $contact=$('.pp_message_user_'+uid+', .pp_message_user_title_info_'+uid);
        if(!$contact[0])return;
        $contact[status?'addClass':'removeClass']('online');
    }

    this.getReadMsgFromIm = function(){
        var getReadMsgFromIm={};
        for (var uid in $this.userCache) {
            if($this.userCache[uid]['list_msg']&&$this.userCache[uid]['list_msg'][0]
                &&$this.userCache[uid]['list_msg'].find('.icon_check_msg.to_hide')[0]){
                getReadMsgFromIm[$this.userCache[uid]['uid']]=1;
                /*
                 getReadMsgFromIm[uid]={
                    uid:$this.userCache[uid]['uid'],
                    group:$this.userCache[uid]['groupId']
                };
                */
            }
        }
        return JSON.stringify(getReadMsgFromIm);
    }

	this.showReadMsg = function(list){
        for (var uid in list) {
            if($this.userCache[uid]&&$this.userCache[uid]['list_msg']&&$this.userCache[uid]['list_msg'][0]){
                var id=list[uid]*1;
                if($('#msg_read_'+id).is('.to_hide')){
                    $this.userCache[uid]['list_msg'].find('.icon_check_msg.to_hide').each(function(){
                        var $el=$(this),
							audio=$el.closest('.msg').find('.im_audio_message')[0];
                        if($el.data('mid')<=id && !audio)$el.removeClass('to_hide');
                    })
                }
            }
        }
    }

	this.getReadAudioMsgFromIm = function(){
        var getReadAudioMsgFromIm={};
        for (var uid in $this.userCache) {
            if($this.userCache[uid]['list_msg']&&$this.userCache[uid]['list_msg'][0]
                &&$this.userCache[uid]['list_msg'].find('.icon_check_msg.to_hide')[0]){
				$this.userCache[uid]['list_msg'].find('.icon_check_msg.to_hide').each(function(){
					var $el=$(this),
						audio=$el.closest('.msg').find('.im_audio_message')[0];
					if(audio){
						getReadAudioMsgFromIm[$el.data('mid')]=1;
					}
				})
            }
        }
        return JSON.stringify(getReadAudioMsgFromIm);
    }

	this.showReadAudioMsg = function(msgs){
        for (var mid in msgs) {
			var $el=$('#msg_read_'+mid);
            if($el.is('.to_hide')){
				var audio=$el.closest('.msg').find('.im_audio_message')[0];
				if(audio)$el.removeClass('to_hide');
            }
        }
    }

    this.prepareMoreMenu = function($msg){
        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        $msg=defaultFunctionParamValue($msg,$('.pp_message_msg_item', $this.userCache[kUid].list_msg));
        $this.$ppLinkClearChat[$msg[0]?'show':'hide']();
        $this.$ppUserMenuStreetchat[$this.userCache[kUid]['groupId']?'hide':'show']();
        $this.$ppUserMenuCalendar[$this.userCache[kUid]['groupId']?'hide':'show']();
		$this.$ppUserMoreMenuReport[$this.userCache[kUid]['report_sent']?'hide':'show']();
        if(!$this.$ppUserMoreMenuOneLink){
            $this.$ppUserMoreMenuLi[$msg[0]?'show':'hide']();
        }
    }

    this.confirmCloseChat = function(){
        $this.closeMoreMenu();
        confirmCustom(l('message_close_conversation'), function(){$this.clearChat(1)});
    }

    this.confirmClearChat = function(){
        $this.closeMoreMenu();
        confirmCustom(l('message_clear_conversation'), function(){$this.clearChat(0)});
    }

    this.clearChat = function(onlyCloseIm){
        var uid=$this.userTo,
            kUid=$this.getKeyUid($this.userTo, $this.groupId),
            firstMid=$this.userCache[kUid]['first_msg_id'];
        $this.userCache[kUid]['first_msg_id']=0;
        onlyCloseIm=onlyCloseIm||0;

        $this.showContentLoader();
        $this.prepareMoreMenu(false);

        var fromGroupId=$this.userCache[kUid]['fromGroupId'],
            toGroupId=$this.userCache[kUid]['toGroupId'],

            data={user_id:uid,
                  group_im_id:$this.groupId,
                  from_group_id:fromGroupId,
                  to_group_id:toGroupId,
                  get_count_msg_all:1,
                  only_close_im:onlyCloseIm
            };

        $.post(url_ajax+'?cmd=clear_history_messages',data,function(res){
            $this.hideContentLoader();
            $this.sendMsgControlsDisabled();
            var data=checkDataAjax(res);
            if(data!==false){
                clCounters.update(data);
                if(onlyCloseIm){
                    $this.blockUserResponse(kUid);
                } else {
                    $this.userCache[kUid]['list_msg'].html('');
                    var msg='';//l('you_message').replace(/{message}/, l('no_messages_yet'));
                    $this.userCache[kUid]['preview_msg'].aSlideUp({dur:250,complete:function(){$(this).html(msg)}});
                }
            }else{
                alertServerError(true);
                $this.userCache[kUid]['first_msg_id']=firstMid;
            }
        })
        return false;
    }

    this.closeMoreMenu = function(){
        $this.closeChatMenu();
        $this.closeMsgMenu();
    }

    this.closeChatMenu = function(){
        if($this.$ppUserMoreMenuBl[0] && $this.$ppUserMoreMenuBl.is('.in'))$this.$ppUserMoreMenuBl.collapse('hide');
    }

    this.confirmBlockUser = function(){
        $this.closeMoreMenu();
        confirmCustom(l('do_you_want_to_block_the_user'), function(){
            var uid=$this.userTo,
                kUid=$this.getKeyUid($this.userTo, $this.groupId),
                data=false,
                cmd='block_visitor_user';
            $this.showContentLoader();

            if($this.groupId){
                data={group_im_id:$this.groupId,
                      from_group_id:$this.userCache[kUid]['fromGroupId'],
                      to_group_id:$this.userCache[kUid]['toGroupId']},
                cmd='block_user_group';
            }
            clProfile.blockUser(false,uid,cmd,function(){$this.blockUserResponse(kUid)},data);
        })
    }

    this.blockUserResponse = function(kUid){
        $this.hideContentLoader();
        var $contact=$this.userCache[kUid]['contact'],
            $firstIm=$contact.next('.contact:visible');
        $contact.aSlideUp({dur:$this.durMoveChat, complete:function(){
            $contact.remove();
            $this.userCache[kUid]['list_msg'].remove();
            $this.deleteDataOneChat();
            $this.initControls();
        }})
        if($firstIm[0]){
            $this.setActiveFirstChat($firstIm);
        }else{
            $this.$ppNewMsgLink.addClass('disabled');
            $this.hideUserContent($this.close);
        }
    }

    this.redirectToProfile = function(e,url){
        if($(e.target).closest('#pp_messages_contacts').width()<59)return;
        redirectUrl(url);
    }

    this.getOnlineUser = function(kUid){
        var $contact=$this.userCache[kUid]['contact'];
        if(!$contact[0])return false;
        return $contact.is('.online');
    }

    this.inviteVideoChat = function($link){
        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        clVideoChat.checkInvite($link.data('uid', $this.userTo), $this.getOnlineUser(kUid), $this.groupId, $this.userCache[kUid]['groupType'] == 'page');
    }

    this.inviteAudioChat = function($link){
        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        clAudioChat.checkInvite($link.data('uid', $this.userTo), $this.getOnlineUser(kUid), $this.groupId, $this.userCache[kUid]['groupType'] == 'page');
    }

    this.inviteStreetChat = function($link){
        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        clCityStreetChat.invite($link.data('uid', $this.userTo), $this.getOnlineUser(kUid));
    }


    this.toCalendar = function($link){
        var kUid=$this.getKeyUid($this.userTo, $this.groupId);
        redirectUrlLoader($link, $this.userCache[kUid]['calendar_url'])
    }

    this.updateWritingUsers = function(writingUsers){
        debugLog('IM updateWritingUsers', writingUsers);
        for (var uid in writingUsers) {
            if(uid==$this.userTo){
                var $listMsg=$('#pp_message_list_message_'+uid),
                    $contact=$('#pp_message_user_'+uid);
                if ($listMsg[0] && $contact[0] && !$listMsg.find('.writing')[0]) {
                    var $html='<div id="pp_message_msg_writing_'+uid+'" data-id="pp_message_msg_writing_'+uid+'" data-to-user-id="'+uid+'" data-msg-user-id="'+uid+'" class="pp_message_msg_item to_show sent writing">'+
                                    '<div class="msg">'+
                                        '<div class="load_dot">'+
                                            '<div class="line"></div>'+
                                            '<div class="line"></div>'+
                                            '<div class="line"></div>'+
                                        '</div>'+
                                   '</div>'+
                            '</div>';
                    $html=$($html).prepend($contact.find('button').clone().addClass('pp_message_profile_pic pp_message_profile_pic_'+uid));
                    $this.showMsgBouncein($html);
                }
                break;
            }
        }
    }

    this.deleteMsg = function($msg, kUid, call){
        var $listMsg=$('#pp_message_list_message_'+kUid).removeClass('animate');
        var scrollPl=$this.userCache[kUid]['pl'];

        var checkPhoto=$msg.is('.writing') ? false : true,
            $photo=[],
            $msgNext=[],
            $photoRemove=[];
        if (checkPhoto) {
            $photo=$msg.find('.pp_message_profile_pic');
            if($photo[0]){
                $msgNext=$msg.next('.pp_message_msg_item');
                var cl=$msg.is('.sent')?'.sent':'.replies';
                if($msgNext.is(cl)){
                    if($msgNext.find('.pp_message_profile_pic')[0]){
                        $photo=[];
                    }else{
                        $photo=$photo.clone().stop().fadeTo(0,0);
                    }
                } else {
                    $photo=[];
                    $photoRemove=$msgNext.find('.pp_message_profile_pic');
                }
            }
        }

        var $cont=$msg.addClass('animate_sent').css('bottom',0).find('.msg'),
            h=Math.round($cont.height()/2)+1;

	    $msg.stop().animate({
                        //marginBottom: '-'+(h*2+15)+'px'
                        height:'toggle',
                        opacity: .25,
                        marginBottom: '-15px'
                        },
                        {duration:$this.dur,//2000,
                        step:function(){
                            $this.reInitToScroll(scrollPl,'relative');
                        },
                        complete:function(){
                            if ($photo[0] && $msgNext[0]) {
                                $msgNext.prepend($photo.stop().fadeTo(150,1));
                            }
                            if($photoRemove[0]){
                                $photoRemove.stop().fadeTo(150,0,function(){
                                    $photoRemove.remove();
                                })
                            }

                            $msg.remove();
                            $this.reInitToScroll(scrollPl,'relative');
                            if(typeof call=='function')call();
                            //$msg.removeClass('animate_sent');
                            if(!$listMsg.find('.animate_sent')[0]){
                                $listMsg.addClass('animate');
                            }
                        }})
    }

    this.deleteWritingUsers = function(deleteWritingUsers){
        debugLog('IM deleteWritingUsers', deleteWritingUsers);
        for (var uid in deleteWritingUsers) {
            var $listMsg=$('#pp_message_list_message_'+uid),
                $wr=$listMsg.find('.pp_message_msg_item.writing');
            if($wr[0]){
                if(uid!=$this.userTo){
                    $wr.remove();
                } else {
                    $this.deleteMsg($wr, uid);
                }
            }
        }
    }

    this.initTooltipData = function($context){
        $context=$context||'#pp_message_list_message';
        $('[data-tooltip-data="true"]:not(.init_data)').each(function(){
            var $el=$(this).addClass('init_data');
            var placement='right';
            if($el.closest('.replies')[0]){
                placement='left';
            }
            if (isMobileSite) {
                /*$el.tooltip({trigger:'manual',placement:'top'})//,container:$el.closest('.viewport')
                .click(function(){
                    $el.tooltip('show');
                    clearTimeout($el.data('action'));
                    $el.data('action',setTimeout(function(){
                        $el.tooltip('hide');
                    },1000))
                })*/
            } else {
                $el.tooltip({viewport:'',container:'#pp_messages_chat_content',placement:placement,delay:{'show':500}})
                .click(function(){
                    $el.tooltip('hide')
                })
            }
        })
    }

    /* Height */
    this.getDHeight = function(){
        var hw=$win[0].innerHeight;
        return hw - 50 - .03*hw;
    }

    this.getHeightIm = function(){
        var height=$.cookie('edge_height_im')*1,
            hd=$this.getDHeight();
        if (height < 300 || height > hd) {
            height = hd;
        }
        return height;
    }

    this.setHeightIm = function(height){
        if(height===0)return;
        $this.$ppChat.css({height:height,maxHeight:height});
    }

    this.endResizeIm = function(e){
        e&&e.preventDefault();
        $doc.off('mouseup touchend', $this.endResizeIm)
            .off('mousemove touchmove', $this.resizingIm);
        $.cookie('edge_height_im', $this.$ppChat.height());
    }

    this.resizingIm = function(e){
        if(!$this.$ppChat[0] || !$this.isVisible())return;
        var mouse={},height;
            mouse.y = (e.clientY || e.pageY || e.originalEvent.touches[0].clientY) + $win.scrollTop();

        height = $this.eventState.container_height - $this.eventState.mouse_y + mouse.y;
        var hd=$this.getDHeight();
        if (height > 300 && height < hd) {
            $this.setHeightIm(height);
            $this.imH=height;
            $this.prepareListMsg($this.ppMsgH,$this.ppMsgH,'relative');
        }
    }
    /* Height */

    /* Width */
    this.getDWidth = function(){
        var ww=$win[0].innerWidth;
        return ww - 20;
    }

    this.getWidthIm = function(){
        var width=$.cookie('edge_width_im')*1,
            wd=$this.getDWidth();
        if (width < 768 || width > wd) {
            width = wd;
        }
        return width;
    }

    this.setWidthIm = function(width){
        if(width===0)return;
        $this.$ppChat.css({width:width,maxWidth:width});
    }

    this.resizingRightIm = function(e){
        if(!$this.$ppChat[0] || !$this.isVisible())return;

        var mouse={},width;
            mouse.x = (e.clientX || e.pageX || e.originalEvent.touches[0].clientX) + $win.scrollLeft();

        width = $this.eventState.container_width - $this.eventState.mouse_x + mouse.x;

        var wd=$this.getDWidth();
        if (width > 768 && width < wd) {
            $this.setWidthIm(width);
            $this.imW=width;
            $this.prepareImageResize()
        }
    }

    this.endResizeRightIm = function(e){
        e&&e.preventDefault();
        $doc.off('mouseup touchend', $this.endResizeRightIm)
            .off('mousemove touchmove', $this.resizingRightIm);
        $.cookie('edge_width_im', $this.$ppChat.width());
    }
    /* Width */

    /* Resize */
    this.saveEventState = function(e){
        if(!$this.$ppChat[0])return;
        $this.eventState.container_height = $this.$ppChat.height();
        $this.eventState.container_width = $this.$ppChat.width();
        $this.eventState.mouse_x = (e.clientX || e.pageX || e.originalEvent.touches[0].clientX) + $win.scrollLeft();
        $this.eventState.mouse_y = (e.clientY || e.pageY || e.originalEvent.touches[0].clientY) + $win.scrollTop();
        if(typeof e.originalEvent.touches !== 'undefined'){
            $this.eventState.touches = [];
            $.each(e.originalEvent.touches, function(i, ob){
                $this.eventState.touches[i] = {};
                $this.eventState.touches[i].clientX = 0+ob.clientX;
                $this.eventState.touches[i].clientY = 0+ob.clientY;
            });
        }
        $this.eventState.evnt = e;
    };
    /* Resize */

    this.removeMsgFromChat = function(mid, fromMe){
        fromMe=fromMe||false;
        $this.closeMsgMenu();
		var $msg=$('#pp_message_msg_'+mid),
			$msgPrev=$msg.prev('.pp_message_msg_item');
        $this.deleteMsg($msg, $this.getKeyUid($this.userTo, $this.groupId), function(){
        })
		if($msgPrev[0]){
			$this.updateMsgPreview($msgPrev);
		} else {
			var kUid=$this.getKeyUid($this.userTo, $this.groupId);
            $this.userCache[kUid]['preview_msg'].aSlideUp({dur:250,complete:function(){$(this).html('')}});
		}

        $.post(url_ajax+'?cmd=delete_messages',{mid:mid,from_me:fromMe?1:0},function(res){
            var data=checkDataAjax(res);
            if(data!==false){

            }
        })
    }

    this.moreMsgMenuVisible = function(el){
        var $el=$(el),
            $menu=$el.next('.more_menu_collapse');
        if ($menu.is(':hidden')) {
            var $viewport=$el.closest('.viewport'),
                //$lastMsg=$('.pp_message_msg_item:last',$viewport).find('.more_msg_menu'),
                my='', at='', is=true;
            if (false && $lastMsg[0]==$menu[0] && !inViewport($menu,{container:$viewport[0],threshold:72})) {
                my='right bottom-19';
                at='right-5 bottom';
            } else if($menu.closest('.pp_message_msg_item.sent')[0]){
                my='left top';
                at='right-15 bottom';
            } else {
                my='right top';
                at='left+15 bottom';
            }

            $menu.stop().slideDown({
            duration:150,
            step:function(){
                if(is){
                    is=false;
                    $menu.position({my:my,at:at,of:$el,within:$viewport,collision:'flip'});
                }
            }})
        } else {
            $menu.stop().slideUp(200);
        }
    }

    this.closeMsgMenu = function($notEl){
        $notEl=$notEl||[];
        $('.more_msg_menu:visible', $this.$ppContent).not($notEl).stop().slideUp(200);
    }

    this.checkExistenceMessages = function(deleteMsgs){
        deleteMsgs = jQuery.parseJSON(deleteMsgs);
        if(!deleteMsgs)return;
        var sel='';
        for (var id in deleteMsgs) {
            if(sel){
              sel +=', #pp_message_msg_'+id;
            } else {
              sel +='#pp_message_msg_'+id;
            }
        }
        if (sel) {
            var $listMsg=$(sel);
            if ($listMsg[0]) {
                var toUserId, msgUserId, groupId, j=0, mid;
                (function fu(){
                    var $item=$listMsg.eq(j);
                    if(!$item[0]){
                        return;
                    }
                    toUserId=$item.data('toUserId');
                    groupId=$item.data('groupId');
					mid=$item.data('id')+'';
					if(mid.indexOf('system')!==-1){
						j++; fu();
					} else {
						if (toUserId==$this.userTo && $this.groupId==groupId) {
							$this.deleteMsg($item, $this.getKeyUid(toUserId, groupId), function(){
								j++; fu();
							})
						} else {
							$item.remove();
							j++; fu();
						}
					}
                })()
            }
        }

        /*for (var id in deleteMsgs) {
            var $msg=$('#pp_message_msg_'+id, $this.$ppContent),
                uid=deleteMsgs[id];
            if($msg[0]){
                if(uid==$this.userTo){

                    $this.deleteMsg($('#pp_message_msg_'+mid), $this.userTo, function(){
                    })
                } else {
                    $msg.remove();
                }
            }
        }*/
    }

    this.getMsgCurrentIm = function(){
        var getMsgFromIm={};
        if($this.isVisible()){
            var $imVisible=$('.pp_message_user_list_message:visible',$this.$ppContent);
            if($imVisible[0]){
                var uid=$imVisible.data('uid'),
                    kUid=uid+'_'+$imVisible.data('groupId');
                if($this.userCache[kUid]['list_msg']&&$this.userCache[kUid]['list_msg'][0]){
                    $this.userCache[kUid]['list_msg'].find('.pp_message_msg_item').not('.writing').each(function(){
                        var id=$(this).data('id'), idS=id+'';
						if (idS.indexOf('system')==-1) {
							getMsgFromIm[id]=uid;
						} else {
						}
                    })
                }
            }
        }
        return JSON.stringify(getMsgFromIm);
    }

    this.getKeyUid = function(uid, groupId){
        return uid+'_'+groupId;
    }

    this.openMessagesFromAppNotifications = function(uid, groupUserId, groupId){
        if(!checkLoginStatus())return false;
        groupUserId=groupUserId||0;
        groupId=groupId||0;

        if($this.isOpened()){
            var kUid=$this.getKeyUid(uid, groupId);
            if ($('#pp_message_user_'+kUid)[0]) {
                $this.openIm(uid, groupId);
            } else {
                $this.$pp.one('hidden.bs.modal',function(){
                    checkOpenModal();
                    setZeroTimeout(function(){
                        $this.show(uid,[],groupUserId,groupId);
                    })
                })
                $this.closePopup();
            }
        } else {
            $this.show(uid,[],groupUserId,groupId);
        }


        return true;
    }

    /* Upload image */
    this.checkPaydUploadImage = function() {
        if(!userAllowedFeature['upload_image_chat_paid']){
            confirmCustom(l('upload_im_need_upgrade'), function(){
                redirectUrl(urlPagesSite.upgrade)
            },l('alert_html_alert'));
            return true;
        }
        return false;
    }

    this.changeUploadImage = function($file) {
        if($this.checkPaydUploadImage())return false;
        $file.parent('form').find('input[type=submit]').click();
    }

    this.clickUpload = function($file) {
        $file.next('input[type=reset]').click();
    }

    this.processUploadImage=false;
    this.isImageLoaded=0;
    this.clearUploadImage = function(reset,checkPayd,e){
        if (checkPayd||false) {
            if($this.checkPaydUploadImage())return;
        }
        var $bl=$this.addImageIm;
        if (reset||false) {
            if ($bl.is('.disabled')) {
                return;
            }
        }
		if (e) {
			var $targ=$(e.target);
			if ($targ.is('#pp_message_img_editor') || $targ.closest('#pp_message_img_editor')[0]) {
				return;
			}
		}
		$this.fileImageUrl = '';
        $bl.addClass('disabled');
		$bl.removeClass('disable_editor_image');
        $bl.find('.fa-camera').attr('title', l('upload_image'));
		$this.$ppMsg.trigger('autosize');

        $this.processUploadImage=false;
        $this.isImageLoaded=0;
        $this.addImageIm.removeClass('to_hide');
        $this.addImageImLoader.removeChildrenLoader();
        if(userAllowedFeature['upload_image_chat_paid']){
            $this.clickUpload($bl.find('.pp_message_upload_img_input_file'));
        }
    }

    this.initCheckPaydUploadImage = function(){
        if(userAllowedFeature['upload_image_chat_paid']){
            if ($this.addImageIm.is('.no_available')) {
                $this.addImageIm.removeClass('no_available');
            }

            return false;
        } else if(!$this.addImageIm.is('.no_available')) {
            $this.addImageIm.addClass('no_available');
            return true;
        }
    }

    this.initAddImage = function(){
		$this.fileImageUrl = '';
        $this.addImageIm=$('#pp_message_upload_img');
        $this.addImageImLoader=$('#pp_message_upload_img_loader');

        $this.initCheckPaydUploadImage();

        $('#pp_message_upload_img_frm').submit(function(e){
			$this.fileImageUrl = '';
            var indx=+new Date,
                frm = $(this), file = frm.find('input[type=file]'),
                fileName = file.attr('name'), formData = new FormData(),
                error = '';
                $.each(file[0].files, function(i, file){
                    if ("image/jpeg,image/png,image/gif".indexOf(file.type) === -1) {
                        error = l('accept_file_types');
                        return false;
                    }else if (file.size > clProfilePhoto.maxphotoFileSize) {
                        error = clProfilePhoto.maxphotoFileSizeLimit;
                        return false;
                    }
                    formData.append(fileName, file);
                });

                if (error) {
                    alertCustom(error, l('alert_html_alert'));
                    return false;
                }
                $this.processUploadImage=true;
                $this.addImageImLoader.addChildrenLoader();
                $this.addImageIm.addClass('to_hide')
				$this.addImageIm.find('.fa-camera').attr('title', '');

                var xhr = new XMLHttpRequest();
                xhr.open("POST", url_ajax+'?cmd=upload_image_im&input_name='+fileName+'&ind='+indx);
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4) {
                        if(xhr.status == 200) {
                            var data = xhr.responseText;
                            data = checkDataAjax(data);
                            if (data) {
                                if (data.status == 'error') {
                                    alertCustom(data.error, l('alert_html_alert'));
                                } else {
									$this.fileImageUrl = data.file;
                                    $this.isImageLoaded=indx;

									$this.addImageIm[data.image_editor_enabled?'removeClass':'addClass']('disable_editor_image');
                                    $this.addImageIm.removeClass('disabled');
                                    $this.addImageIm.find('.fa-camera').attr('title', l('upload_image_delete'));

									$this.$ppMsg.trigger('autosize');
                                }
                            }
                            $this.processUploadImage = false;
                            $this.addImageIm.removeClass('to_hide');
                            $this.addImageImLoader.removeChildrenLoader();

                            //$this.send();
                        }
                    }
                };
                xhr.send(formData);
                return false;
        });
    }

	$this.fileImageUrl = '';
	this.openEditorImage = function(){
		if (!$this.fileImageUrl) {
			return;
		}
		imageEditorInfo = {
			id: 0,
			uid: $this.guid,
			preview: '',
			img: [],
			type: 'im_image',
			info: {},
			btn: $('#pp_message_img_editor')
		}
		$ppImageEditor.open($this.fileImageUrl);
	}

	this.initBtnImageEditor = function(){
		var $btn=$('#pp_message_img_editor'),
		w=$btn.find('span.btn_wrap')[0].offsetWidth;
		$btn.css('width', w);
	}
    /* Upload image */

    /* Popup Image */
    $this.$ppShowImage=[];
    $this.$ppShowImageClone;
    this.closePpImageBack = function(){
        if(!$this.isOpenImage)return;
        if(!backStateHistory()){
            $this.closePpImage();
        }
    }

    this.closePpImage = function(){
        $this.$ppShowImage[0] && $this.$ppShowImage.modal('hide');
    }

    this.initPpImage = function(){
        if($this.$ppShowImage[0])return;
        $this.$ppShowImageClone=$jq('#pp_im_image').clone().html();
        $this.$ppShowImage=$jq('#pp_im_image');
    }

    this.isOpenImage=false;
    this.showPopupImage = function(src, $imgOrig){
        debugLog('IM showPopupImage', src);
		if($this.isOpenImage)return;

        $this.isOpenImage=true;
        $this.$ppShowImage.empty().html($this.$ppShowImageClone);

        var $img=$('<img src="' + src + '">').addClass('fade_to_1_4 fade_to_0_4')
            .one('load',function(){
                $('.css_loader', $this.$ppShowOnePost).oneTransEnd(function(){
                    $(this).remove();
                }).addClass('hidden');
                $(this).removeClass('fade_to_0_4');
            });

        $('.photo_one_cont', $this.$ppShowImage).append($img);

        $('.pp_im_image_time_ago', $this.$ppShowImage).text($imgOrig.data('timeAgo'));
        $('.pp_im_image_date', $this.$ppShowImage).text($imgOrig.data('date'));

        $('.pp_im_image_user_name', $this.$ppShowImage)
            .attr('href', $imgOrig.data('userUrl'))
            .text($imgOrig.data('userName'));
        $('.pp_im_image_user_photo_link', $this.$ppShowImage).css('background-image', 'url('+urlFiles+$imgOrig.data('userPhoto')+')')
            .attr('href', $imgOrig.data('userUrl'));

        var isLink=isSiteOptionActive('gallery_show_download_original', 'edge_gallery_settings')
        if (isLink) {
            var id= +new Date, sel='pp_im_image_more_options_'+id;
            $('.pp_im_image_more_menu > .upload_menu_link', $this.$ppShowImage).attr('data-target','#'+sel);
            $('.pp_im_image_more_options', $this.$ppShowImage).attr('id', sel);

            $('.pp_im_image_direct_link', $this.$ppShowImage).attr('href', src);
        } else {
            $('.pp_im_image_more_menu', $this.$ppShowImage).remove();
        }

        setPushStateHistory('im_gallery');
        $this.$ppShowImage.one('hidden.bs.modal',function(){
            checkOpenModal();
        }).one('hide.bs.modal',function(){
            $this.isOpenImage=false;
            $jq('html, body').removeClass('overh');
            $this.$ppShowImage.oneTransEndM(function(){
                $this.$ppShowImage.removeClass('to_show').empty();
                $jq('body').removeClass('gallery_im_open');
            })
        }).one('shown.bs.modal',function(){
        }).one('show.bs.modal',function(){
            $this.$ppShowImage.addClass('to_show');
            $jq('body').addClass('gallery_im_open');
            $jq('html, body').addClass('overh');
        }).modal('show');

	}
    /* Popup Image */

    this.initMessages = function(){
        $this.$pp            = $jq('#pp_messages');
        $this.$ppChat        = $jq('#pp_messages_chat');
        $this.$ppChatContent = $jq('#pp_messages_chat_content');
        $this.$ppChatFoot    = $jq('#pp_messages_chat_foot');
        $this.$ppChatRightResize  = $jq('#pp_messages_chat_right_resize');
        $this.$ppSidepanel   = $jq('#pp_messages_sidepanel');
        $this.$ppContent     = $jq('#pp_messages_content');
        $this.$ppMsgList     = $jq('#pp_message_list_message');
        $this.$ppNewMsgLink  = $('.new_message_link');

        $jq('body').on('touchstart mousedown', function(e){
            var $targ=$(e.target);
            if($targ.is('.chat_wrap') || $targ.is('.navbar-default') || $targ.is('.navbar-header')){
                $this.closePopup();
            }
        }).on('click', function(e){
            var $targ=$(e.target);
            if($targ.is('.chat')||$targ.closest('.chat')[0]){
				if (!$targ.is('.emoji_bl')
					&& !$targ.closest('.emoji_bl')[0]
					 && !$targ.is('.pp_message_smile_btn')
					 && !$targ.closest('.pp_message_smile_btn')[0]
					 && !$targ.is('.pp_messages_msg')
					 && !$targ.closest('.pp_messages_msg')[0]) {
					 smileBlockHide($this.$ppSmileBtn)
				}

				if (!$targ.is('.stickers_bl')
					&& !$targ.closest('.stickers_bl')[0]
					 && !$targ.is('.pp_message_sticker_btn')
					 && !$targ.closest('.pp_message_sticker_btn')[0]) {
					 stickerBlockRemove($('#pp_message_sticker_btn'));
				}

                if (!$targ.is('.more')&&!$targ.closest('.more')[0]) {
                    $this.closeChatMenu();
                }
                //if (!$targ.is('.more_msg_menu')&&!$targ.closest('.more_msg_menu')[0]) {
                    //$this.closeMsgMenu();
                //}
                if(!$targ.is('.message_extension')&&!$targ.closest('.message_extension')[0]){
                    $this.closeMsgMenu();
                }
                return;
            } else if($targ.is('.pp_gallery_overflow') || $targ.is('.navbar-default') || $targ.is('.navbar-header')){
                $this.closePpImageBack();
            }
        }).on('click', '.message_more_menu .ellipsis', function(e){
            $this.closeMsgMenu($(this).next('.more_menu_collapse'));
            $this.moreMsgMenuVisible(this);
        }).on('click', '.lightbox_pics_im', function(e){
            $this.showPopupImage(this.href, $(this).find('img'));
            return false;
        }).on('click', '.menu_messages_edge', function(e){
            clProfile.sendMessages($(this));
            return false;
        })



        //pp_message_user_list_message
        $('body').on('mouseover', '.pp_message_user_list_message', function(e){
            var $el=$(this),
                uid=$this.getKeyUid($el.data('uid'), $el.data('groupId'));
            if($this.userCache[uid]
               &&$this.userCache[uid]['list_msg'][0]
               &&($('.to_new',$this.userCache[uid]['list_msg'])[0]
                    ||$this.userCache[uid]['preview_msg'].is('.to_new'))){
                $this.removeNewMsg(uid);
            }
        })

        $this.$ppChatFoot.on('touchstart mousedown', function(e){
            if($this.$ppChatFoot.is(':hidden'))return;
            e.preventDefault();
            e.stopPropagation();
            $this.saveEventState(e);
            $doc.on('mousemove touchmove', $this.resizingIm)
                .on('mouseup touchend', $this.endResizeIm);
        })


        $this.$ppChatRightResize.on('touchstart mousedown', function(e){
            if($this.$ppChatRightResize.is(':hidden'))return;
            e.preventDefault();
            e.stopPropagation();
            $this.saveEventState(e);
            $doc.on('mousemove touchmove', $this.resizingRightIm)
                .on('mouseup touchend', $this.endResizeRightIm);
        })


        /*$win.on('resize',function(){
            if($this.isVisible()&&$this.userTo){
                $('#pp_message_list_message, #pp_message_list_message .scrollbarY, #pp_message_list_message .scrollbarY .track').removeAttr('style');
                setTimeout(function(){
                    $this.reInitToScroll($this.userCache[$this.userTo]['pl']);
                },1)
            }
        })*/
    }

	/* Record audio message */
	this.mediaRecorderDetect = false;
	this.mediaRecorderApi;
	this.mediaRecorderStream;
	this.mediaRecorderProcess=false;
	this.hideAudioRecorderControl = function(){
		$this.$ppAudioRecord.remove();
		$this.$ppMsg.removeClass('im_audio_message_enabled');
	}

	this.pushChankAudioRecorder = function(e){

		var $microphone=$this.$ppAudioRecord.find('.im_audio_message_recorder_icon_bl');
		if ($this.$ppAudioRecord.data('stop_process')) {

			$this.mediaRecorderProcess=false;
			removeChildrenLoader($microphone);
			$this.$ppAudioRecord.removeClass('disabled');
			$microphone.attr('title', l('record_audio_message'));

			$this.$ppAudioRecord.data('stop_process', 0);
			return;
		}

		var mediaRecorderChunks = e.data,
			formData = new FormData(),
			url=url_ajax+'?cmd=save_im_audio_message';

		formData.append('im_msg_audio_blob', mediaRecorderChunks);

		var xhr = new XMLHttpRequest();
        xhr.open("POST", url);
        xhr.onreadystatechange = function() {
			if (xhr.readyState == 4) {
				if(xhr.status == 200) {
					var data=xhr.responseText, isErrorResponse = true,
						error=l('something_went_wrong_please_try_later');

					$this.mediaRecorderProcess=false;
					removeChildrenLoader($microphone);
					$this.$ppAudioRecord.removeClass('disabled');

                    data=checkDataAjax(data);
                    if(data) {
                        if(data.result == 'success' && data.id) {
							$this.$ppMsg.data('im-audio-message-id', data.id);

							var v=trim($this.$ppMsg.text());
							if(v==$this.$ppMsg.data('placeholder')&&!$this.$ppMsg.find('.emoji')[0]){
								$this.$ppMsg.text('');
							}

							if ($this.$ppAudioPlayCur[0]) {
								$this.$ppAudioPlayCur.remove();
							}
							$this.$ppAudioPlayCur=$this.$ppAudioPlay.clone()
								.show()
								.attr({'contenteditable':false, id:'im_audio_message_send_play'});

							$this.$ppAudioPlayCur.find('.fa-times').click(function(){
								$this.runAudioRecorder()
							})
							$this.$ppAudioPlayBtn=$this.$ppAudioPlayCur
													   .find('.im_audio_message_loader')
													   .data('audio-message-file', data.url);

							$this.$ppMsg.prepend($this.$ppAudioPlayCur.delay(20).toggleClass('im_audio_message_delete',0))
								 .trigger('autosize');

							$this.$ppAudioRecord.addClass('im_audio_message_delete');
							$microphone.attr('title', l('record_audio_message_delete'));
                            isErrorResponse=false;
						} else if (data.error) {
							error=data.error;
						}
                    }

					if(isErrorResponse) {
						$microphone.attr('title', l('record_audio_message'));
						alertCustom(error);
					}
				}
			}
        };
        xhr.send(formData);
	}

	this.stopTrakAudioRecorder = function(){
		//$this.mediaRecorderStream.getTracks().forEach(function(track) {
			//track.stop()
		//})

		$this.mediaRecorderStream && $this.mediaRecorderStream.getAudioTracks()[0].stop();
	}

	this.audioMessageInputAutosizeDelay = function(){
		setTimeout(function(){
			$this.$ppMsg.trigger('autosize');
		},200)
	}

	this.imAudioMessageDelete = function(id){
		var $microphone=$this.$ppAudioRecord.find('.im_audio_message_recorder_icon_bl');
		$this.$ppMsg.data('im-audio-message-id', 0);
		$this.$ppAudioRecord.addClass('disabled').removeClass('im_audio_message_delete');
		$this.$ppAudioPlayCur.oneTransEnd(function(){
			$this.audioMessageInputAutosizeDelay()
		}).removeClass('im_audio_message_delete');

		$this.mediaRecorderProcess=false;

		if ($this.$ppAudioRecord.data('stop_process')) {

			$this.$ppAudioPlayBtn.data('audio-message-file', '');
			$this.$ppAudioPlayCur.remove();
			$microphone.attr('title', l('record_audio_message'));

			$this.$ppAudioRecord.removeClass('disabled').data('stop_process', 0);
			return;
		}

		addChildrenLoader($microphone);

		$.post('ajax.php', {cmd:'im_audio_message_delete', id:id}, function(res){
			var data=checkDataAjax(res);
            if(data!==false){
				setTimeout(function(){
					removeChildrenLoader($microphone);
					$this.$ppAudioPlayBtn.data('audio-message-file', '');
					$this.$ppAudioPlayCur.remove();
					$microphone.attr('title', l('record_audio_message'));
					$this.audioMessageInputAutosizeDelay();
				},200)
			} else {
				removeChildrenLoader($microphone);
				$this.$ppMsg.data('im-audio-message-id', id);
				$this.$ppAudioRecord.addClass('im_audio_message_delete');
				$this.$ppAudioPlayCur.oneTransEnd(function(){
					$this.audioMessageInputAutosizeDelay()
				}).addClass('im_audio_message_delete');
				alertCustom(l('something_went_wrong_please_try_later'));
			}
			$this.$ppAudioRecord.removeClass('disabled');
		})
	}

	this.runAudioRecorder = function(){
		if ($this.$ppAudioRecord.is('.disabled')) {
			return;
		}

		var $microphone=$this.$ppAudioRecord.find('.im_audio_message_recorder_icon_bl');
//$this.$ppAudioRecord.addClass('record');
//return;

		$this.mediaRecorderProcess=false;
		if ($this.mediaRecorderDetect === false) {
			var ssl=window.location.protocol == 'https:' || window.location.host == 'localhost';
			if(!ssl){
				alertCustom(l('your_browser_needs_ssl_certificate_to_run_audio_record'));
				$this.hideAudioRecorderControl();
				return false;
			}
		}
		$this.mediaRecorderDetect = true;

		var fnStartRecord=function(){
			if ($this.$ppAudioRecord.is('.im_audio_message_delete')) {//Delete
				if ($this.$ppAudioRecord.data('stop_process')) {
					$this.imAudioMessageDelete($this.$ppMsg.data('im-audio-message-id'))
				} else {
					confirmCustom(l('are_you_sure'), function(){
						$this.imAudioMessageDelete($this.$ppMsg.data('im-audio-message-id'))
					}, l('confirm_delete_audio_message'));
				}
			}else if ($this.$ppAudioRecord.is('.record')) {//Upload

				$this.mediaRecorderProcess=true;

				$this.$ppAudioRecord.removeClass('record')
						   .addClass('disabled');
				$microphone.attr('title', l('record_audio_message_process'));

				addChildrenLoader($microphone);

				$this.stopTrakAudioRecorder();

				$this.mediaRecorderApi.stop();

				stopAudioVisualizer('im_audio_message_visualizer');

			} else {//Record
				createAudioVisualizerElement('im_audio_message_visualizer')

				var optionsDevice = {
					//audio: { sampleSize: 16, channelCount: 1, sampleRate: 16000 } ,
					audio: true,
					video: false
				};
				navigator.mediaDevices.getUserMedia(optionsDevice).then(function(stream){
					$this.mediaRecorderStream = stream;

					initAudioVisualizer('im_audio_message_visualizer', stream);

					/*var types = ['audio/webm', 'audio/webm\;codecs=opus'];
					for (var i in types) {
						console.log(types[i] + ' - ' + (MediaRecorder.isTypeSupported(types[i]) ? 'Maybe' : 'No'));
					}*/

					optionsDevice = {
						audioBitsPerSecond: 128000,
						//bitsPerSecond:
						//mimeType : 'audio/webm'
					}
					$this.mediaRecorderApi = new MediaRecorder(stream, optionsDevice);
					$this.mediaRecorderApi.addEventListener('dataavailable',$this.pushChankAudioRecorder);
					$this.mediaRecorderApi.start();

					$this.$ppAudioRecord.oneTransEnd(function(){
						$this.$ppMsg.trigger('autosize');
					}).addClass('record');
					$microphone.attr('title', l('record_audio_message_stop'));
				}).catch(function(error) {
					console.log('Error audio record', error);
					$this.stopTrakAudioRecorder();
					alertCustom(l('error_recording_audio_message'));
				})
			}
		}
		if (isFx) {
			fnStartRecord();
		} else {
			navigator.permissions.query({name:'microphone'}).then(function(result) {
				if (result.state == 'granted') {
					fnStartRecord();
				} else if (result.state == 'prompt') {
					fnStartRecord();
				} else if (result.state == 'denied') {
					alertCustom(l('microphone_is_not_available'));
					$this.hideAudioRecorderControl();
				}
				result.onchange = function(e) {
					console.log('Microphone permissions', this.state);
				}
			})
		}
		/* Check Permissions */
	}
	/* Record audio message */

    $(function(){
        $win.on('resize', function(){setTimeout($this.prepareImageResize,1)});
        /*$win.on(evWndRes,function(){
            $this.prepareImageResize();
            //setTimeout($this.prepareImageResize,evWndResTime)
        })*/
    })

    return this;
}

function showImageIm(img) {

    var $img=$(img).addClass('to_show');
     return;

    messages.initLightbox($img.closest('a'));
    if(isOneChat){
        //messages.reInitToScrollPanelChat('relative');
    }else{
        //$img.closest('.scrollbarY').data('plugin_tinyscrollbar').update('relative');
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit