Просмотр файла globalchat/plugins/ajax_chat_source.js

Размер файла: 18.08Kb
$('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, "&amp;"); 
// А затем всё остальное в любой последовательности 
text = text.replace(/</g, "&lt;"); 
text = text.replace(/>/g, "&gt;"); 
text = text.replace(/"/g, "&quot;"); 
// Возвращаем полученное значение 
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+"&amp;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);
}
);