1 // Библиотека стандартных функций, используемых на страницах форума
3 // Извлекает из кук имя текущего пользователя и возвращает его, а также
4 // сохраняет в глобальной переменной forumUser;
7 function getUserName() {
8 var cookietext =document.cookie;
9 var pos = cookietext.indexOf("sluser=");
14 var end = cookietext.indexOf(";",start);
15 if (end == -1) end=cookietext.length;
16 var value= cookietext.substring(start,end);
17 forumUser = decodeURIComponent(value);
21 // Шаблон страницы содержит два специальных тэга link с rel=forum-script
22 // и rel=forum-user-list
23 // Эта функция извлекает их в глобальные переменные forumScriptUrl
27 function getBaseURLs() {
28 var links=document.getElementsByTagName("link");
29 for (i=0;i<links.length;i++) {
30 if (links[i].rel == "forum-script") {
31 forumScriptUrl = links[i].href;
32 } else if (links[i].rel == "forum-user-list") {
33 userListUrl = links[i].href;
37 function showUser(username) {
39 // Прячем ссылку на профиль
40 var links=document.getElementsByTagName("a");
41 for (i=0;i<links.length;i++) {
42 if (links[i].href.substring(0,forumScriptUrl.length)==
43 forumScriptUrl && links[i].href.indexOf("profile=")!=-1) {
44 while (links[i].childNodes.length>0) {
45 links[i].removeChild(links[i].childNodes[0]);
51 userStatus = getUserRights(username);
52 var links=document.getElementsByTagName("a");
53 for (i=0;i<links.length;i++) {
54 if (links[i].className == "userurl") {
55 while (links[i].childNodes.length>0) {
56 links[i].removeChild(links[i].childNodes[0]);
58 if (username.substring(0,7) == "http://") {
59 links[i].href=username;
60 username=username.substring(7,username.length);
62 links[i].href=userListUrl+"/" + username;
64 links[i].appendChild(document.createTextNode(username));
65 links[i].className = userStatus;
66 } else if (links[i].href.substring(0,forumScriptUrl.length)==
67 forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
68 while (links[i].childNodes.length>0) {
69 links[i].removeChild(links[i].childNodes[0]);
71 links[i].appendChild(document.createTextNode("Выйти"));
72 links[i].href=forumScriptUrl+"?logout=1";
78 // Добывает с сервера информацию о модераторах данного форума и
79 // возвращает user, moderator или admin в зависисмости от статуса
80 // указанного пользователя.
82 function getUserRights(user) {
84 var xhr=getXMLHttpRequest();
85 if(!xhr) return status;
87 // Strip http:// prefix from OpenID url
88 if (user.substring(0,7) == "http://")
89 user=user.substring(7,user.length);
92 * Определяем, на какую глубину относительно корня сайта "закопана" ткущая
93 * страница. Нужно для рекусивного опроса структуры форума на предмет прав
96 var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
97 if(hr==null) return status;
98 var depth=hr[1].split(/\//).length;
101 * Заменяем в имени (OpenID) пользователя "." на "\.", поскольку строка
102 * попадает в RegExp и наличие "." приведёт к тому, что функция не сможет
103 * различить "ab.cd", "ab-cd" и "abecd".
105 var normalizedUser=user.replace(/\./,"\\.");
108 * С помощью регулярного выражения ищем имя мользователя и предшествующий ему
109 * заголовок раздела, определяющий уровень прав.
111 var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+normalizedUser+"\n","m");
112 for(var path="",i=0;i<depth;path+="../",i++) {
114 * Поднимаясь по дереву каталогов ищем на каждом уровне файл с правами
116 xhr.open("GET", path+"perms.txt",false);
118 if(xhr.status!=200) continue;
120 // Применяем регулярное выражение к тексту файла.
121 var perms=("\n"+xhr.responseText+"\n").match(re);
123 * Определяем уровень прав для текущего подфорума. Если имя пользователя
124 * упоминается в файле, значит его права отличаются от простого
128 // Если пользователь забанен на этом уровне, прекращаем поиск
129 if(perms[1]=="banned") return "banned";
130 // Если пользователь на данном уровне - админ, прекращаем поиск -
131 // дальше искать нечего
132 if(perms[1]=="admins") return "admin";
134 * В противном случае остаётся третий вариант - модератор.
135 * Простые пользователи в файлах прав не отмечаются.
136 * Поиск продолжаем, поскольку модератор может так же быть и
143 * Проверяем, не достигли ли мы корня форума. Это определяется наличием
144 * файла ".forum" на текущем уровне
146 xhr.open("GET", path+".forum",false);
148 // Файл либо доступен (200), либо не доступен, но существует (403)
149 if(xhr.status==403 || xhr.status==200) break;
155 // Обработчик body onLoad
156 // Пробегается по странице и прячет все элементы
157 // управления, которые не разрешены данному пользователю
159 function customizePage() {
161 showUser(getUserName());
162 hideDeniedOperations();
164 // Заготовка на будущее
165 function hideDeniedOperations() {
167 var user = forumUser;
168 var rights = userStatus;
169 if (user && user.indexOf("http://")==0) {
170 user=user.substring(7,user.length);
172 if (rights == "admin") {
176 var links=document.getElementsByTagName("a");
177 var forms=document.getElementsByTagName("form");
178 // Убираем только администраторскую функцию setrights
179 for (i=0;i<links.length;i++) {
180 if (links[i].href.indexOf("setrights=") != -1) {
181 links[i].style.visibility="hidden";
184 for (i=0;i<forms.length;i++) {
185 if (forms[i].className == "foruminfo") {
186 var inputs = forms[i].getElementsByTagName("input");
187 for (j=0;j<inputs.length;j++) {
188 if (inputs[j].name == "setrights") {
189 inputs[j].style.visibility="hidden";
194 if (rights == "moderator") {
197 for (i=0;i<forms.length;i++) {
198 if (forms[i].className == "foruminfo") {
199 forms[i].style.display="none";
200 } else if (forms[i].className == "msginfo"||
201 forms[i].className=="topicinfo") {
202 if (rights=="banned") {
203 forms[i].style.display="none";
205 var inputs = forms[i].getElementsByTagName("input");
207 for (j=0;j<inputs.length;j++) {
208 if (inputs[j].name == "move") {
209 inputs[j].style.visibility="hidden";
213 for (j=0;j<inputs.length;j++) {
214 if (inputs[j].name == "author") {
215 my_item = inputs[j].value == user;
221 for (j=0;j<inputs.length;j++) {
222 if (inputs[j].name == "edit" ||
223 inputs[j].name == "delete") {
224 inputs[j].style.visibility="hidden";
231 // Убираем все модераторские операции из ссылок
232 for (i=0;i<links.length;i++) {
233 if (links[i].href.indexOf("newforum=")!=-1 ||
234 links[i].href.indexOf("move=")!=-1) {
235 links[i].style.visibility="hidden";
239 if (!forumUser || rights == "banned") {
240 for (i=0;i<links.length;i++) {
241 if (links[i].href.indexOf("newtopic=")!=-1 ||
242 links[i].href.indexOf("edit=")!=-1 ||
243 links[i].href.indexOf("delete=")!=-1||
244 (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
245 links[i].style.visibility="hidden";
250 // Убираем операции edit и delete для тех объектов, где юзер не
257 // Показывает встроенную в страницу форму под текущей ссылкой
258 // Использование <a href="forum?operation=1&id=id" // onClick="showform(this,operation)">
259 function showForm(link, formName) {
264 id = link.elements["id"].value;
265 action = link.action;
267 var linktext=link.href;
268 // Разобрать параметры, получить значение id
269 var start =linktext.indexOf("id=");
272 var end = linktext.indexOf("&",start);
273 if (end==-1) end=linktext.length;
274 id = linktext.substring(start,end);
276 start=linktext.indexOf("?");
277 action=linktext.substring(0,start);
279 var block = document.getElementById(formName);
280 var f = block.getElementsByTagName("form")[0];
283 f.elements["id"].value=id;
285 // позиционируем форму под текущей ссылкой.
286 block.style.display="block";
287 link.parentNode.insertBefore(block,link.nextSibling);
288 window.setTimeout(function() {f.elements["text"].focus();},250);
292 function hideForm(formId) {
293 var block = document.getElementById(formId);
294 block.style.display = "none";
297 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
298 * если такой существует.
300 function getXMLHttpRequest()
303 return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
306 return new ActiveXObject("Microsoft.XMLHTTP");
308 if (typeof XMLHttpRequest!='undefined')
309 return new XMLHttpRequest();