--- /dev/null
+// Библиотека стандартных функций, используемых на страницах форума
+//
+// Извлекает из кук имя текущего пользователя и возвращает его, а также
+// сохраняет в глобальной переменной forumUser;
+var forumUser;
+var userStatus;
+function getUserName() {
+ var cookietext =document.cookie;
+ var pos = cookietext.indexOf("sluser=");
+ if (pos == -1) {
+ return undefined;
+ }
+ var start = pos+7;
+ var end = cookietext.indexOf(";",start);
+ if (end == -1) end=cookietext.length;
+ var value= cookietext.substring(start,end);
+ forumUser = decodeURIComponent(value);
+ return forumUser;
+}
+//
+// Шаблон страницы содержит два специальных тэга link с rel=forum-script
+// и rel=forum-user-list
+// Эта функция извлекает их в глобальные переменные forumScriptUrl
+// и userListUrl;
+var forumScriptUrl;
+var userListUrl;
+function getBaseURLs() {
+ var links=document.getElementsByTagName("link");
+ 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") {
+ 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);
+ var links=document.getElementsByTagName("a");
+ for (i=0;i<links.length;i++) {
+ if (links[i].className == "userurl") {
+ while (links[i].childNodes.length>0) {
+ links[i].removeChild(links[i].childNodes[0]);
+ }
+ if (username.substring(0,7) == "http://") {
+ links[i].href=username;
+ username=username.substring(7,username.length);
+ } else {
+ links[i].href=userListUrl+"/" + username;
+ }
+ links[i].appendChild(document.createTextNode(username));
+ links[i].className = userStatus;
+ } else if (links[i].href.substring(0,forumScriptUrl.length)==
+ forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
+ while (links[i].childNodes.length>0) {
+ links[i].removeChild(links[i].childNodes[0]);
+ }
+ links[i].appendChild(document.createTextNode("Выйти"));
+ links[i].href=forumScriptUrl+"?logout=1";
+ }
+ }
+}
+
+//
+// Добывает с сервера информацию о модераторах данного форума и
+// возвращает user, moderator или admin в зависисмости от статуса
+// указанного пользователя.
+//
+function getUserRights(user) {
+ 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);
+ }
+ 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");
+ 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";
+
+ }
+
+ xhr.open("GET", path+".forum",false);
+ xhr.send("");
+ if(xhr.status==403 || xhr.status==200) break;
+ }
+ return status;
+}
+
+// Обработчик body onLoad
+// Пробегается по странице и прячет все элементы
+// управления, которые не разрешены данному пользователю
+//
+function customizePage() {
+ getBaseURLs();
+ showUser(getUserName());
+ hideDeniedOperations();
+}
+// Заготовка на будущее
+function hideDeniedOperations() {
+
+ var user = forumUser;
+ var rights = userStatus;
+ if (user && user.indexOf("http://")==0) {
+ user=user.substring(7,user.length);
+ }
+ if (rights == "admin") {
+ // Админу можно все
+ return;
+ }
+ var links=document.getElementsByTagName("a");
+ var forms=document.getElementsByTagName("form");
+ // Убираем только администраторскую функцию setrights
+ for (i=0;i<links.length;i++) {
+ if (links[i].href.indexOf("setrights=") != -1) {
+ links[i].style.display="none";
+ }
+ }
+ for (i=0;i<forms.length;i++) {
+ if (forms[i].className == "foruminfo") {
+ var inputs = forms[i].getElementsByTagName("input");
+ for (j=0;j<inputs.length;j++) {
+ if (inputs[j].name == "setrights") {
+ inputs[j].style.display="none";
+ }
+ }
+ }
+ }
+ if (rights == "moderator") {
+ return;
+ }
+ for (i=0;i<forms.length;i++) {
+ if (forms[i].className == "foruminfo") {
+ forms[i].style.display="none";
+ } else if (forms[i].className == "msginfo"||
+ forms[i].className=="topicinfo") {
+ if (rights=="banned") {
+ forms[i].style.display="none";
+ } else {
+ var inputs = forms[i].getElementsByTagName("input");
+ var my_item = false;
+ for (j=0;j<inputs.length;j++) {
+ if (inputs[j].name == "move") {
+ inputs[j].style.display="none";
+ }
+ }
+ if (user) {
+ for (j=0;j<inputs.length;j++) {
+ if (inputs[j].name == "author") {
+ my_item = inputs[j].value == user;
+ break;
+ }
+ }
+ }
+ if (!my_item) {
+ for (j=0;j<inputs.length;j++) {
+ if (inputs[j].name == "edit" ||
+ inputs[j].name == "delete") {
+ inputs[j].style.display="none";
+ }
+ }
+ }
+ }
+ }
+ }
+ // Убираем все модераторские операции из ссылок
+ for (i=0;i<links.length;i++) {
+ if (links[i].href.indexOf("newforum=")!=-1 ||
+ links[i].href.indexOf("move=")!=-1) {
+ links[i].style.display="none";
+ }
+
+ }
+ if (!forumUser || rights == "banned") {
+ for (i=0;i<links.length;i++) {
+ if (links[i].href.indexOf("newtopic=")!=-1 ||
+ links[i].href.indexOf("edit=")!=-1 ||
+ links[i].href.indexOf("delete=")!=-1||
+ (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
+ links[i].style.display="none";
+ }
+ }
+ return;
+ }
+ // Убираем операции edit и delete для тех объектов, где юзер не
+ // автор
+
+
+}
+
+//
+// Показывает встроенную в страницу форму под текущей ссылкой
+// Использование <a href="forum?operation=1&id=id" // onClick="showform(this,operation)">
+function showForm(link, 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;
+ }
+ window.setTimeout(function() {f.elements["text"].focus();},250);
+ linktext = document.location.href;
+ var anchor = linktext.indexOf("#");
+ if (anchor!=-1) {
+ linktext=linktext.substring(0,anchor);
+ }
+ document.location.href=linktext+"#replyform";
+ return false;
+}
+function hideForm(formId) {
+ var block = document.getElementById(formId);
+ block.style.display = "none";
+}
+/**
+* Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
+* если такой существует.
+*/
+function getXMLHttpRequest()
+{
+ try {
+ return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ try {
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (E) {
+ if (typeof XMLHttpRequest!='undefined')
+ return new XMLHttpRequest();
+ }
+ }
+
+ return false;
+}
+