$('head').append ("<link rel='stylesheet' type='text/css' href='plugins/style.css' />");
$('body').attr ('onresize', 'msgs_area_size_control (); scroll_msgs_list ();');
chat_page = 1;
tmp_msgs_count = 1;
tmp_msgs = [];
connect_error = 0;
get_new_data_process = 0;
function htmlspecialchars (text)
{
// Сначала необходимо заменить &
text = text.replace(/&/g, "&");
// А затем всё остальное в любой последовательности
text = text.replace(/</g, "<");
text = text.replace(/>/g, ">");
text = text.replace(/"/g, """);
// Возвращаем полученное значение
return text;
}
function delete_bad_symbols (text)
{
// Сначала необходимо заменить &
text = text.replace(/&/g, "AND");
// Возвращаем полученное значение
return text;
}
function hide_icon (icon_id)
{
$('#'+icon_id).css ('opacity', '0');
}
function show_icon (icon_id)
{
$('#'+icon_id).css ('opacity', '0.8');
}
function process_smiles (text)
{
return text.replace (/\:([a-zA-Z]{2,10})/g, "<img src='smiles/$1.gif' alt='' />");
}
function bbcodes_replacer (str, bbcode_name, bbcode_content, offset, s)
{
result = str;
bbcode_content = process_bbcodes (bbcode_content);
switch (bbcode_name)
{
case 'b': result = "<strong>"+bbcode_content+"</strong>"; break;
case 'i': result = "<em>"+bbcode_content+"</em>"; break;
case 'u': result = "<span style='text-decoration: underline;'>"+bbcode_content+"</span>"; break;
case 's': result = "<del>"+bbcode_content+"</del>"; break;
case 'small': result = "<span style='font-size: 8px;'>"+bbcode_content+"</span>"; break;
case 'big': result = "<span style='font-size: 20px;'>"+bbcode_content+"</span>"; break;
case 'code': result = "<code style='white-space: pre;'>"+bbcode_content+"</code>"; break;
case 'quote': result = "<div class='quote' style='font-size: 10px;'>"+bbcode_content+"</div>"; break;
case 'red': result = "<span style='color: darkred;'>"+bbcode_content+"</span>"; break;
case 'green': result = "<span style='color: darkgreen;'>"+bbcode_content+"</span>"; break;
case 'blue': result = "<span style='color: darkblue;'>"+bbcode_content+"</span>"; break;
case 'orange': result = "<span style='color: darkorange;'>"+bbcode_content+"</span>"; break;
}
return result;
}
function process_bbcodes (text)
{
return text.replace (/\[([a-zA-Z]{1,10})\](.*?)\[\/\1\]/g, bbcodes_replacer);
}
function process_text (text)
{
return process_smiles (process_bbcodes (text));
}
/**
* Scroll_msgs_list
*
* Прокручивает лист сообщений в конец
*/
function scroll_msgs_list ()
{
if ($.cookie('auto_scrolling') == 1)
$('#msgs_list').scrollTop($('#msgs_list').height () * 100);
}
/**
* Clear_chat_msgs
*
* Очищает список сообщений
*/
function clear_chat_msgs ()
{
$('#msgs_list').empty ();
}
/**
* Set_navigation_panel
*
* Восстанавливает настройки из cookie
*/
function set_navigation_panel ()
{
if ($.cookie ('sound') == 1)
$('#sound_toggle').attr ('src', 'icons/sound_on.png');
else if ($.cookie ('sound') == 2)
$('#sound_toggle').attr ('src', 'icons/sound_off.png');
else
$.cookie ('sound', 1);
if ($.cookie ('window_attach') == 1)
{
$(document.body).css("overflow", "hidden");
$('#window_attach_toggle').attr ('src', 'icons/attach_on.png');
}
else if ($.cookie ('window_attach') == 2)
{
$(document.body).css("overflow", "auto");
$('#window_attach_toggle').attr ('src', 'icons/attach_off.png');
}
else
$.cookie ('window_attach', 2);
/* Включаем автоматическую прокрутку */
$.cookie('auto_scrolling', 1);
}
/**
* Sound_toggle
*
* Переключатель звука
*/
function sound_status_toggle ()
{
if ($.cookie('sound') == '1')
{
$.cookie('sound', '2',
{
expires: 364
});
$('#sound_toggle').attr ('src', 'icons/sound_off.png');
}
else
{
$.cookie('sound', '1',
{
expires: 364
});
$('#sound_toggle').attr ('src', 'icons/sound_on.png');
}
}
/**
* Auto_scrolling_status_toggle
*
* Переключатель автопрокрутки
*/
function auto_scrolling_status_toggle (toggle)
{
if ($.cookie('auto_scrolling') == 1 && toggle !== 1)
{
$.cookie('auto_scrolling', '2',
{
expires: 364
});
$('#auto_scrolling_toggle').attr ('src', 'icons/scrolling_off.png');
}
else
{
$.cookie('auto_scrolling', '1',
{
expires: 364
});
$('#auto_scrolling_toggle').attr ('src', 'icons/scrolling_on.png');
}
}
/**
* Window_attach_toggle
*
* Переключатель полосы прокрутки
*/
function window_attach_status_toggle ()
{
$('#text_input').focus ();
if ($(document.body).css ("overflow") == 'hidden')
{
$.cookie('window_attach', '2',
{
expires: 364
});
$(document.body).css("overflow", "auto");
$('#window_attach_toggle').attr ('src', 'icons/attach_off.png');
}
else
{
$.cookie('window_attach', '1',
{
expires: 1
});
$(document.body).css("overflow", "hidden");
$('#window_attach_toggle').attr ('src', 'icons/attach_on.png');
}
}
/**
* Load_smiles
*
* Скачивает смайлы с сервера и вставляет в html блок
*/
function load_smiles ()
{
if ($("#smiles_window").text ())
return;
$("#smiles_window").text ('Загрузка смайлов...');
$.ajax(
{
url: 'ajax_chat_router.php',
type: 'POST',
data:
{
'get_smiles': 1
},
dataType: 'text',
success: function (result)
{
$("#smiles_window").val ('');
$('#smiles_window').html (result);
}
});
}
/**
* Smiles_window_toggle
*
* Переключатель смайлов
*/
function smiles_window_toggle ()
{
$('#phrases_designer_window').hide ();
$('#bb_codes_window').hide ();
load_smiles ();
$("#smiles_window").toggle ();
text_input_coordinates = $('#text_input').offset ();
/* Высота окна смайлов 134px + 2px отступ от формы ввода */
$('#smiles_window').offset ({ top: text_input_coordinates.top -134 - 2 - 42, left: text_input_coordinates.left + 90});
}
/**
* Phrases_designer_toggle
*
* Переключатель квик фраз
*/
function phrases_designer_window_toggle ()
{
$('#smiles_window').hide ();
$('#bb_codes_window').hide ();
$("#phrases_designer_window").toggle ();
text_input_coordinates = $('#text_input').offset ();
phrases_designer_window_size = $('#phrases_designer_window').height () + 2;
$('#phrases_designer_window').offset ({ top: text_input_coordinates.top - phrases_designer_window_size - 42, left: text_input_coordinates.left + 120});
}
/**
* Bbcodes_toggle
*
* Переключатель BB-кодов
*/
function bbcodes_window_toggle ()
{
$('#smiles_window').hide ();
$('#phrases_designer_window').hide ();
$("#bb_codes_window").toggle ();
text_input_coordinates = $('#text_input').offset ();
/* Высота окна BB-кодов 96px */
bb_codes_window_size = $('#bb_codes_window').height () + 2;
$('#bb_codes_window').offset ({ top: text_input_coordinates.top - bb_codes_window_size - 42, left: text_input_coordinates.left + 150});
}
/**
* Insert_nick
*
* Вставляет ник в поле ввода
*/
function insert_nick (nick, id)
{
add_text (nick+' [ID'+id+'], ');
$('#last_selected_user').hide ();
$('#last_selected_user').html ("<a href='#' onclick='insert_nick (\""+nick+"\", "+id+");'>"+nick+"</a> <span onmouseover='show_user_menu (\"last_selected_user_menu\");' onmouseout='hide_user_menu (\"last_selected_user_menu\");'><a class='"+DIV_C_USER_ID+"' href='user_menu.php?user_id="+id+"'>[ID"+id+"]</a> <span id='last_selected_user_menu' style='display: none;'><a href='user_profile.php?user_id="+id+"'><img src='icons/user_info.png' alt='' /></a> <a href='quick_msg.php?user_id="+id+"'><img src='icons/msgs.png' alt='' /></a> <img src='icons/delete.png' alt='' onclick='delete_selected_user ();' style='cursor: pointer;' /></span></span>");
$('#last_selected_user').fadeIn ('normal');
}
/**
* Delete_selected_day
*
* Удаляет последнего выбранного пользователя
*/
function delete_selected_user ()
{
$('#last_selected_user').empty ();
}
function add_msgs (msgs, tmp_msgs)
{
var msgs_list_id = document.getElementById('msgs_list');
$.each(msgs, function(i, msg) {
msgs_list_id.innerHTML += "<div id='chat_msg_"+msg.id+"' class='"+DIV_C_MSGS_LIST+"' onmouseover='show_icon (\"delete_icon_"+msg.id+"\");' onmouseout='hide_icon (\"delete_icon_"+msg.id+"\");'><a href='#' onclick='insert_nick (\""+msg.user_nick+"\", "+msg.user_id+"); return false;'><img src='icons/sex_"+msg.user_sex+".png' alt='' /> <span class='"+gc.div_c_user_nick+"'>"+msg.user_nick+"</span></a> <span id='user_quick_menu_block"+msg.id+"_"+msg.user_id+"_back' onmouseover='show_user_menu (\"user_quick_menu_block"+msg.id+"_"+msg.user_id+"\");' onmouseout='hide_user_menu (\"user_quick_menu_block"+msg.id+"_"+msg.user_id+"\");'><a class='"+DIV_C_USER_ID+"' href='user_menu.php?user_id="+msg.user_id+"'>[ID"+msg.user_id+"]</a> <span id='user_quick_menu_block"+msg.id+"_"+msg.user_id+"' style='display: none;'> <a href='user_profile.php?user_id="+msg.user_id+"'><img src='icons/user_info.png' alt='' /></a> <a href='quick_msg.php?user_id="+msg.user_id+"'><img src='icons/msgs.png' alt='' /></a> </span></span> "+process_text (msg.msg)+(gc_user.rights_group >= 1 && !tmp_msgs ? "<a href='http://chatmix.ru/gc_control/delete_msg.php?msg_id="+msg.id+"&location="+gc.current_location_base64+"'><img style='opacity: 0; float: right;' id='delete_icon_"+msg.id+"' src='icons/delete.png' alt='delete' title='Удалить' /></a>" : '')+"</div>";
});
scroll_msgs_list ();
}
/**
* Send_message
*
* Отправляет сообщения
*/
function send_message ()
{
/* Скрываем смайлы и bb-коды */
hide_accelerators ();
/* Удаляем хреновые символы */
var msg = delete_bad_symbols ($('#text_input').val ());
/* Делаем фокус на форме ввода */
$('#text_input').focus ();
if (msg != '')
{
/* Тримминг текста */
msg = msg.replace (/(^ *)|( *$)/, '');
/* Поиск спама */
if (msg.match (/\S(?=(\.ru\b)|(\.ua\b)|(\.com\b)|(\.kom\b)|(\.biz\b)|(\.info\b)|(\.mobi\b)|(\.su\b)|(\.us\b)|(\.tk\b))/ig, ''))
{
alert ('Спам запрещен');
return false;
}
/* Проверка размера сообщения */
if (msg.length > 1000)
{
alert ('Слишком длинное сообщение. Максимум 1000 символов');
return false;
}
/* Проверка очереди сообщений */
if (tmp_msgs.length < 3)
tmp_msgs[tmp_msgs.length] = msg.replace (/^.{2,20} ?\[ID([0-9]{1,6})\]/g, '@$1');
else
{
alert ('Пожалуйста, отправляйте сообщения не так часто');
return false;
}
/* Очистка формы ввода */
$('#text_input').val ('');
/* Добавляем в очередь для отправки на сервер */
tmp_msg =
{
'msg_content':
{
'id': 'tmp_'+tmp_msgs_count,
'user_id': gc_user.id,
'user_nick': htmlspecialchars (gc_user.nick),
'user_sex': gc_user.sex,
'msg': htmlspecialchars (msg.replace (/^(.{2,20}) ?\[ID[0-9]{1,6}\]/g, '[b]$1[/b]'))
}
};
/* Добавляем сообщение в список */
add_msgs (tmp_msg, 1);
/* Счетчик отправленных сообщений */
tmp_msgs_count = tmp_msgs_count + 1;
/* Если ид последнего сообщения пуст, то плюсуем */
if (last_chat_msg_id == 0)
last_chat_msg_id = 1;
}
}
/**
* Play_sound
*
* Воспроизводит звук
*/
function play_sound (sound_name)
{
if ($.cookie('sound') == 1)
$('body').append('<object><embed src="sound/'+sound_name+'.swf" autostart="1" width="0" height="0" type="application/x-flashplayer"></embed></object>');
}
/**
* Msgs_area_size_control
*
* Выравнивает форму ввода по нижнему краю экрана
*/
msgs_area_size_control_i = 0;
function msgs_area_size_control ()
{
main_area_coordinates = $('#main_area').offset ();
input_area_panel_size = $('#input_panel').height ();
msgs_list_size = $(window).height () - main_area_coordinates.top - $('#input_panel').height () - 16;
$('#msgs_list').height (msgs_list_size - GC_C_FORM_POSITION_CORRECTION);
/* При первой настройке прокручиваем лист сообщений в конец */
if (msgs_area_size_control_i == 0)
{
scroll_msgs_list ();
msgs_area_size_control_i = 1;
}
}
$(document).ready(
function ()
{
last_chat_msg_id = 0;
room_id = $('#room_id').text ();
set_navigation_panel ();
if (parseInt ($("body").css ("max-width")) < 800)
$("body").css ("max-width", '900px');
if (room_id == 20)
{
$('html').attr ('oncopy', 'return false;');
$('html').attr ('onmousedown', 'return false;');
$('html').attr ('onclick', 'return true;');
}
/**
* Get_new_data
*
* Получает новые данные с сервера
*/
function get_new_data (new_msgs, users_online, rating_info, room_data, quick_msgs, friends_number)
{
if (get_new_data_process == 1)
return false;
/* Начинаем процесс обмена данными */
get_new_data_process = 1;
/* Сообщения для потправки
* перемещение переменной сделано для предотвращения потери данных
* при долгом ответе сервера */
msgs_to_send = tmp_msgs;
/* Очищаем массив переданных сообщений */
tmp_msgs = [];
/* Если уже есть квик сообщение, новые не получаем */
if ($("#quick_msg").text () != '')
quick_msgs = 0;
/* Ставим временную блокировку */
$.ajax(
{
url: 'ajax_chat_router.php',
type: 'POST',
data:
{
'room_id': room_id,
'last_chat_msg_id': last_chat_msg_id,
'get_new_msgs': new_msgs,
'msgs': msgs_to_send,
'get_users_online': users_online,
'get_rating_info': rating_info,
'get_room_data': room_data,
'get_quick_msgs': quick_msgs,
'get_friends_number': friends_number
},
dataType: 'json',
error: function ()
{
if (!connect_error)
{
/* Музычка об ошибке */
play_sound ('error');
/* Добавляем сообщение об ошибке в список сообщений */
$('#msgs_list').append ("<div class='"+DIV_C_ERROR+"'><img src='icons/important.png' alt='' /> <a href='javascript:location.reload();'>Ошибка подключения. Рекомендуем обновить страницу</a></div>");
msgs_area_size_control ();
scroll_msgs_list ();
}
connect_error = 1;
/* Текущий процесс обмена данными закончен */
get_new_data_process = 0;
/* Прокручиваем список сообщений */
scroll_msgs_list ();
},
success: function (result)
{
connect_error = 0;
/* Обновляем данные комнаты */
if (result.room_data)
{
$("#room_data").html (result.room_data);
}
/* Читаем квики */
if (result.quick_msg)
{
play_sound ('msg');
$("#chat_area_left_column").prepend (process_text (result.quick_msg));
msgs_area_size_control ();
scroll_msgs_list ();
}
/* Добавляем в список новые сообщения */
if (result.msgs)
{
if (last_chat_msg_id > 0)
play_sound ('msg');
add_msgs (result.msgs);
if (result.max_msg_id > 0)
last_chat_msg_id = result.max_msg_id;
msgs_area_size_control ();
}
/* Обновляем список юзеров в комнате */
if (result.users_in_the_room)
$("#users_in_the_room").html (result.users_in_the_room);
/* Обновляем счетчики в комнатах */
if (result.users_in_the_rooms_counters)
{
$.each(result.users_in_the_rooms_counters, function(i, room)
{
$("#room_"+room['id']+"_users_counter").text (room['counter']);
});
}
/* Апдейтим инфо о лидере */
if (result.leader)
{
$("#chat_leader_nick").html (result.leader.nick);
$("#chat_leader_rating").text (result.leader.points);
}
/* Апдейтим счетчик друзей */
if (result.friends_number)
$("#friends_number").text (result.friends_number);
/* Апдейтим информацию о пользователе */
if (result.user)
{
$("#user_rating").text (result.user.points);
$("#user_rank").text (result.user.rank);
var user_medal = 'no';
if (result.user.rank == 1)
user_medal = 'gold';
else if (result.user.rank == 2)
user_medal = 'silver';
else if (result.user.rank == 3)
user_medal = 'bronze';
$("#user_medal").html ("<img src='icons/medal_"+user_medal+"_24.png' alt='' align='middle' />");
}
/* Текущий процесс обмена данными закончен */
get_new_data_process = 0;
}
});
}
get_new_data (1, 1, 1, 0, 1, 1);
$('#text_input').focus ();
// отправка сообщений при нажатии клавиши "Enter"
$('#text_input').keydown (function (event)
{
if (event.which == 13)
{
send_message ();
return false;
}
if (event.which == 9)
{
smiles_window_toggle ();
return false;
}
});
/* Проверяем новые сообщения каждые 2 секунды */
setInterval (function ()
{
get_new_data (1, 0, 0, 1, 1);
}, 2000);
setInterval (function ()
{
get_new_data (0, 1, 1, 0, 0, 1);
}, 11000);
}
);