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) {
41 userStatus = getUserRights(username);
42 var links=document.getElementsByTagName("a");
43 for (i=0;i<links.length;i++) {
44 if (links[i].className == "userurl") {
45 while (links[i].childNodes.length>0) {
46 links[i].removeChild(links[i].childNodes[0]);
48 if (username.substring(0,7) == "http://") {
49 links[i].href=username;
50 username=username.substring(7,username.length);
52 links[i].href=userListUrl+"/" + username;
54 links[i].appendChild(document.createTextNode(username));
55 links[i].className = userStatus;
56 } else if (links[i].href.substring(0,forumScriptUrl.length)==
57 forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
58 while (links[i].childNodes.length>0) {
59 links[i].removeChild(links[i].childNodes[0]);
61 links[i].appendChild(document.createTextNode("Выйти"));
62 links[i].href=forumScriptUrl+"?logout=1";
68 // Добывает с сервера информацию о модераторах данного форума и
69 // возвращает user, moderator или admin в зависисмости от статуса
70 // указанного пользователя.
72 function getUserRights(user) {
74 var xhr=getXMLHttpRequest();
75 if(!xhr) return status;
76 // Strip http:// prefix from OpenID url
77 if (user.substring(0,7) == "http://") {
78 user=user.substring(7,user.length);
80 var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
81 if(hr==null) return status;
82 var depth=hr[1].split(/\//).length;
83 var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
84 for(var path="",i=0;i<depth;path+="../",i++) {
85 xhr.open("GET", path+"perms.txt",false);
87 if(xhr.status!=200) continue;
89 var perms=("\n"+xhr.responseText+"\n").match(re);
91 if(perms[1]=="banned") return "banned";
92 if(perms[1]=="admins") return "admin";
97 xhr.open("GET", path+".forum",false);
99 if(xhr.status==403 || xhr.status==200) break;
104 // Обработчик body onLoad
105 // Пробегается по странице и прячет все элементы
106 // управления, которые не разрешены данному пользователю
108 function customizePage() {
110 showUser(getUserName());
111 hideDeniedOperations();
113 // Заготовка на будущее
114 function hideDeniedOperations() {
116 var user = forumUser;
117 var rights = userStatus;
118 if (user && user.indexOf("http://")==0) {
119 user=user.substring(7,user.length);
121 if (rights == "admin") {
125 var links=document.getElementsByTagName("a");
126 var forms=document.getElementsByTagName("form");
127 // Убираем только администраторскую функцию setrights
128 for (i=0;i<links.length;i++) {
129 if (links[i].href.indexOf("setrights=") != -1) {
130 links[i].style.visibility="hidden";
133 for (i=0;i<forms.length;i++) {
134 if (forms[i].className == "foruminfo") {
135 var inputs = forms[i].getElementsByTagName("input");
136 for (j=0;j<inputs.length;j++) {
137 if (inputs[j].name == "setrights") {
138 inputs[j].style.visibility="hidden";
143 if (rights == "moderator") {
146 for (i=0;i<forms.length;i++) {
147 if (forms[i].className == "foruminfo") {
148 forms[i].style.display="none";
149 } else if (forms[i].className == "msginfo"||
150 forms[i].className=="topicinfo") {
151 if (rights=="banned") {
152 forms[i].style.display="none";
154 var inputs = forms[i].getElementsByTagName("input");
156 for (j=0;j<inputs.length;j++) {
157 if (inputs[j].name == "move") {
158 inputs[j].style.visibility="hidden";
162 for (j=0;j<inputs.length;j++) {
163 if (inputs[j].name == "author") {
164 my_item = inputs[j].value == user;
170 for (j=0;j<inputs.length;j++) {
171 if (inputs[j].name == "edit" ||
172 inputs[j].name == "delete") {
173 inputs[j].style.visibility="hidden";
180 // Убираем все модераторские операции из ссылок
181 for (i=0;i<links.length;i++) {
182 if (links[i].href.indexOf("newforum=")!=-1 ||
183 links[i].href.indexOf("move=")!=-1) {
184 links[i].style.visibility="hidden";
188 if (!forumUser || rights == "banned") {
189 for (i=0;i<links.length;i++) {
190 if (links[i].href.indexOf("newtopic=")!=-1 ||
191 links[i].href.indexOf("edit=")!=-1 ||
192 links[i].href.indexOf("delete=")!=-1||
193 (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
194 links[i].style.visibility="hidden";
199 // Убираем операции edit и delete для тех объектов, где юзер не
206 // Показывает встроенную в страницу форму под текущей ссылкой
207 // Использование <a href="forum?operation=1&id=id" // onClick="showform(this,operation)">
208 function showForm(link, formName) {
209 var linktext=link.href;
210 // Разобрать параметры, получить значение id
211 var start =linktext.indexOf("id=");
215 var end = linktext.indexOf("&",start);
216 if (end==-1) end=linktext.length;
217 id = linktext.substring(start,end);
219 var f=document.forms[formName];
221 f.elements["id"].value=id;
223 f.style.display="block";
224 // позиционируем форму под текущей ссылкой.
229 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
230 * если такой существует.
232 function getXMLHttpRequest()
235 return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
238 return new ActiveXObject("Microsoft.XMLHTTP");
240 if (typeof XMLHttpRequest!='undefined')
241 return new XMLHttpRequest();