ОсновноеRadiotalkПользовательское
MPCHAT - CMS хостинг чатов для профессионалов
90   •   Посмотреть все темы

🔒 Готовые решения для чатов (новая версия без фреймов)

 

458
ridz @ridz
В разработке ...

458
ridz @ridz
Просмотр веб-камеры с подтверждением по теме Вебкамеры в чат (только для платников с внесенным взносом)
Для статуса 98 синее
/* Включаем вебкамеры, прописываем статус 99 и загружаем модуль */
var webcam=1;
stn2[99] ="<img src=http://mpchat.com/blank/img/status/webcam.gif title='нажмите для просмотра вещания' style='border:0;'>";
icqtxt[99]='меняю статус на -> вещаю <img src=http://mpchat.com/blank/img/status/webcam.gif>';
stn2[98] ="<img src=http://mpchat.com/blank/img/status/webcam.gif title='нажмите для просмотра вещания' style='border:0;'>";
icqtxt[98]='меняю статус на -> вещаю для всех<img src=http://mpchat.com/blank/img/status/webcam.gif>';


document.write("<"+"script src=http://mpchat.com/blank/webcam.js></"+"script>");




В селектор статусов

<script>if(webcam) document.write("<option value=98>вещаю для всех");</script>

Админка -=Модерация=- Скрипты в чате - /* [Функции - формирования никлиста] */ /* Добавление ника в таблицу участников */
if(webcam) {
if(stat2==99||stat2==98) {

if( admin=='1'||stat2==98) icqst="<a href=# onclick='loadvideo(\"webcam"+nick+"\",\""+webcamhost+"\",\""+nick+"\",0);return false;'>"+icqst+"</a>";

else
icqst="<a href=# onclick='parent.hidden.location.href = \"index.php?inc=write&"+ parent.yourkey+"&text=/privat "+ nick +" webcam_access\";return false;'>"+icqst+"</a>";
if(nick==mynick && loaded) loadvideo("mywebcam",webcamhost,nick,1);
}
else if(nick==mynick && loaded) loadvideo("mywebcam","");
}

Добавлено зелёным просмотр вещания без подтверждения для админов -- ставить по желанию
Р.S. Нарушением тайны связи признаётся ознакомление с сообщением какого-либо лица кроме отправителя и получателя )))
Синим добавлено вещаю без подтверждения

Далее /* [Функция - вывода сообщений и команд] */


if(tonick==mynick) {
text = text.replace("webcam_ok","<a href=# onclick='parent.loadvideo(\"webcam"+nick+"\",\""+webcamhost+"\",\""+nick+"\",0);return false;'>Нажмите для просмотра</a>");
text = text.replace("webcam_access","Разрешить просмотр <a href=# onclick='parent.hidden.location.href = \"index.php?inc=write&"+ parent.yourkey+"&text=/privat "+ nick +" webcam_ok\";return false;'>да</a>/<a href=# onclick='parent.hidden.location.href = \"index.php?inc=write&"+ parent.yourkey+"&text=/privat "+ nick +" webcam_no\";return false;'>нет</a>?")}
else {text = text.replace("webcam_access","Разрешите просмотр?");
text = text.replace("webcam_ok","Просмотр разрешаю");
};
text = text.replace("webcam_no","Просмотр отклонён");



/* Добавление граф ников, градиента и формат времени */

Поставить/заменить отмеченное красным!

Отредактировано ridz - 29.05.2011
458
ridz @ridz
Автоматическое Создание/Скрытие приватного фрейма
Админка -=Шаблоны=- Чат внутри
Заменить
<script><!--
/* Показываем фрейм привата если включен */
if(privatok==1) {
var obj1=document.getElementById("leftdiv");
var obj2=document.getElementById("privatdiv");
obj1.style.bottom=(parseInt(obj1.style.bottom)+parseInt(obj2.style.height))+5+"px";
obj2.style.display="block";
}
// --></script>

на

<script><!--
/* Показываем фрейм привата если включен */
var leftdiv_bottom;
function do_privat() {
var obj1 = document.getElementById("leftdiv");
var obj2 = document.getElementById("privatdiv");
if (!leftdiv_bottom) leftdiv_bottom = parseInt(obj1.style.bottom);
if (privatok == 1) {
obj1.style.bottom = (parseInt(obj1.style.bottom) + parseInt(obj2.style.height)) + 5 + "px";
obj2.style.display = "block";
} else {
obj1.style.bottom = leftdiv_bottom + "px";
obj2.style.display = "none";
}
}
do_privat()
// --></script>

Кнопка в любое место
<input type="button" class="ok" name="" value="privat" onclick="parent.privatok^=1;parent.do_privat();parent.loadframes();"/>

или ссылка
<a href=# onclick="parent.privatok^=1;parent.do_privat();parent.loadframes();return false;" title='Создание/Скрытие приватного фрейма'>Приват</a>

458
ridz @ridz
Запрет на вещание для незарегистрированных или по статусу
заменить/дополнить скрипт в селекторе выбора статуса
запрет на статусы прописать через && и !=
<script>if(webcam&&mystatus != '0' &&mystatus != '1' ) document.write("<option value=99>вещаю");</script>

или запрет для незарегистрированных
<script>if(webcam&&regist== '1' ) document.write("<option value=99>вещаю");</script>

тоже самое и для фреймовой системы но дополняя parent -- parent.webcam parent.regist parent.mystatus

458
ridz @ridz
Использование одного field для установки и запоминания состояний множеста чекбоксов и радиобутонов (идея BETEPAH)
Для всех версий чата.
Добавить в таблицу шаблона настроек код
<tr id="stat"><td colspan="2">
<input name="field15" type="hidden" value="%field15%"/>
<input type="radio" name="name_r" value="0" />1 год<br />
<input type="radio" name="name_r" value="1" />2 года<br />
<input type="radio" name="name_r" value="2" />3 года<br />
<input type="checkbox" name="" />Русский<br />
<input type="checkbox" name="" />Украинский<br />
<input type="checkbox" name="" />Немецкий<br />
<input type="radio" name="name_r1" value="0" />да<br />
<input type="radio" name="name_r1" value="1" />нет<br />
<input type="radio" name="name_r1" value="2" />незнаю<br />

</td></tr>

<script type="text/javascript">
var stat = document.getElementById('stat'),
input = stat.getElementsByTagName('input'),
check = input[0].value;
for (var i = 0; i < check.length; i++) {
input[i + 1].checked = (check.charAt(i) == '1') ? !0 : !1;
}
stat.onclick = function () {
check = "";
for (var i = 1; i < input.length; i++) {
check += input[i].checked ? '1' : '0'
}
input[0].value = check
}
</script>

Тоже самое добавить в шаблон анкеты в таблицу в удобное для вас место, красное желательно убрать .
Номер фиелда можно менять если 15 уже занят.
В радиобутонах незабывайте указывать разные имена для соотвествующей группы, но одинаковые внутри группы.
Пример возможного оформления

458
ridz @ridz
Запрет вещания во всех комнатах кроме одной, двух и тд

Админка -=Модерация=- Скрипты в чате - /* [Функции - нижнего фрейма] */ добавить красное
/* Функция ручного изменения статуса */
function setstatus(status) {
if (myroom!=0&&(status==99||status==98)) status = 0;// добавлено запрет вещания кроме комнаты 0
laststatus=status;
parent.hidden.location.href='index.php?inc=write&'+parent.yourkey+'&text=/status '+status+'&r='+Math.random();
document.getElementsByName("setstatus")[0].value=status;
document.fmsg.text0.focus();
}

/* Функция ручного изменения комнаты */
function setmyroom(room) {
if(myroom==room) return false;
if(!parent.rooms[room][3]) {alert('У Вас нет доступа в эту комнату!'); return false;}
setstatus(0);// добавлено сброс статуса при переходе по комнатам
parent.hidden.location.href='index.php?inc=write&'+parent.yourkey+'&text=/room '+room+'&r='+Math.random();
gettime=new Date().getTime();
document.fmsg.text0.focus();
}

Пример строки для запрета вещания кроме комнаты 0 и комнаты 3
if (myroom!=0&&myroom!=3&&(status==99||status==98)) status = 0;// добавлено запрет вещания кроме комнаты 0 комнаты 3

Точно также можно добавить эти строки для фреймовой системы.

2970
удалён @Foggy
Продолжим тему...

Только сам невидимка видит свой ник в никлисте, больше никто.
Для всех версий чатов.
Будет не только виден ник, будут видны все действия, разумеется, только самому инвизеру.

находишь в скриптах /* скрыть ник невидимки */, там заменяешь строку
if(invisible[nick]) return;
на следующую
if (invisible[nick] && nick!=mynick) return;
Далее добавляем иконку себе, чтоб знать, что инвиз работает. ПОСЛЕ
set_nick=set_nick+set_love+set_clan;
добавляем
if(invisible[nick]) set_nick+="<img src='https://cdn0.iconfinder.com/data/icons/fatcow/16/qip_invisible.png' width='16' height='16' alt='invisible'>"
Вставить, разумеется, можно любую другую картинку. Можно сделать иной класс для всей строки (это уже иначе реализуется) или как угодно иначе выделить свой ник.

Админ видит всех невидимок не заходя в любую из админок
по сути это может быть кто угодно кроме админа.
if (invisible[nick] && nick!=mynick && mynick!='Foggy') return;
заменяете Foggy на свой ник. Если надо, чтоб модеры видели инвизеров, заменяем mynick!='Foggy' на admin==0

2615
Сергей @Pegass
Звук на сообщения

-=Чат внутри=-
сразу после <body>
добавляем <audio id="Sound"></audio>
и в нужное место добавить чекбокс
Если по умолчанию звук включен то такой
<input type=checkbox checked="checked" onclick="zvukmsgno=this.checked?1:0;" title="вкл/откл звуки входящих сообщений" >
если выключен такой
<input type=checkbox onclick="zvukmsgno=this.checked?1:0;" title="вкл/откл звуки входящих сообщений" >
с запоминанием через куки - такой
<script language="JavaScript" type="text/javascript">
var checked='';
if (getcookie("zvukmsg")) {checked=getcookie("zvukmsg")==1?"checked":"";}
else checked='checked';
document.write('<input type=checkbox name="zvukmsg" onclick="if(this.checked) {setcookie(this.name,1);zvukmsgno=1;} else {setcookie(this.name,0);zvukmsgno=0;}" title="вкл/откл звуки входящих сообщений" '+checked+'>')
</script>

-=Скрипты в чате=-

/* [Функции - общие] */

var zvukmsgno=1; //для кнопки вкл/откл по умол 1- вкл 0 -выкл
if (getcookie("zvukmsg")) zvukmsgno=getcookie("zvukmsg");

function sound_msg_play(cmd)
{

if(zvukmsgno!=1 || !loaded) return;
var sound='';
switch(cmd)
{
case 0: sound='link_to_mp3'; break;
case 1: sound='link_to_mp3'; break;
case 2: sound='link_to_mp3'; break;
case 3: sound='link_to_mp3'; break;
case 4: sound='link_to_mp3'; break;
case 5: sound='link_to_mp3'; break;
case 6: sound='link_to_mp3'; break;
case 7: sound='link_to_mp3'; break;
case 8: sound='link_to_mp3'; break;
case 9: sound='link_to_mp3'; break;
case 10: sound='link_to_mp3'; break;
case 11: sound='link_to_mp3'; break;
default: return;
}

var t=document.getElementById("Sound");
if(t){
t.src=sound+"?"+(new Date).getTime();
t.play();
}


}


ищем
/* Вывод простого сообщения */
if(cmd==0) {
symbol=symbols[0];if(nick==mynick) symbol=symbols[1];if(tonick==mynick || text.split(" "+mynick+":").length>1) symbol=symbols[2];

меняем на/* Вывод простого сообщения */
if(cmd==0) {
symbol=symbols[0];if(nick==mynick) symbol=symbols[1];if(tonick==mynick || text.split(" "+mynick+":").length>1) {symbol=symbols[2];if(nick!=nick_r)sound_msg_play(cmd);}


ищем
if(nick==nick_r && loaded==1) {window.setTimeout("wr('"+towr.split("'").join("\\'")+"');",delay_r*1000);}
меняем наif(nick==nick_r && loaded==1) {window.setTimeout("wr('"+towr.split("'").join("\\'")+"');if('"+tonick+"'=='"+mynick+"')sound_msg_play(0);",delay_r*1000);}

ищем
if(cmd==1 && privatok==1) {var obj=document.getElementById("privatdiv"); obj.innerHTML+="<div>"+towr+"</div>";obj.scrollTop=1000000;}
меняем на
if(cmd==1 && privatok==1) {var obj=document.getElementById("privatdiv"); var newDiv = document.createElement('div'); newDiv.innerHTML = towr; obj.appendChild(newDiv); obj.scrollTop=1000000;}

ищем
/* Вывод приватных сообщений */
if(cmd==1 || cmd==2) {
symbol=symbols[0];if(nick==mynick) symbol=symbols[3];if(tonick==mynick) symbol=symbols[4];

меняем на/* Вывод приватных сообщений */
if(cmd==1 || cmd==2) {
symbol=symbols[0];if(nick==mynick) symbol=symbols[3];if(tonick==mynick) {symbol=symbols[4];sound_msg_play(cmd);}


ищем
/* Вывод выделенного сообщения '/me' или '/msg' */
if(cmd==3) {

меняем на/* Вывод выделенного сообщения '/me' или '/msg' */
if(cmd==3) {sound_msg_play(cmd);


ищем
/* Вывод сообщения о вызове и сам вызов окном с музыкой '/call nick' */
if(cmd==4) {
if(tonick==mynick && loaded==1) alert("Вас вызывает в чат "+nick+"!");

меняем на/* Вывод сообщения о вызове и сам вызов окном с музыкой '/call nick' */
if(cmd==4) {
if(tonick==mynick && loaded==1){sound_msg_play(cmd); setTimeout("alert('Вас вызывает в чат "+nick+"!')",1000);}


ищем
/* Вывод сообщения об удалении '/kill nick' и сам процесс */
if(cmd==5) {

меняем на/* Вывод сообщения об удалении '/kill nick' и сам процесс */
if(cmd==5) {sound_msg_play(cmd);


ищем
/* Вывод входа юзера в чат и добавление в нклист через add() */
if(cmd==6) {
if(inchat=='0' && room==myroom) {

меняем на/* Вывод входа юзера в чат и добавление в нклист через add() */
if(cmd==6) {
if(inchat=='0' && room==myroom) {sound_msg_play(cmd);


ищем
/* Вывод выхода юзера из чата и удаление из никлиста через del() */
if(cmd==7) {
if(inchat=='1' && room==myroom) {

меняем на/* Вывод выхода юзера из чата и удаление из никлиста через del() */
if(cmd==7) {
if(inchat=='1' && room==myroom) {sound_msg_play(cmd);


ищем
/* Сообщение о смене статуса участника и его изменение */
if(cmd==8) {
status=text;
for(var i=0;i<us.length;i++) if(us[i]!= null && us[i][0]==nick) {
us[i][5]=status;
if(icqtxt[status]) wr(set_time+"<font size=2 color="+colornick+"><b>"+set_nick+":</b></font> <i>"+icqtxt[status]+"</i><br>");

меняем на/* Сообщение о смене статуса участника и его изменение */
if(cmd==8) {
status=text;
for(var i=0;i<us.length;i++) if(us[i]!= null && us[i][0]==nick) {
us[i][5]=status;
if(icqtxt[status]) {sound_msg_play(cmd);wr(set_time+"<font size=2 color="+colornick+"><b>"+set_nick+":</b></font> <i>"+icqtxt[status]+"</i><br>");}


ищем
/* Функция обработки сообщений викторины */
if(cmd==9) {
if(text=="end") text1="это слово уже угаданно или время вышло";
else if(text=="") text1="вы не угадали это слово";
else {

меняем на/* Функция обработки сообщений викторины */
if(cmd==9) {
if(text=="end") text1="это слово уже угаданно или время вышло";
else if(text=="") text1="вы не угадали это слово";
else {sound_msg_play(cmd);


ищем
/* Функция перехода в комнаты */
if(cmd==10) {

меняем на/* Функция перехода в комнаты */
if(cmd==10) {sound_msg_play(cmd);


ищем
if(cmd==11) {
меняем наif(cmd==11) {sound_msg_play(cmd);

2615
Сергей @Pegass
Автоматическое уменьшение размера загружаемых изображений в чат через кнопку обзор (если размер превышает заданный вами)
не актуально для современных браузеров
1часть В скрипты чата
в /* [Функции - общие] */
добавить
/* Функция изменения загружаемой картинки */
var id_img = 0;
function imgminimum(obj){
var imgmax = 300; // максимальный размер картинки
var h = obj.height;
var w = obj.width;
if (h>imgmax||w>imgmax){if (h>w) {obj.height=imgmax}else {obj.width=imgmax}}; 
if (!obj.id){var scr=document.getElementById("leftdiv");
scr.scrollTop=scr.scrollHeight;
obj.id=id_img++;}
}

Красным добавлен скролинг(прокрутка лога сообщений вниз) после загрузки картинки

2 часть И после
/* [Функция - вывода сообщений и команд] */

var pu = new Array;
var pt = new Array;
function f(room,cmd,nick,tonick,text,time,colornick,color,var9,var10,var11,var12,var13,var14,userid) {
if(ign_ok(nick) && cmd!=6 && cmd!=7) return;
if(nick==nick_r && room!=room_r) return;

добавить строку

text=text.replace("<img src=tmp","<img onload=imgminimum(this) src=tmp");

Картинка будет в логе пропорциональна и размер по ширине и высоте не превысит указанный вами.

или добавить так

text=text.replace(/.br..img.src.(tmp.(.+\.(gif|jpg|jpeg|bmp|png|tif|tiff))).border.0..br./igm, "<img onload=imgminimum(this) src=$1 border=0>");

тогда картинка будет в одной строке с ником.



ЗЫ ответы на вопросы
1- max-hight, max-width не особо кросбраузерно)))
2 - использование up - надо подумать, это ж древний скрипт

2615
Сергей @Pegass
Универсальный тег [media] для загрузки картинок музыки и видео с различных сервисов (от ВЕТЕРАН оригинальный пост)
Внимание, данный скрипт может быть использован против вас
В Администрация - Скрипты в чате.
/* [НАСТРОЙКИ] */
/* 1 - картинки не отображаются, 0 - отображаются */
var img_no = 0;

/* [Функции - общие] */ - если не ставили предыдущее решение
/* Функция изменения загружаемой картинки */
var id_img = 0;
function imgminimum(obj){
var imgmax = 300; // максимальный размер картинки
var h = obj.height;
var w = obj.width;
if (h>imgmax||w>imgmax){if (h>w) {obj.height=imgmax}else {obj.width=imgmax}};
if (!obj.id){var scr=document.getElementById("leftdiv");
scr.scrollTop=scr.scrollHeight;
obj.id=id_img++;}}

/* [Функция - вывода сообщений и команд] */
после
var pu = new Array;
var pt = new Array;
function f(room,cmd,nick,tonick,text,time,colornick,color,var9,var10,var11,var12,var13,var14,userid) {
if(ign_ok(nick) && cmd!=6 && cmd!=7) return;
if(nick==nick_r && room!=room_r) return;

// начало обработки тега media
if (img_no == 0) {
text = text.replace(/\[media\]((?:http|https):\/\/(.*?)\.(gif|jpg|jpeg|bmp|png|tif|tiff))\[\/media\]/mig, '<br><a href="$1" target="_blank" ><img onload=parent.imgminimum(this) src=$1 title="открыть в новом окне" alt="" border=0></a> ')
} else {
text = text.replace(/\[media\]((?:http|https):\/\/(.*?)\.(gif|jpg|jpeg|bmp|png|tif|tiff))\[\/media\]/mig, '<a href="$1" target=_blank><img src=http://mpchat.com/blank/img/ftp/img.gif border=0 alt=""> $2.$3</a>')
};

if (img_no == 1) {
text = text.replace(/\[media\](http:\/\/(.*?))\[\/media\]/mig, '<a href="$1" target=_blank>$1</a>')
};

text = text.replace(/\[media\](http:\/\/zoom\.it\/(.*?))\[\/media\]/mig, '<script src="$1.js?width=auto&height=400px"></script><a href="$1" target="_blank" title="ссылка откроется в новом окне">link</a>');

text = text.replace(/\[media\](http:\/\/www\.divshare\.com\/download\/(.*?))\[\/media\]/mig, '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="335" height="28" id="divplaylist">' + '<param name="movie" value="http://www.divshare.com/flash/playlist?myId=$2" />' + '<param name="allowScriptAccess" value="always" />' + '<embed src="http://www.divshare.com/flash/playlist?myId=$2" width="335" height="28" allowScriptAccess="always" name="divplaylist" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>' + '</object>');

text = text.replace(/\[media\](http:\/\/prostopleer\.com\/tracks\/(.*?))\[\/media\]/mig, '<object width="411" height="28"><param name="movie" value="http://embed.prostopleer.com/track?id=$2"></param><embed src="http://embed.prostopleer.com/track?id=$2" type="application/x-shockwave-flash" width="411" height="28"></embed></object>');

text = text.replace(/\[media\](http:\/\/pleer\.com\/tracks\/(.*?))\[\/media\]/mig, '<object width="411" height="28"><param name="wmode" value="transparent"><param name="movie" value="http://embed.prostopleer.com/track?id=$2"></param><embed src="http://embed.prostopleer.com/track?id=$2" wmode="transparent" type="application/x-shockwave-flash" width="411" height="28"></embed></object>');

text = text.replace(/\[media\](http:\/\/muzebra\.com\/l\/(.*?)\/)\[\/media\]/mig, '<object width="395" height="42"><param name="movie" value="http://embed.muzebra.com/player?id=$2"></param><embed src="http://embed.muzebra.com/player?id=$2" type="application/x-shockwave-flash" width="395" height="42"></embed><param name="wmode" value="transparent"/><param name="scale" value="noscale" /></object>');

text = text.replace(/\[media\]http:\/\/music\.yandex\.ru\/#!\/track\/(.*?)\/album\/(.*?)\[\/media\]/mig, '<object width="350" height="28"><param name="muz" value="http://music.yandex.ru/embed/$1/track.swf"/><param value="noscale" name="scale"/><param value="bg-color=%23D8D8D8&amp;text-color=%23555555&amp;hover-text-color=%23000000" name="flashvars"/><embed type="application/x-shockwave-flash" width="350" height="28" scale="noscale" flashvars="bg-color=%23D8D8D8&amp;text-color=%23555555&amp;hover-text-color=%23000000" src="http://music.yandex.ru/embed/$1/track.swf"/></object>');

text = text.replace(/\[media\](http:\/\/.*mp3)\[\/media\]/mig, '<embed type="application/x-shockwave-flash" src="http://mpchat.com/blank/player.swf" allowfullscreen="false" flashvars="file=$1&autostart=false" width="250" height="20">');

var vidregxp = []; //через запятую - название, регэксп, реплэйс, метод внедрения (1 - embed, 2 - iframe, 3 - embed через x-mplayer2)
vidregxp[0] = ["videofile", "(http:\/\/(.*\\.)(rmi|wmv|midi|mid|mpg|wav|snd|wma|mpeg|avi|mpe|m1v|mpa|aifc|aiff|au|aif|swf))", "$1", 3];
vidregxp[1] = ["flv", "(http:\/\/.*\\.flv)", '"http://mpchat.com/blank/player.swf" flashvars="file=$1&autostart=false"', 1];
vidregxp[2] = ["rutube.ru", "(http:\/\/)(rutube\.ru\/)\\S+\\?v=(\\S+)", "$1video.$2$3", 1];
vidregxp[3] = ["youtube.com", "(https?:\/\/www\.youtube\.com\/)\\S+(\\?v|&amp;v)=(\\S+)", "$1v/$3&hl=ru_RU&fs=1", 1];
vidregxp[4] = ["youtu.be", "(https?:\/\/youtu\.be\/)(\\S+)", "http://www.youtube.com/embed/$2", 2];
vidregxp[5] = ["lovi.tv", "(http:\/\/lovi\.tv\/video\/)\\S+?Code=(\\S+)", "$1sharer.php?Code=$2&Width=280&Height=224", 2];
vidregxp[6] = ["lovi.tv2", "(http:\/\/loovi\.tv\/)video\/(\\S+)\/", "$1flash/player5.swf?config=/video/config.php?Code=$2", 1];
vidregxp[7] = ["vimeo.com", "(http:\/\/vimeo\.com\/)(\\S+)", "$1moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1", 1];
vidregxp[8] = ["metacafe.com", "(http:\/\/www\.metacafe\.com\/)watch(\\S+)\/?", "$1fplayer$2.swf", 1];
vidregxp[9] = ["vids.myspace.com", "http:\/\/vids\.(myspace\.com\/)\\S+videoid=(\\S+)", "http://mediaservices.$1services/media/embed.aspx/m=$2,t=1,mt=video", 1];
vidregxp[10] = ["video.google.com", "(http:\/\/video\.google\.com\/)\\S+docid=(\\S+)&\\S+", "$1googleplayer.swf?docid=$2&hl=ru&fs=true", 1];
vidregxp[11] = ["dailymotion.com", "(http:\/\/www\.dailymotion\.com\/)video\/([^_+]+)\\S+", "$1swf/$2", 1];
vidregxp[12] = ["5min.com", "http:\/\/www\.(5min\.com\/)\\S+-(\\d+)", "http://embed.$1$2/", 1];
vidregxp[13] = ["video.mail.ru", "http:\/\/(video\.mail\.ru)\/(\\S+)\/(\\S+)\/(\\S+)\/(\\S+)\.html", "http://img.mail.ru/r/video2/player_v2.swf?par=http://content.$1/$2/$3/$4/$$$5$$0$39&imaginehost=$1&perlhost=$1&alias=$2&username=$3&albumid=$4&id=$5&catalogurl=http://video.mail.ru/themes/clips", 1];
vidregxp[14] = ["gametrailers.com", "(http:\/\/www\.gametrailers\.com)\/\\S+\/(\\d+)", "$1/remote_wrap.php?umid=$2", 1];
vidregxp[15] = ["video.yahoo.com", "(http:\/\/video\.yahoo\.com)\/watch\/(\\d+)\/(\\d+)", '"http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" flashVars="id=$3&vid=$2&lang=en-us&intl=us"', 1];
vidregxp[16] = ["video.libero.it", "(http:\/\/video\.libero\.it)\/app\/\\S+id=(\\S+)", '"$1/static/swf/eltvplayer.swf?id=$2.flv&ap=0"', 1];
vidregxp[17] = ["play.ukr.net", "(http:\/\/play\.ukr\.net)\/videos\/show\/(\\S+)\/", '"$1/player.swf?key=$2&StopAsking=0&self=0"', 1];
vidregxp[18] = ["video.online.ua", "(http:\/\/video\.online\.ua)\/(\\S+)\/", '"http://i.online.ua/mplayer/player_logo.swf?file=$1/playlist/$2.xml&autostart=false&javascriptid=media_player&enablejs=true"', 1];
vidregxp[19] = ["vision.rambler.ru", "(http:\/\/vision\.rambler\.ru)\/users\/(\\S+)\/", '"$1/i/e.swf?id=$2&logo=1&where=home"', 1];
vidregxp[20] = ["video.bigmir.net", "(http:\/\/video\.bigmir\.net)\/show\/(\\S+)\/", '"$1/extplayer/$2/"', 1];
vidregxp[21] = ["sibnet.ru", "http:\/\/(video\.sibnet\.ru)\/\\S*?video(\\d+)\/", '"http://$1/mediaplayer.swf" flashvars="file=http%3A%2F%2F$1%2Fupload%2Fvideo%2F$2.flv&amp;image=http%3A%2F%2F$1%2Fupload%2Fcover%2Fvideo_$2_0.jpg"', 1];
vidregxp[22] = ["irc.lv", "(http:\/\/irc\.lv)\/video\\?(id=.*)", "$1/player.swf?$2", 1];
vidregxp[23] = ["veoh.com", "(http:\/\/www\.veoh\.com\/)\\S+watch\/?%?3?D?(v\\S+)", "$1static/swf/webplayer/WebPlayer.swf?version=AFrontend.5.4.9.1006&permalinkId=$2&player=videodetailsembedded&videoAutoPlay=0&id=anonymous", 1];
vidregxp[24] = ["gamestar.de", "(http:\/\/www\.gamestar\.de\/)\\S+=(\\d+)", "$1emb/player.swf?config=$1emb/getVideoData.cfm?vid=$2", 1];
vidregxp[25] = ["spike.com", "(http:\/\/www\.spike\.com\/)video\/\\S+\/(\\S+)", '"$1efp" flashvars="flvbaseclip=$2"', 1];
vidregxp[26] = ["sostav.ru", "(http:\/\/(?:www\.)?videosostav\.ru\/)video\/(\\S+)\/", "$1swf/hplayer.swf?fname=$2", 1];
vidregxp[27] = ["vkontakte.ru", "(https?:\/\/vkontakte\.ru\/video\\S+hash=\\w+)", "$1", 2];
vidregxp[28] = ["vk.com", "(https?:\/\/vk\.com\/video\\S+hash=\\w+)", "$1", 2];
vidregxp[29] = ["smotri.com", "http:\/\/smotri\.com\/video\/\\S+id=(\\S+)", "http://pics.smotri.com/player.swf?file=$1&bufferTime=3&autoStart=false&str_lang=rus&xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color.xml&xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml", 1];

t = text.split('[media]');
if (t[1]) {
var viwidth = 280, //ширина видеоокна
viheight = 224, //высота видеоокна
viwindow = document.getElementById('mediains');

t2 = t[1].split('[/media]');
if (t2[0]) {
var src = t2[0];
var expr;
for (var i = 0; i < vidregxp.length; i++) {
expr = new RegExp(vidregxp[i][1]);
if (src.match(expr)) {
src = src.replace(expr, vidregxp[i][2]);
viwindow.style.display = 'block';
if (vidregxp[i][3] == 1) { //грузим в embed через x-shockwave-flash
text = text.replace('[media]' + t2[0] + '[/media]', '<a href="' + t2[0] + '" target="_blank" title="ссылка откроется в новом окне">Видеоролик загружен!</a>');
viwindow.innerHTML = '<embed width=' + viwidth + ' height=' + viheight + ' src=' + src + ' type="application/x-shockwave-flash" allowscriptaccess=always allowfullscreen=true></embed>';
}
if (vidregxp[i][3] == 2) { //грузим в iframe
text = text.replace('[media]' + t2[0] + '[/media]', '<a href="' + t2[0] + '" target="_blank" title="ссылка откроется в новом окне">Видеоролик загружен!</a>');
viwindow.innerHTML = '<iframe width=' + viwidth + ' height=' + viheight + ' src=' + src + ' frameborder=0 allowfullscreen></iframe>';
}
if (vidregxp[i][3] == 3) { //грузим в embed через x-mplayer2
text = text.replace('[media]' + t2[0] + '[/media]', '<a href="' + t2[0] + '" target="_blank" title="ссылка откроется в новом окне">Видеоролик загружен!</a>');
viwindow.innerHTML = '<embed width=' + viwidth + ' height=' + viheight + ' src=' + src + ' type="application/x-mplayer2" allowscriptaccess=always allowfullscreen=true></embed>';
}
}
}
text = text.replace('[media]' + t2[0] + '[/media]', '<a href="' + t2[0] + '" target="_blank" title="ссылка откроется в новом окне">' + t2[0] + '</a>');
} else {
text = 'Просмотр выключен';
viwindow.innerHTML = '';
viwindow.style.display = 'none';
}
}
// конец обработки тега media
t = text.split('&lt;iframe src=&quot;');
if (t[1]) {
t2 = t[1].split('&quot; width=&quot;607&quot; height=&quot;360&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;');
if (t2[0].substr(0, 19) == 'http://vk.com/video' || t2[0].substr(0, 20) == 'https://vk.com/video') {
text = text.replace('&lt;iframe src=&quot;' + t2[0] + '&quot; width=&quot;607&quot; height=&quot;360&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;', '<a href="' + t2[0] + '" target="_blank" title="ссылка откроется в новом окне">Видеоролик загружен!</a> ');
document.getElementById('mediains').innerHTML = '<iframe src="' + t2[0] + '" width="280" height="224" frameborder="0"></iframe>';
}
}

Окно видео-вывода ставится обычно под ник-листом <div id=users></div>сюда
<div id="mediains"></div>

Кнопку тега удобнее всего ставить рядом со строкой сообщения (спасибо, ridz):
<script>
function htags(t1,t2){
var mess=document.fmsg.text0.value;
if(mess.search("http")!=-1){mess = mess.replace(/(http\S+)/mig, " "+t1+"$1"+t2+" ")} else {mess+=" "+t1+t2+" "};
document.fmsg.text0.value=mess;
document.fmsg.text0.focus();
}
</script>

Оформление - зависит от вашей фантазии, основное - это код онклик. У меня так
<div class="abcabc_in" style="cursor:pointer" onclick="htags('[media]','[/media]')" title="Показать в чате картинку, видео или музыку"></div>

2615
Сергей @Pegass
как сделать подсчет сообщений написанных в чате с выводом картинкой на титульнике
<script>
var x=i_msg;
var i = "";
do
{
x=x/10;
i="<img src='http://radiofull.ru/Style_god/img/numb/"+(x*10-Math.floor(x)*10)+".png'>"+i;
x=Math.floor(x);
}
while (x > 0);
document.write(i);
</script>

В папке 'http://radiofull.ru/Style_god/img/numb лежат картинки 1.png 2.png .... 0.png

2615
Сергей @Pegass
спойлер для форума

в head
<script>
function spoiler(o)
{
var obj=o.childNodes[1].style; var obj2=o.childNodes[0].childNodes[0];
if(obj.display=='block')
{
obj.display='none';
obj2.innerHTML='<img src=http://radiofull.ru/Style_god/img/forum/plus.png width=10 height=10>';
}
else
{
obj.display='block';
obj2.innerHTML='<img src=http://radiofull.ru/Style_god/img/forum/minus.png width=10 height=10>';
}
}
</script>

в соответствующие места кода

etags[i]=new Array(/\[spoiler=([^\] ]{2,30})\](.*?)\[\/spoiler\]/g,'<blockquote style="margin-bottom:0px;padding:5px;"><div class="incqbox" style="cursor:pointer;" onclick="spoiler(this.parentNode); return false;"><span><img src="http://radiofull.ru/Style_god/img/forum/plus.png" width="10" height="10"></span><b> $1</b></div><div style="margin-top: 10px; display: none; ">$2</div></blockquote>',1);i++;

tags+="<input type='button' class='button2' accesskey='c' value='[+]' style='width: 40px' onclick=ftags('[spoiler]','[/spoiler]') title='Код: [spoiler=заголовок]текст под спойлер[/spoiler]'> ";

2615
Сергей @Pegass
Функция вызова в чат админов и модеров


Скрипты в чате

/* [НАСТРОЙКИ] */
var alert_mod_replay=0;

/* Проверка пользовательских команд для простого сообщения */
if(cmd==0) {

if(text.substr(0,5)=="/ping" && nick == mynick && loaded==1) {
var ping=(new Date().getTime()-gettime)/1000; text="<font color=red><i>ping: "+ping+" sec</i></font> "; }

if(text.substr(0,6)=="/clear" && clearer[nick]) {
if(loaded==1) document.getElementById("leftdiv").innerHTML="";text="очищаю фрейм сообщений";}

if(text.substr(0,7)=="/reload" && reloader[nick]) {
if(loaded==1) parent.location.reload(); text="перезагружаю чат";}

if(text.substr(0,6)=="/alert" && alerter[nick]) {
text=text.substr(text.indexOf(": ")+2);
if(loaded==1 && mynick==tonick) alert(text); if(nick!=mynick) return;
text=tonick+": отправленна команда алерт";}

if(text.substr(0,7)=="/ignore" && ignorer[nick]){
if(tonick && mynick!=tonick && loaded==1) ign_sel(tonick); if(nick!=mynick || !tonick) return;
if(ign_ok(tonick)) text="Вы поставили полный игнор на ник "+tonick; else text="Вы сняли полный игнор с ника "+tonick;
}

if(text.replace(tonick+": ","").substr(0,9)=="/modalert"){
text="Вызываю модераторов"
tonick='';
if(admin==1&& loaded==1 && alert_mod_replay==0) //вместо admin==1 можно указать любой статус или несколько статусов mystatus=='3'
{
alert_mod_replay=1;
window.setTimeout('alert(nick+" вызвал(а) в чат модераторов");',1000);
alert_mod_replay=0;
}
}


}

Чат внутри

<script>
document.write("<input type=hidden name=nick value="+parent.mynick+">");
document.write("<input type=hidden name=id value="+parent.myid+">");
document.write("<select name=cmd class=text>");
document.write("<option value=''>-=в общем=-");
document.write("<option value='/privat '>приватно");
document.write("<option value='/privat2 '>приват окно");
document.write("<option value='/modalert '>Вызвать модератора");
if(parent.alerter[parent.mynick]) document.write("<option value='/alert '>алерт-вызов");
if(parent.clearer[parent.mynick]) document.write("<option value='/clear '>очистить");
if(parent.reloader[parent.mynick]) document.write("<option value='/reload '>перезагрузить");
if(parent.ignorer[parent.mynick]) document.write("<option value='/ignore '>полный игнор");
if(parent.admin==1) {
document.write("<option value=''>-=модерация=-");
document.write("<option value='/kick '>кикнуть");
document.write("<option value='/warn '>предупредить");
}
document.write("</select>");
</script>

2615
Сергей @Pegass
Викторина в строго отведённой комнате

-=Скрипты в чате=-


/* [Функции - нижнего фрейма] */

добавляем (зелёным - номера комнат с викториной)
/* комнаты с викториной */
var gameroom= new Array();//для бесполых
gameroom[1]=true;
gameroom[5]=true;
gameroom[10]=true;

/* [Функции - нижнего фрейма] */

ищем
/* Загружает викторину в верхушку чата */
var gameon=0;
function startgame(){
if(gameon==0){
gameframe.location.href='http://'+engine_host+':'+engine_port+'/?chat='+chatlogin;
gameon=1; document.getElementById('gamediv').style.display="block";
}
else {
gameframe.location.href='start.html';
gameon=0; document.getElementById('gamediv').style.display="none";
}
}

меняем на
/* Загружает викторину в верхушку чата */
function startgame(dd){
if(dd==1 && gameroom[myroom]){
gameframe.location.href='http://'+engine_host+':'+engine_port+'/?chat='+chatlogin; document.getElementById('gamediv').style.display="block";
}
else {
gameframe.location.href='start.html'; document.getElementById('gamediv').style.display="none";
}
}

/* [Подготовка фреймов и загрузка сообщений] */

добавляем синее
function loadframes() {
/* Последняя стадия загрузки */
if(interval) window.clearTimeout(interval);
/* Подготовка фрейма привата */
if(parent.privatok==1) {document.getElementById("privatdiv").innerHTML='';}
/* Обнуление переменных */
loaded=0;
scrolled=0;
/* myhistory=myhistory1;*/
for(var i=0;i<rooms.length;i++) rooms[i][1]=0;
/* Подготовка таблицы никлиста */
uc = 0;
us = new Array();
ucc= new Array();
document.getElementById('users').innerHTML=userlist;
/* Проверка непрерывного соединения */
interval=window.setTimeout(
'if(engine_on!="ajax" && !ajaxon) {wr("<font color=red>Проблема подключения к потоковому движку на порту "+engine_port+". Пробуем подключиться через <b>ajax</b> движок ...</font>"); window.setTimeout("engine_on=\\"ajax\\"; loadframes();",10000);} ' +
'else wr("<font color=red>Не удалось подключиться к движку чата, вероятно Ваш браузер просто не поддерживает новые технологии.<br>Попробуйте использовать новый современный браузер <a href=http://google.com/chrome target=_blank>Google Chrome</a>.</font>");'
,1000*20); /* Время для проверки потокового движка 10 сек */
/* Загрузка движка сообщений */
document.getElementById("leftdiv").innerHTML='Загрузка ...';
/* Загрузка викторины */
if(gameroom[myroom]) startgame(1); else startgame(0);

loadengine();
}

2615
Сергей @Pegass
Ограничение на повторный вызов одного и того же человека

Особенности реализации: инфа о всех вызовах запишется в лог, зато её нельзя обойти и заперт работает для всех, т.е. если Петя вызвал Васю то в течении N минуть Васю не смогут вызвать ни Петя, ни Коля, хотя попытки вызовов будут отображаться в логе чата(который админский)

-=Скрипты в чате=-

/* [Функции - общие] */

Добавляем

/* Задержка вызова одного и того же ника */
var time_call = new Array();
time_call['adm']=0;
var time_call_who = new Array();
time_call_who['adm']='';
var time_call_delay=1000*60*5;//5 минут

function timeCall(){
var m = new Date();
var tmp=m.getTime();
return tmp;
}

function timetxt(mmin){
var textmin='у';
var dmmin=Math.round((mmin/10-Math.floor(mmin/10))*10)
if((mmin>4 && mmin<21) || (dmmin==0) || ((dmmin>4) && (dmmin<10)))
textmin='';
else if ((dmmin>1) && (dmmin<5))
textmin='ы';
else textmin='у';

return textmin;
}
var nton="";
var ndelay=0;
function countdown(mms,ttonick){
var ssec=Math.floor(mms/1000);
var mmin=Math.floor(ssec/60);
ssec=ssec-mmin*60;
if(!document.forms.count) return;

if(mmin==0&&ssec==1){
document.forms.count.count2.value='можно';
var p_fans=document.getElementById('p_fans');
if(p_fans) p_fans.parentNode.removeChild(p_fans);
return;
}
else
document.forms.count.count2.value=""+mmin+" минут"+timetxt(mmin)+" "+ssec+" секунд"+timetxt(ssec)+". "
nton=ttonick;
ndelay=time_call_delay-timeCall()+time_call[ttonick];
setTimeout("countdown(ndelay,nton)",1000)
}


function ChatAlert(html,w,h) {
var s=(w?'width:'+w+';':'')+(h?'height:'+h+';':'');
var p_fans=document.getElementById('p_fans');
if(!p_fans)
{
p_fans=document.createElement('div');
p_fans.id='p_fans';
}
p_fans.innerHTML='';
var p_fans_bg=document.createElement('div');
p_fans_bg.className='p_fans_bg';
p_fans_bg.onclick=function()
{
p_fans.parentNode.removeChild(p_fans);
}
var p_fans_helper=document.createElement('div');
p_fans_helper.className='p_fans_helper';
var p_fans_img=document.createElement('div');
p_fans_img.setAttribute('style',s);
p_fans_img.innerHTML=html;
p_fans_img.className='p_fans_img';
p_fans.appendChild(p_fans_bg);
p_fans.appendChild(p_fans_helper);
p_fans.appendChild(p_fans_img);
document.body.appendChild(p_fans);
};

/* Вывод сообщения о вызове и сам вызов окном с музыкой '/call nick' */
Заменяем весь раздел
if(cmd==4) {
if(loaded==1){
if(!time_call[tonick]) time_call[tonick]=0;
if(timeCall()-time_call[tonick]>time_call_delay)
{
time_call[tonick]=timeCall();
time_call_who[tonick]=set_nick;
if(tonick==parent.mynick && loaded==1) ChatAlert("Вас вызывает в чат "+nick+"!");
if(!invisible[nick]) wr(set_time+"<i>"+set_nick+" вызывает "+tonick+".</i><br>");
}
else
if(set_nick==parent.mynick && tonick!=parent.mynick && loaded==1)
{
var call_alert_txt="<font>Пользователь с ником \""+tonick+"\" уже был вызван</font>";
if(time_call_who[tonick]==parent.mynick) call_alert_txt+="<font> вами!</font>";
else call_alert_txt+="<font>.</font><br><font>Вызывал пользователь с ником \""+time_call_who[tonick]+"\".</font>";
call_alert_txt+="<br><div style='margin-top:20px;'><font>Повторный вызов возможен через: </font>";
ChatAlert(call_alert_txt+"<form name='count' style='display: inline-block;'><input type='text' size='20' name='count2' class='count2' readonly></form></div>");
countdown(parent.time_call_delay-parent.timeCall()+parent.time_call[tonick],tonick);
}
}

}

-=Стили=-
добавляем (требуют наведения красоты, ибо реализованы в минимальном варианте, для управления шириной и высотой всплывающего окна используйте параметры функции ChatAlert())
#p_fans
{
position:fixed;
top:0px;
bottom:0px;
left:0px;
right:0px;
z-index:2147483647;
text-align: center;
/*overflow:auto;*/
}
#p_fans .p_fans_bg
{
position:absolute;
top:0px;
bottom:0px;
left:0px;
right:0px;
background:rgba(0, 0, 0, 0.7);
}
#p_fans .p_fans_helper
{
display:inline-block;
vertical-align:middle;
height:100%;
width:0px;
}
#p_fans .p_fans_img
{
max-height:90%;
max-width:90%;
vertical-align:middle;
position: relative;
display: inline;
}


В закрытой теме нельзя отправлять сообщения.