Система переписок 1.0.0

Добавляет систему переписок на ваш ресурс.

  1. Exile
    Совместимость:
    не проверялся на совместимость
    Изменения в БД:
    требуются
    Автор:
    frost444
    Общественное достояние:
    да
    Описание: добавляет систему переписок на ваш ресурс.

    Возможности:
    • Обновление личных сообщений на AJAX
    • Предпросмотр сообщений во всплывающем блоке
    • Редактирование на AJAX
    • Поиск пользователей при создании переписки на AJAX
    Инструкция по установке:
    PHP:
    Автор модаfrost444
    Отдельное спасибо пользователю
    zver5001

    //-----[Обновления]-----\\

    |--(16.01.2013)
       
    1измененный кодfunctions.phplang_main.phppage_header.tpl
       2
    изменен код в прилагаемых файлахpm.phpfunctions_pm.phpnew_pm.php(ajax), pm.php(ajax), QuickSearch.php(ajax), pm.tplslide_menu.css
       3
    добавлены файлы изображенийpanel_icon/p-down.png p-up.png
       info
    : (1Улучшены библиотеки JQuery в TP соответственно идут в комплекте библиотекиВсе файлы заменить.
             (
    2Добавлен поиск по тегам среди юзеров.
             (
    3Прочая оптимизация и улучшения.

    |--(
    17.01.2013)
       
    1измененный кодfunctions.phplang_main.phpadmin_board.tpladmin_board.php
       2
    изменен код в прилагаемых файлахpm.phpfunctions_pm.php
       3
    добавлены файлыcron/jobs/olp_pm_delete.php
       4
    добавлены 3 новых запроса в БД
       info
    : (1Добавлена крон задачапо очистке старых переписок.
             (
    2Добавлено склеивание сообщенийво избежении тайм флуда.
      
    \\-----[
    Обновления]-----//

    ####[ВЫПОЛНИТЬ]-----SQL

    CREATE TABLE IF NOT EXISTS `bb_pm` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    subvarchar(150NOT NULL,
      `
    timeint(11NOT NULL,
      `
    uidint(11NOT NULL,
      `
    firstpostint(11NOT NULL,
      `
    majorint(11NOT NULL,
      `
    minorint(11NOT NULL,
      `
    pm_locktinyint(4NOT NULL DEFAULT '0',
      `
    lastpostint(11NOT NULL,
      `
    lp_userint(11)  NOT NULL,
      `
    lastimeint(11NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

    CREATE TABLE IF NOT EXISTS `bb_pm_text` (
      `
    tx_idint(11NOT NULL AUTO_INCREMENT,
      `
    pm_idint(11NOT NULL,
      `
    us_idint(11NOT NULL,
      `
    texttext NOT NULL,
      `
    timebigint(11NOT NULL,
      
    PRIMARY KEY (`tx_id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

    CREATE TABLE IF NOT EXISTS `bb_pm_texthtml` (
      `
    tx_idint(11unsigned NOT NULL DEFAULT '0',
      `
    us_idint(11NOT NULL,
      `
    pm_htmltext NOT NULL,
      
    PRIMARY KEY (`tx_id`),
      
    FULLTEXT KEY `pm_html` (`pm_html`)
    ENGINE=MyISAM DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS `bb_pm_users` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    pidint(11NOT NULL,
      `
    puidint(11NOT NULL,
      `
    pm_typetinyint(4NOT NULL DEFAULT '0',
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

    INSERT INTO bb_config (config_nameconfig_valueVALUES ('join_int_pm''3');

    INSERT INTO bb_config (config_nameconfig_valueVALUES ('max_pm_time''300');

    INSERT INTO `bb_cron` (`cron_active`, `cron_title`, `cron_script`, `schedule`, `run_day`, `run_time`, `run_order`, `last_run`, `next_run`, `run_interval`, `log_enabled`, `log_file`, `log_sql_queries`, `disable_board`, `run_counter`) VALUES
    (1'Удаление старых переписок''olp_pm_delete.php''daily''''04:00:00'255'0000-00-00 00:00:00''0000-00-00 00:00:00''00:00:00'0''000);

    ####[КОНЕЦ]-----SQL

    ####[ОТКРЫТЬ]-----.htaccess

    ----[добавить]-----

    RewriteEngine On
    RewriteRule 
    ^pmRss.xmlpm_rss.php [L]

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----init_bb.php

    -----[найти]-----

    define('POST_USERS_URL',  'u');

    -----[
    добавить после]-----

    //PM MODE
    define('PRIVMS',                "pm.php");
    define('PRIVMS_REPLEY_URL',        'pm');
    define('PRIVMS_ID',                'id');
    define('PRIVMS_PAGE_URL',        'start');
    define('PRIVMS_MODE_URL',        "pm.php?" .'mode=');
    define('PRIVMS_IDS',            'id=');
    define('PRIVMS_POSTS_URLS',        'pm=');
    define('PRIVMS_ADD',            'add');
    define('PRIVMS_USER',            'u=');
    define('PRIVMS_USERS',            'u');
    define('PRIVMS_LIST',            'list');
    define('PRIVMS_DEL_REP',        'delete_reply');
    define('PRIVMS_DEL_PM',            'delete_pm');
    define('PRIVMS_VIEW',            'view');
    define('PRIVMS_SMILE',            'smilies');
    define('PRIVMS_RSS',            "pmRss.xml?");
    define('PRIVMS_RSS_PAS',        'login_password=');
    define('PRIVMS_RSS_USR',        'login_username=');
    //PM MODE

    -----[найти]-----

    define('BB_PRIVMSGS_TEXT',        'bb_privmsgs_text');

    -----[
    добавить после]-----

    //PM MODE
    define('BB_PM',                   'bb_pm');
    define('BB_PM_TEXT',              'bb_pm_text');
    define('BB_PM_TEXTHTML',          'bb_pm_texthtml');
    define('BB_PM_USERS',              'bb_pm_users');
    //PM MODE

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----lang_main.php (eng)

    -----[найти]-----

    // tor_comment
    ....
    //end torrent status mod

    -----[заменить]-----

    tor_comment
    $lang
    ['TOR_MOD_TITLE'] = 'Changing the status of distribution - %s';
    $lang['TOR_MOD_MSG'] = "Hello, %s.[br] Status [url=%s]your[/url] distribution is changed to [b]%s[/b]";

    $lang['TOR_AUTH_TITLE'] = 'Changes in the design - %s';
    $lang['TOR_AUTH_MSG'] = "Hello, %s.[br] Making my hand changed - [url=%s]%s[/url][br] Please re-check it.";
    $lang['TOR_AUTH_FIXED'] = 'Fixed';
    $lang['TOR_AUTH_SENT_COMMENT'] = ' &middot; <span class="seed bold">The information sent to the moderator. Expect.</span>';
    //end torrent status mod

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----lang_main.php (rus)

    -----[найти]-----

    // tor_comment
    ....
    //end torrent status mod

    -----[заменить]-----

    // tor_comment
    $lang['TOR_MOD_TITLE'] = 'Изменение статуса раздачи - %s';
    $lang['TOR_MOD_MSG'] = "Здравствуйте, %s.[br] Статус [url=%s]вашей[/url] раздачи изменен на [b]%s[/b]";

    $lang['TOR_AUTH_TITLE'] = 'Изменение в оформлении - %s';
    $lang['TOR_AUTH_MSG'] = "Здравствуйте, %s.[br] Оформление моей раздачи изменено - [url=%s]%s[/url][br] Просьба повторно её проверить.";
    $lang['TOR_AUTH_FIXED'] = 'Исправил';
    $lang['TOR_AUTH_SENT_COMMENT'] = ' &middot; <span class="seed bold">Информация отправлена модератору. Ожидайте.</span>';
    //end torrent status mod

    -----[в самый конец добавить]-----

    //PM MODE
    $lang['PM_PM'] = 'Переписки';
    $lang['PM_POST_NEW'] = 'Начать новую переписку';
    $lang['PM_HAVE_NOT_RECENT'] = 'У Вас нет последних переписок.';
    $lang['PM_OPT'] = 'Настройки переписки';
    $lang['PM_PM_TO'] = 'Переписка: ';
    $lang['PM_NOT_DELETE_REP'] = 'Вы не можете удалить данное сообщение.';
    $lang['PM_NOT_DELETE_PM'] = 'Вы не можете удалить дую переписку';
    $lang['PM_TITLE_SMALL'] = 'Слишком короткий заголовок. Допустимо ';
    $lang['PM_TITLE_LONG'] = 'Слишком длинный заголовок. Допустимо ';
    $lang['PM_MESS_SMALL'] = 'Слишком короткое сообщение. Допустимо ';
    $lang['PM_MESS_LONG'] = 'Слишком длинное сообщение. Допустимо ';
    $lang['PM_MEMBER_SMALL'] = 'Участников должно быть больше.';
    $lang['PM_MEMBER_LONG'] = 'Превышем лимит участников.';
    $lang['PM_YOU_ALREADY_TO_PM'] = 'Вы уже состоите в переписке.';
    $lang['PM_THIS_USER_CAN_NOT_ADDED_TO_PM'] = 'Данных юзеров нельзя добавлять в переписку: ';
    $lang['PM_CANNOT_DELETE_REP'] = 'Вы не можете удалить это сообщение.';
    $lang['PM_CANNOT_DELETE_PM'] = 'Вы не можете удалить эту переписку.';
    $lang['PM_NOT_EXIST'] = 'Переписки не существует';
    $lang['PM_CAN_NOT_VIEW'] = 'Вы не можете просматривать чужие переписки.';
    $lang['PM_USERS'] = 'Пользователи в переписке';
    $lang['PM_USER'] = 'Участники';
    $lang['PM_SEARCH_U'] = 'поиск по пользователям...';
    $lang['PM_ADD'] = 'Добавить';
    $lang['PM_NAMES_WRITE_TO'] = 'Имена участников писать через пробел.';
    $lang['PM_YOU_INVITE'] = 'Вы можете пригласить не более %s пользовател(-я,-ей)';
    $lang['PM_ENTER_TITLE'] = 'Введите заголовок переписки.';
    $lang['PM_CREATE'] = 'Создать переписку';
    $lang['PM_NO_YOU'] = 'У вас нет переписок';
    $lang['PM_DELETED'] = 'Ваша переписка была успешно удалена';
    $lang['PM_CLOSED'] = 'Переписка закрыта';
    $lang['VIEW_ALL'] = 'Показать все...';
    $lang['CLICK_RETURN_TO_BACK'] = '%sВернуться обратно%s';
    $lang['CLICK_RETURN_TO_PM'] = '%sПереидти в переписку%s';
    $lang['PM_MAX_JOIN_TIME_HOUR'] = 'Часов';
    $lang['PM_MAX_TIME_DAY'] = 'Дней';
    $lang['PM_ADDED_LATER'] = 'Добавлено спустя ';
    $lang['PM_CONFIG'] = 'Настройка переписок';
    $lang['PM_JOIN_IN_PM'] = 'Интервал склеивания сообщений';
    $lang['PM_JOIN_IN_PM_EXPLAIN'] = 'Интервал времени по какому мод склеивает сообщения';
    $lang['PM_DELETE_IN_PM'] = 'Интервал удаления переписок';
    $lang['PM_DELETE_IN_PM_EXPLAIN'] = 'Интервал времени по какому мод удаляет старые переписки';
    //PM MODE

    //AJAX SEARCH MODE
    $lang['AJAX_SEARCH_NO_USER'] = 'Вы не ввели имя пользователя';
    $lang['AJAX_SEARCH_NULL_RESULT'] = 'Поиск не дал результатов';
    $lang['AJAX_SEARCH_NO_NAME'] = 'Вы не ввели текст для поиска';
    $lang['AJAX_SEARCH_RESULT'] = 'Результат поиска';
    //AJAX SEARCH MODE

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----ajax.php

    -----[найти]-----

    switch (
    $ajax->action)
    {

    -----[
    добавить после]-----

        case 
    'pm':
            require(
    INC_DIR .'bbcode.php');
            require(
    INC_DIR .'functions_post.php');
            require(
    INC_DIR .'functions_pm.php');
        break;

    -----[
    найти]-----

            
    'index_data'        => array('guest'),

    -----[
    добавить после]-----

            
    'new_pm'            => array('user'),
            
    'pm'                => array('user'),
            
    'QuickSearch'        => array('user'),

    -----[
    найти последнюю скобку и перед ней добавить]-----

        function 
    new_pm()
        {
            require(
    AJAX_DIR .'new_pm.php');
        }
        function 
    pm()
        {
            require(
    AJAX_DIR .'pm.php');
        }
        function 
    QuickSearch()
        {
            require(
    AJAX_DIR .'QuickSearch.php');
        }
       
    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----page_heaer.php

    -----[найти]-----

    $icon_pm $images['pm_no_new_msg'];
    $pm_info $lang['NO_NEW_PM'];
    $have_new_pm $have_unread_pm 0;

    if (
    $logged_in && empty($gen_simple_header) && !defined('IN_ADMIN'))
    {
        if (
    $userdata['user_new_privmsg'])
        {
            
    $have_new_pm $userdata['user_new_privmsg'];
            
    $icon_pm $images['pm_new_msg'];
            
    $pm_info declension($userdata['user_new_privmsg'], $lang['NEW_PMS_DECLENSION'], $lang['NEW_PMS_FORMAT']);

            if (
    $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] && defined('IN_PM'))
            {
                
    $userdata['user_last_privmsg'] = $userdata['user_lastvisit'];

                
    db_update_userdata($userdata, array(
                    
    'user_last_privmsg' => $userdata['user_lastvisit'],
                ));

                
    $have_new_pm = ($userdata['user_new_privmsg'] > 1);
            }
        }
        if (!
    $have_new_pm && $userdata['user_unread_privmsg'])
        {
            
    // synch unread pm count
            
    if (defined('IN_PM'))
            {
                
    $row DB()->fetch_row("
                    SELECT COUNT(*) AS pm_count
                    FROM "
    BB_PRIVMSGS ."
                    WHERE privmsgs_to_userid = "
    $userdata['user_id'] ."
                        AND privmsgs_type = "
    PRIVMSGS_UNREAD_MAIL ."
                    GROUP BY privmsgs_to_userid
                "
    );

                
    $real_unread_pm_count = (int) $row['pm_count'];

                if (
    $userdata['user_unread_privmsg'] != $real_unread_pm_count)
                {
                    
    $userdata['user_unread_privmsg'] = $real_unread_pm_count;

                    
    db_update_userdata($userdata, array(
                        
    'user_unread_privmsg' => $real_unread_pm_count,
                    ));
                }
            }

            
    $pm_info declension($userdata['user_unread_privmsg'], $lang['UNREAD_PMS_DECLENSION'], $lang['UNREAD_PMS_FORMAT']);
            
    $have_unread_pm true;
        }
    }
    $template->assign_vars(array(
        
    'HAVE_NEW_PM'    => $have_new_pm,
        
    'HAVE_UNREAD_PM' => $have_unread_pm,
    ));

    -----[
    заменить]-----

    $icon_pm $images['pm_no_new_msg'];
    $pm_info $lang['NO_NEW_PM'];
    $have_new_pm $have_unread_pm $pm_info_count $pm_info_class 0;

    if (
    $logged_in && empty($gen_simple_header) && !defined('IN_ADMIN'))
    {
        if (
    $userdata['user_new_privmsg'])
        {
            
    $have_new_pm $userdata['user_new_privmsg'];
            
    $icon_pm $images['pm_new_msg'];
            
    $pm_info declension($userdata['user_new_privmsg'], $lang['NEW_PMS_DECLENSION'], $lang['NEW_PMS_FORMAT']);
            
    $pm_info_count $userdata['user_new_privmsg'];
            
    $pm_info_class "New";

            if (
    $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] && defined('IN_PM'))
            {
                
    $userdata['user_last_privmsg'] = $userdata['user_lastvisit'];

                
    db_update_userdata($userdata, array(
                    
    'user_last_privmsg' => $userdata['user_lastvisit'],
                ));

                
    $have_new_pm = ($userdata['user_new_privmsg'] > 1);
            }
        }
        if (!
    $have_new_pm && $userdata['user_unread_privmsg'])
        {
            
    // synch unread pm count
            
    if (defined('IN_PM'))
            {
                
    $row DB()->fetch_row("
                    SELECT COUNT(*) AS pm_count
                    FROM "
    BB_PM_USERS ."
                    WHERE puid = "
    $userdata['user_id'] ."
                        AND pm_type = "
    PRIVMSGS_UNREAD_MAIL ."
                    GROUP BY id
                "
    );

                
    $real_unread_pm_count = (int) $row['pm_count'];

                if (
    $userdata['user_unread_privmsg'] != $real_unread_pm_count)
                {
                    
    $userdata['user_unread_privmsg'] = $real_unread_pm_count;

                    
    db_update_userdata($userdata, array(
                        
    'user_unread_privmsg' => $real_unread_pm_count,
                    ));
                }
            }

            
    $pm_info declension($userdata['user_unread_privmsg'], $lang['UNREAD_PMS_DECLENSION'], $lang['UNREAD_PMS_FORMAT']);
            
    $pm_info_count $userdata['user_unread_privmsg'];
            
    $pm_info_class "Old";
            
    $have_unread_pm true;
        }
    }
    $template->assign_vars(array(
        
    'HAVE_NEW_PM'    => $have_new_pm,
        
    'HAVE_UNREAD_PM' => $have_unread_pm,
    ));

    -----[
    найти]-----

        
    'U_READ_PM'                  => "privmsg.php?folder=inbox". (($userdata['user_newest_pm_id'] && $userdata['user_new_privmsg'] == 1) ? "&mode=read&p={$userdata['user_newest_pm_id']}''),

    -----[
    заменить]-----

        
    'U_READ_PM'                  => "pm.php?mode=list",
        
    'U_READ_PM_ADD'              => "pm.php?mode=add",
               
    -----[
    найти]-----

        
    'PM_INFO'                    => $pm_info,
       
    -----[
    ниже добавить]-----

        
    'PM_INFO_COUNT'                 => !empty($pm_info_count) ? '<span class="pm'.$pm_info_class.'" title="'.$pm_info.'">'.$pm_info_count.'</span><span class="arrow'.$pm_info_class.'"></span>' '',

    ####[СОХРАНИТЬ_ФАЙЛ]####
       
    ####[ОТКРЫТЬ]-----mysql.php

    -----[найти]-----

            if (!empty(
    $this->shutdown['post_html']))
            {
                
    $post_html_sql $this->build_array('MULTI_INSERT'$this->shutdown['post_html']);
                
    $this->query("REPLACE INTO "BB_POSTS_HTML .$post_html_sql");
            }

    -----[
    после добавить]-----

            if (!empty(
    $this->shutdown['pmhtml']))
            {
                
    $post_html_sql $this->build_array('MULTI_INSERT'$this->shutdown['pmhtml']);
                
    $this->query("REPLACE INTO "BB_PM_TEXTHTML .$post_html_sql");
            }
           
    ####[СОХРАНИТЬ_ФАЙЛ]####
           
    ####[ОТКРЫТЬ]-----functions.php

    -----[найти функцию с названием send_pm и полностью заменить на]-----

    function 
    send_pm($user_id$subject$message$poster_id false$lock_on true)
    {
        global 
    $userdata;

        include(
    INC_DIR 'functions_pm.php');
        
    $pm = new PrivateMS();
        
    $subject DB()->escape($subject);
        
    $message DB()->escape($message);

        if(
    $user_id == $userdata['user_id']) return false;
        if(!
    $poster_id)
        {
            
    $poster_id $userdata['user_id'];
        }
        if(
    $lock_on)
        {
            
    $lock '1';
        }else{
            
    $lock '0';
        }
        
    $pm->add_pm(array(
            
    'sub'        => $subject,
            
    'uid'        => $poster_id,
            
    'text'        => $message,
            
    'lastpost'    => $poster_id,
            
    'users'        => $user_id,
            
    'pm_lock'    => $lock,
        ),
    false,false);
    }

    -----[
    в самый конец добавить]-----

    function 
    undo_htmlspecialchars($input)
    {
        
    $input preg_replace("/&gt;/i"">"$input);
        
    $input preg_replace("/&lt;/i""<"$input);
        
    $input preg_replace("/&quot;/i""\""$input);
        
    $input preg_replace("/&amp;/i""&"$input);
        return 
    $input;
    }

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----session.php
    -----[найти]-----

        function 
    login ($args$mod_admin_login false)
        {
            global 
    $bb_cfg;

            
    $username = !empty($args['login_username']) ? clean_username($args['login_username']) : '';
            
    $password = !empty($args['login_password']) ? $args['login_password'] : '';
           
    -----[
    заменить]-----

        function 
    login ($args$mod_admin_login false$encode false)
        {
            global 
    $bb_cfg;

            
    $username = !empty($args['login_username']) ? clean_username($args['login_username']) : '';
            if(
    $encode$username clean_username(mb_convert_encoding($args['login_username'],'UTF8''CP1251'));
            
    $password = !empty($args['login_password']) ? $args['login_password'] : '';
            if(
    $encode$password mb_convert_encoding($password,'UTF8''CP1251');

    ####[СОХРАНИТЬ_ФАЙЛ]####
           
    ####[ОТКРЫТЬ]-----main.js

    -----[найти]-----

    //
    // Menus
    //

    -----[перд добавить]-----

    //
    // Slide Menus
    //
    var SlideMenu = {
        
    openSpeed          'slow',
        
    hideSpeed          'fast',
        
    getOffsetOptions   : { margintruebordertruepaddingtruescrollfalse },
        
    offsetCorrection_X : -4,
        
    offsetCorrection_Y 2,
        
    iframeFix          false,

        
    activeMenuId       null,  //  currently opened menu (from previous click)
        
    clickedMenuId      null,  //  menu to show up
        
    $root              null,  //  root element for menu with "href = '#clickedMenuId'"
        
    $menu              null,  //  clicked menu
        
    positioningType    null,  //  reserved
        
    outsideClickWatch  false//  prevent multiple $(document).click binding

        
    clicked: function($root) {
            
    $root.blur();
            
    this.clickedMenuId this.getMenuId($root);
            
    this.$menu = $(this.clickedMenuId);
            
    this.$root $root;
            
    this.toggle();
        },

        
    getMenuId: function($el) {
            var 
    click $el.attr('click');
            return 
    click.substr(click.indexOf('#'));
        },

        
    setLocation: function() {
            var 
    CSS this.$root.offset();
            
    CSS.top  += this.$root.height() + this.offsetCorrection_Y;
            
    CSS.left += this.offsetCorrection_X;
            
    this.$menu.css(CSS);
        },

        
    fixLocation: function() {
            var 
    $menu this.$menu;
            var 
    curLeft parseInt($menu.css('left'));
            var 
    rCorner = $(document).scrollLeft() + $(window).width() - 6;
            var 
    maxVisibleLeft Math.min(curLeftMath.max(0rCorner $menu.width()));
            if (
    curLeft != maxVisibleLeft) {
                
    $menu.css('left'maxVisibleLeft);
            }
            var 
    curTop parseInt($menu.css('top'));
            var 
    tCorner = $(document).scrollTop() + $(window).height() - 20;
            var 
    maxVisibleTop Math.min(curTopMath.max(0tCorner $menu.height()));
            if (
    curTop != maxVisibleTop) {
                
    $menu.css('top'maxVisibleTop);
            }
            if (
    this.iframeFix) {
                $(
    'iframe.ie-fix-select-overlap'$menu).css({ width$menu.width(), height$menu.height() });
            }
        },

        
    toggle: function() {
            if (
    this.activeMenuId && this.activeMenuId !== this.clickedMenuId) {
                $(
    this.activeMenuId).slideUp(this.hideSpeed);
                
    this.$root.removeClass('active')
            }
            
    // toggle clicked menu
            
    if (this.$menu.is(':visible')) {
            }    else {
                
    this.showClickedMenu();
                if (!
    this.outsideClickWatch) {
                    $(
    document).one('mousedown', function(e){ SlideMenu.hideClickWatcher(e); });
                    
    this.outsideClickWatch true;
                }
            }
        },

        
    showClickedMenu: function() {
            
    this.setLocation();
            
    this.$menu.slideDown(this.openSpeed);
            
    this.$root.addClass('active')
            
    this.fixLocation();
            
    this.activeMenuId this.clickedMenuId;
        },

        
    // hide if clicked outside of menu
        
    hideClickWatcher: function(e) {
            
    this.outsideClickWatch false;
            
    this.hide(e);
        },

        
    hide: function(e) {
            if (
    this.$menu) {
                
    this.$menu.slideUp(this.hideSpeed);
                
    this.$root.removeClass('active')
            }
            
    this.activeMenuId this.clickedMenuId this.$menu null;
        }
    };

    $(
    document).ready(function(){
        
    // SlideMenus
        
    $('div#slideMenu').click(
            function(
    e)
            {
                
    SlideMenu.clicked($(this));
               
                var 
    menuClick true;
                $(
    document).bind("click",function (e)
                {
                    if (!
    menuClick && $(e.target).closest('div.slideMenuBlock').length == 0)
                    {
                        
    SlideMenu.clicked($(this));
                        $(
    document).unbind("click");
                    }
                    
    menuClick false;
                });
            }
        );
        $(
    'div.slideMenuBlock').mousedown(
            function(
    e)
            {
                
    e.stopPropagation();
            }
        )
        
    // Input hints
        
    $('input')
            .
    filter('.hint').one('focus', function()
            {
                $(
    this).val('').removeClass('hint');
            })
            .
    end()
            .
    filter('.error').one('focus', function()
            {
                $(
    this).removeClass('error');
            });
    });

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]-----page_header.tpl

    -----[найти]-----

    <
    link rel="stylesheet" href="{STYLESHEET}?v={$bb_cfg['css_ver']}type="text/css">

    -----[
    после добавить]-----

    <
    link rel="stylesheet" href="{TPL_DIR}/jquery-ui.min.css?v={$bb_cfg['css_ver']}type="text/css">
    <
    link rel="stylesheet" href="{TPL_DIR}/tag-it.css?v={$bb_cfg['css_ver']}type="text/css">
    <
    link rel="stylesheet" href="{TPL_DIR}/pm.css?v={$bb_cfg['css_ver']}type="text/css">
    <
    link rel="stylesheet" href="{TPL_DIR}/slide_menu.css?v={$bb_cfg['css_ver']}type="text/css">
    <
    link rel="stylesheet" href="{TPL_DIR}/popup.css?v={$bb_cfg['css_ver']}type="text/css">
    <
    link rel="stylesheet" href="{TPL_DIR}/table.css?v={$bb_cfg['css_ver']}type="text/css">

    -----[
    найти]-----

    <
    script type="text/javascript" src="{SITE_URL}misc/js/jquery.pack.js?v={$bb_cfg['js_ver']}"></script>

    -----[
    выше добавить]-----

    <
    script type="text/javascript" src="{SITE_URL}misc/js/jquery.min.js?v={$bb_cfg['js_ver']}"></script>
    <
    script type="text/javascript" src="{SITE_URL}misc/js/jquery-ui.min.js?v={$bb_cfg['js_ver']}"></script>

    -----[
    найти]-----

    <
    script type="text/javascript" src="{SITE_URL}misc/js/jquery.pack.js?v={$bb_cfg['js_ver']}"></script>

    -----[
    после добавить]-----

    <
    script type="text/javascript" src="{SITE_URL}misc/js/tag-it.js"></script>

    -----[
    найти]-----

                <!-- IF 
    LOGGED_IN -->
                    <!-- IF 
    HAVE_NEW_PM || HAVE_UNREAD_PM -->
                        <
    a href="{U_READ_PM}" class="new-pm-link"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a>
                    <!-- ELSE -->
                        <
    a href="{U_PRIVATEMSGS}"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a>
                    <!-- ENDIF -->
                <!-- ENDIF -->
                </
    td>
               
    -----[
    удалить]-----

                <!-- IF 
    LOGGED_IN -->
                    <!-- IF 
    HAVE_NEW_PM || HAVE_UNREAD_PM -->
                        <
    a href="{U_READ_PM}" class="new-pm-link"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a>
                    <!-- ELSE -->
                        <
    a href="{U_PRIVATEMSGS}"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a>
                    <!-- ENDIF -->
                <!-- ENDIF -->
               
    -----[
    после]-----

                </
    td>
               
    -----[
    добавить]-----

            <!-- IF 
    LOGGED_IN -->
            <
    script type="text/javascript">
            function 
    new_pm(mode) {
                
    ajax.exec({
                    
    action    'new_pm',
                    
    mode    mode
                
    });
                
    ajax.callback.new_pm = function(data) {
                    if (
    data.pmUpdate !== undefined)
                    {
                        $(
    'strong#pm-link').html(data.pmUpdate);
                    }
                    if (
    data.pmLoad_on)
                    {
                        $(
    '#LoadNewPm').html(data.pmLoad);
                    }
                };
            }
            
    setInterval("new_pm('update')",2*60*1000);
            </
    script>
            <
    td width="100px">
                <
    div id="slideMenuLink">
                    <
    div id="slideMenu" class="tabMenu" click="#user_pm">
                        <
    span id="SpNTit" onClick="new_pm('load'); return false;"><class="floatR IMGslideMenu">{L_INBOX}</p> <strong id="pm-link">{PM_INFO_COUNT}</strong></span>
                        <
    div class="slideMenuBlock lEft" id="user_pm">
                            <
    div class="navPopup" style="margin: 0 -4px">
                                <
    div class="menuHeader primaryContent">
                                    <
    h3>
                                        <
    class="concealed" href="{U_READ_PM}">{L_PM_PM}</a>
                                    </
    h3>
                                </
    div>
                                <
    div class="listPlaceholder">
                                    <
    div class="secondaryContent" id="LoadNewPm">{L_PM_HAVE_NOT_RECENT}</div>
                                </
    div>
                                <
    div class="sectionFooter">
                                    <
    class="floatLink" href="{U_READ_PM_ADD}">{L_PM_POST_NEW}</a>
                                    <
    a href="{U_READ_PM}">{L_VIEW_ALL}</a>
                                </
    div>
                            </
    div>
                        </
    div>
                    </
    div>
                </
    div>
            </
    td>
            <!-- ENDIF -->
           
    ####[СОХРАНИТЬ_ФАЙЛ]####
           
    ####[ОТКРЫТЬ]----- usercp_viewprofile.php

    -----[найти]-----

        
    'PM'                   => '<a href="privmsg.php?mode=post&amp;'POST_USERS_URL .'='$profiledata['user_id'] .'">'$lang['SEND_PRIVATE_MESSAGE'] .'</a>',

    -----[
    заменить]-----

        
    'PM'                   => '<a href="'.PRIVMS_MODE_URL .''PRIVMS_ADD ."&".PRIVMS_USER $profiledata['user_id'] .'">'$lang['SEND_PRIVATE_MESSAGE'] .'</a>',

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- tpl_config.php

    -----[найти]-----

                
    'PM_URL'          => BB_ROOT PM_URL,

    -----[
    заменить]-----

                
    'PM_URL'          => BB_ROOT PRIVMS_MODE_URL PRIVMS_ADD '&u=',

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- memberlist.php

    -----[найти]-----

            
    $pm       = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("privmsg.php?mode=post&amp;"POST_USERS_URL ."=$user_id") .'">'$lang['SEND_PM_TXTB'] .'</a>' '<a href="' . ("privmsg.php?mode=post&amp;"POST_USERS_URL ."=$user_id") .'"><img src="' $images['icon_pm'] . '" alt="' $lang['SEND_PRIVATE_MESSAGE'] . '" title="' $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>';

    -----[
    заменить]-----

            
    $pm       = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("pm.php?mode=add&u=$user_id") .'">'$lang['SEND_PM_TXTB'] .'</a>' '<a href="' . ("pm.php?mode=add&u=$user_id") .'"><img src="' $images['icon_pm'] . '" alt="' $lang['SEND_PRIVATE_MESSAGE'] . '" title="' $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>';

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- groupcp.php

    -----[найти]-----

        
    $pm     = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("privmsg.php?mode=post&amp;"POST_USERS_URL ."=".$row['user_id']) .'">'$lang['SEND_PM_TXTB'] .'</a>' '<a href="' . ("privmsg.php?mode=post&amp;"POST_USERS_URL ."=".$row['user_id']) .'"><img src="' $images['icon_pm'] . '" alt="' $lang['SEND_PRIVATE_MESSAGE'] . '" title="' $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>';

    -----[
    заменить]-----

        
    $pm     = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("pm.php?mode=add&u=".$row['user_id']) .'">'$lang['SEND_PM_TXTB'] .'</a>' '<a href="' . ("pm.php?mode=add&u=".$row['user_id']) .'"><img src="' $images['icon_pm'] . '" alt="' $lang['SEND_PRIVATE_MESSAGE'] . '" title="' $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>';

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- ajax/change_tor_status.php

    -----[найти 2 раза]-----

    if(
    $comment && $comment != $lang['COMMENT']) $message .= "\n\n[b]"$lang['COMMENT'] .'[/b]: '$comment;

    -----[
    заменить]-----

    if(
    $comment && $comment != $lang['COMMENT']) $message .= "[br][b]"$lang['COMMENT'] .'[/b]: '$comment;

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- admin_board.php

    -----[найти и удалить]-----

                
    'PRIVMSG_DISABLE' => ($new['privmsg_disable']) ? false true,

    -----[
    найти и удалить]-----

                
    'INBOX_LIMIT' => $new['max_inbox_privmsgs'],
                
    'SENTBOX_LIMIT' => $new['max_sentbox_privmsgs'],
                
    'SAVEBOX_LIMIT' => $new['max_savebox_privmsgs'],

    -----[
    найти и удалить]-----

                
    'INBOX_PRIVMSGS' => $new['max_inbox_privmsgs'],
                
    'SENTBOX_PRIVMSGS' => $new['max_sentbox_privmsgs'],
                
    'SAVEBOX_PRIVMSGS' => $new['max_savebox_privmsgs'],

    -----[
    найти]-----

                
    'SEED_BONUS_USER_REGDATE' => $new['seed_bonus_user_regdate'],

    -----[
    ниже добавить]-----

                
    'PRIVMSG_DISABLE' => ($new['privmsg_disable']) ? false true,
                
    'JOIN_INT_PM' => $new['join_int_pm'],
                
    'MAX_PM_TIME' => $new['max_pm_time'],

    ####[СОХРАНИТЬ_ФАЙЛ]####

    ####[ОТКРЫТЬ]----- admin_board.tpl

    -----[найти и удалить]-----

    <
    tr>
        <
    th colspan="2">{L_PRIVATE_MESSAGING}</th>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_DISABLE_PRIVMSG}</h4></td>
        <
    td>
            <
    label><input type="radio" name="privmsg_disable" value="0" <!-- IF PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label>&nbsp;&nbsp;
            <
    label><input type="radio" name="privmsg_disable" value="1" <!-- IF not PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label>
        </
    td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_INBOX_LIMITS}</h4></td>
        <
    td><input class="post" type="text" maxlength="4" size="4" name="max_inbox_privmsgs" value="{INBOX_LIMIT}" /></td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_SENTBOX_LIMITS}</h4></td>
        <
    td><input class="post" type="text" maxlength="4" size="4" name="max_sentbox_privmsgs" value="{SENTBOX_LIMIT}" /></td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_SAVEBOX_LIMITS}</h4></td>
        <
    td><input class="post" type="text" maxlength="4" size="4" name="max_savebox_privmsgs" value="{SAVEBOX_LIMIT}" /></td>
    </
    tr>

    -----[
    найти]-----

    <
    tr>
        <
    td><h4>{L_DESIGNER}</h4></td>
        <
    td>
            <
    label><input type="radio" name="new_tpls" value="1" <!-- IF NEW_TPLS -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label>&nbsp;&nbsp;
            <
    label><input type="radio" name="new_tpls" value="0" <!-- IF not NEW_TPLS -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label>
        </
    td>
    </
    tr>

    -----[
    ниже добавить]-----

    <
    tr class="row3 med">
        <
    td class="bold tCenter" colspan="2">{L_PM_CONFIG}</td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_DISABLE_PRIVMSG}</h4></td>
        <
    td>
            <
    label><input type="radio" name="privmsg_disable" value="0" <!-- IF PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label>&nbsp;&nbsp;
            <
    label><input type="radio" name="privmsg_disable" value="1" <!-- IF not PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label>
        </
    td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_PM_JOIN_IN_PM}</h4><h6>{L_PM_JOIN_IN_PM_EXPLAIN}</h6></td>
        <
    td><input class="post" type="text" size="3" maxlength="4" name="join_int_pm" value="{JOIN_INT_PM}" />{L_PM_MAX_JOIN_TIME_HOUR}</td>
    </
    tr>
    <
    tr>
        <
    td><h4>{L_PM_DELETE_IN_PM}</h4><h6>{L_PM_DELETE_IN_PM_EXPLAIN}</h6></td>
        <
    td><input class="post" type="text" size="3" maxlength="4" name="max_pm_time" value="{MAX_PM_TIME}" />{L_PM_MAX_TIME_DAY}</td>
    </
    tr>

    ####[СОХРАНИТЬ_ФАЙЛ]####

    |||||||||||||||||||||||||||||||||||||
    |        
    ЗАПУСТИТЕ CRON ЗАДАЧУ        |
    |                
    И                    |
    |           
    ОЧИСТИТЕ КЕШ!!!!!        |
    |||||||||||||||||||||||||||||||||||||

    Изображения

    1. 1.JPG
    2. 2.JPG
    3. 3.JPG
    4. 4.JPG