for (i=0;i<links.length;i++) {
if (links[i].rel == "forum-script") {
forumScriptUrl = links[i].href;
- } else if (links[i].rel = "forum-user-list") {
+ } else if (links[i].rel == "forum-user-list") {
userListUrl = links[i].href;
}
}
}
function showUser(username) {
if (!username) {
+ // Прячем ссылку на профиль
+ var links=document.getElementsByTagName("a");
+ for (i=0;i<links.length;i++) {
+ if (links[i].href.substring(0,forumScriptUrl.length)==
+ forumScriptUrl && links[i].href.indexOf("profile=")!=-1) {
+ while (links[i].childNodes.length>0) {
+ links[i].removeChild(links[i].childNodes[0]);
+ }
+ }
+ }
return ;
}
userStatus = getUserRights(username);
}
links[i].appendChild(document.createTextNode("Выйти"));
links[i].href=forumScriptUrl+"?logout=1";
- }
+ }
}
}
var status="user";
var xhr=getXMLHttpRequest();
if(!xhr) return status;
- // Strip http:// prefix from OpenID url
- if (user.substring(0,7) == "http://") {
- user=user.substring(7,user.length);
- }
+
+ // Strip http:// prefix from OpenID url
+ if (user.substring(0,7) == "http://")
+ user=user.substring(7,user.length);
+
+ /*
+ * Определяем, на какую глубину относительно корня сайта "закопана" ткущая
+ * страница. Нужно для рекусивного опроса структуры форума на предмет прав
+ * пользователя.
+ */
var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
if(hr==null) return status;
var depth=hr[1].split(/\//).length;
- var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
+
+ /*
+ * Заменяем в имени (OpenID) пользователя "." на "\.", поскольку строка
+ * попадает в RegExp и наличие "." приведёт к тому, что функция не сможет
+ * различить "ab.cd", "ab-cd" и "abecd".
+ */
+ var normalizedUser=user.replace(/\./,"\\.");
+
+ /*
+ * С помощью регулярного выражения ищем имя мользователя и предшествующий ему
+ * заголовок раздела, определяющий уровень прав.
+ */
+ var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+normalizedUser+"\n","m");
for(var path="",i=0;i<depth;path+="../",i++) {
+ /*
+ * Поднимаясь по дереву каталогов ищем на каждом уровне файл с правами
+ */
xhr.open("GET", path+"perms.txt",false);
xhr.send("");
if(xhr.status!=200) continue;
+ // Применяем регулярное выражение к тексту файла.
var perms=("\n"+xhr.responseText+"\n").match(re);
+ /*
+ * Определяем уровень прав для текущего подфорума. Если имя пользователя
+ * упоминается в файле, значит его права отличаются от простого
+ * пользователя.
+ */
if(perms!=null) {
+ // Если пользователь забанен на этом уровне, прекращаем поиск
if(perms[1]=="banned") return "banned";
+ // Если пользователь на данном уровне - админ, прекращаем поиск -
+ // дальше искать нечего
if(perms[1]=="admins") return "admin";
+ /*
+ * В противном случае остаётся третий вариант - модератор.
+ * Простые пользователи в файлах прав не отмечаются.
+ * Поиск продолжаем, поскольку модератор может так же быть и
+ * администратором
+ */
status="moderator";
-
}
+ /*
+ * Проверяем, не достигли ли мы корня форума. Это определяется наличием
+ * файла ".forum" на текущем уровне
+ */
xhr.open("GET", path+".forum",false);
xhr.send("");
+ // Файл либо доступен (200), либо не доступен, но существует (403)
if(xhr.status==403 || xhr.status==200) break;
}
+
return status;
}
// Показывает встроенную в страницу форму под текущей ссылкой
// Использование <a href="forum?operation=1&id=id" // onClick="showform(this,operation)">
function showForm(link, formName) {
- var linktext=link.href;
- // Разобрать параметры, получить значение id
- var start =linktext.indexOf("id=");
- var id;
- if (start!=-1) {
- start+=3;
- var end = linktext.indexOf("&",start);
- if (end==-1) end=linktext.length;
- id = linktext.substring(start,end);
- }
- var f=document.forms[formName];
+ var id;
+ var action;
+ if (link.form) {
+ link = link.form;
+ id = link.elements["id"].value;
+ action = link.action;
+ } else {
+ var linktext=link.href;
+ // Разобрать параметры, получить значение id
+ var start =linktext.indexOf("id=");
+ if (start!=-1) {
+ start+=3;
+ var end = linktext.indexOf("&",start);
+ if (end==-1) end=linktext.length;
+ id = linktext.substring(start,end);
+ }
+ start=linktext.indexOf("?");
+ action=linktext.substring(0,start);
+ }
+ var block = document.getElementById(formName);
+ var f = block.getElementsByTagName("form")[0];
+ f.action=action;
if (id) {
f.elements["id"].value=id;
}
- f.style.display="block";
// позиционируем форму под текущей ссылкой.
- return false;
+ block.style.display="block";
+ link.parentNode.insertBefore(block,link.nextSibling);
+ window.setTimeout(function() {f.elements["text"].focus();},250);
+ window
+ return false;
+}
+function hideForm(formId) {
+ var block = document.getElementById(formId);
+ block.style.display = "none";
}
-
/**
* Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
* если такой существует.