]> www.wagner.pp.ru Git - oss/stilllife.git/blob - templates/basicset/page.js
Добавил замену "." в имени пользователя на "\.", поскольку, попадая в регулярное...
[oss/stilllife.git] / templates / basicset / page.js
1 // Библиотека стандартных функций, используемых на страницах форума
2 //
3 // Извлекает из кук имя текущего пользователя и возвращает его, а также
4 // сохраняет в глобальной переменной forumUser;
5 var forumUser;
6 var userStatus;
7 function getUserName() {
8         var cookietext =document.cookie;
9         var pos = cookietext.indexOf("sluser=");
10         if (pos == -1)  {
11                 return undefined;
12         }
13         var start = pos+7;
14         var end = cookietext.indexOf(";",start);
15         if (end == -1) end=cookietext.length;
16         var value= cookietext.substring(start,end);
17         forumUser = decodeURIComponent(value);
18         return forumUser;
19 }
20 //
21 // Шаблон страницы содержит два специальных тэга link с rel=forum-script
22 // и rel=forum-user-list
23 // Эта функция извлекает их в глобальные переменные forumScriptUrl
24 // и userListUrl;
25 var forumScriptUrl;
26 var userListUrl;
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;
34                 }
35         }       
36 }
37 function showUser(username) {
38         if (!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]);
46                                 }       
47                         }       
48                 }
49                 return ;
50         }
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]);
57                         }       
58                         if (username.substring(0,7) == "http://") {
59                                 links[i].href=username;
60                                 username=username.substring(7,username.length);
61                         } else {
62                                 links[i].href=userListUrl+"/" + username;
63                         }       
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]);
70                         }       
71                         links[i].appendChild(document.createTextNode("Выйти"));
72                         links[i].href=forumScriptUrl+"?logout=1";
73                 }               
74         }       
75 }
76
77 //
78 // Добывает с сервера информацию о модераторах данного форума и
79 // возвращает user, moderator или admin в зависисмости от статуса
80 // указанного пользователя.  
81 //
82 function getUserRights(user) {
83     var status="user";
84     var xhr=getXMLHttpRequest();
85     if(!xhr) return status;
86     
87     // Strip http:// prefix from OpenID url
88     if (user.substring(0,7) == "http://")
89         user=user.substring(7,user.length);
90     
91     /*
92     * Определяем, на какую глубину относительно корня сайта "закопана" ткущая
93     * страница. Нужно для рекусивного опроса структуры форума на предмет прав
94     * пользователя.
95     */
96     var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
97     if(hr==null) return status;
98     var depth=hr[1].split(/\//).length;
99     
100     /* 
101     * Заменяем в имени (OpenID) пользователя "." на "\.", поскольку строка
102     * попадает в RegExp и наличие "." приведёт к тому, что функция не сможет
103     * различить "ab.cd", "ab-cd" и "abecd".
104     */
105     var normalizedUser=user.replace(/\./,"\\.");
106     
107     /*
108     * С помощью регулярного выражения ищем имя мользователя и предшествующий ему
109     * заголовок раздела, определяющий уровень прав.
110     */
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++) {
113         /*
114         * Поднимаясь по дереву каталогов ищем на каждом уровне файл с правами
115         */
116         xhr.open("GET", path+"perms.txt",false);
117         xhr.send("");
118         if(xhr.status!=200) continue;
119         
120         // Применяем регулярное выражение к тексту файла.
121         var perms=("\n"+xhr.responseText+"\n").match(re);
122         /*
123         * Определяем уровень прав для текущего подфорума. Если имя пользователя
124         * упоминается в файле, значит его права отличаются от простого
125         * пользователя.
126         */
127         if(perms!=null) {
128             // Если пользователь забанен на этом уровне, прекращаем поиск
129             if(perms[1]=="banned") return "banned";
130             // Если пользователь на данном уровне - админ, прекращаем поиск -
131             // дальше искать нечего
132             if(perms[1]=="admins") return "admin";
133             /*
134             * В противном случае остаётся третий вариант - модератор.
135             * Простые пользователи в файлах прав не отмечаются.
136             * Поиск продолжаем, поскольку модератор может так же быть и
137             * администратором
138             */
139             status="moderator";
140         }
141         
142         /*
143         * Проверяем, не достигли ли мы корня форума. Это определяется наличием
144         * файла ".forum" на текущем уровне
145         */
146         xhr.open("GET", path+".forum",false);
147         xhr.send("");
148         // Файл либо доступен (200), либо не доступен, но существует (403)
149         if(xhr.status==403 || xhr.status==200) break;
150     }
151     
152     return status;
153 }
154
155 // Обработчик body onLoad
156 //  Пробегается по странице и прячет все элементы
157 // управления, которые не разрешены данному пользователю
158 //
159 function customizePage() {
160         getBaseURLs();
161         showUser(getUserName());
162         hideDeniedOperations();
163 }
164 // Заготовка на будущее
165 function hideDeniedOperations() {
166
167     var user = forumUser;
168         var rights = userStatus;
169         if (user && user.indexOf("http://")==0) {
170                 user=user.substring(7,user.length);
171         }
172         if (rights == "admin") {
173                 // Админу можно все
174                 return;
175         } 
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";
182                 }       
183         }
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";
190                                 }
191                         }       
192                 }
193         }       
194         if (rights == "moderator") {
195                 return;
196         }
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";
204                         } else {
205                                 var inputs = forms[i].getElementsByTagName("input"); 
206                                 var my_item = false;
207                                 for (j=0;j<inputs.length;j++) {
208                                         if (inputs[j].name == "move") {
209                                                 inputs[j].style.visibility="hidden";
210                                         }
211                                 }       
212                                 if (user) {
213                                         for (j=0;j<inputs.length;j++) {
214                                                 if (inputs[j].name == "author") {
215                                                         my_item = inputs[j].value == user;
216                                                         break;
217                                                 }       
218                                         }
219                                 }
220                                 if (!my_item) {
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";
225                                                 }
226                                         }
227                                 }       
228                         } 
229                 }          
230         }       
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";
236                 }       
237                 
238         }       
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";
246                 }               
247         }       
248         return; 
249         }
250         // Убираем операции edit и delete для тех объектов, где юзер не
251         // автор
252
253         
254 }
255
256 //
257 //  Показывает встроенную в страницу форму под текущей ссылкой
258 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
259 function showForm(link, formName) {
260         var id;
261         var action;
262    if (link.form) {
263         link = link.form;
264         id = link.elements["id"].value;
265         action = link.action;
266    } else {     
267         var linktext=link.href;
268         // Разобрать параметры, получить значение id
269         var start =linktext.indexOf("id=");
270         if (start!=-1) {
271                         start+=3;
272                         var end = linktext.indexOf("&",start);
273                         if (end==-1) end=linktext.length;
274                         id = linktext.substring(start,end);
275         }       
276         start=linktext.indexOf("?");
277         action=linktext.substring(0,start);
278    }
279    var block = document.getElementById(formName);
280    var          f       = block.getElementsByTagName("form")[0];
281         f.action=action;
282    if (id) {
283       f.elements["id"].value=id;
284    }
285    // позиционируем форму под текущей ссылкой.
286    block.style.display="block";
287    link.parentNode.insertBefore(block,link.nextSibling);
288         window.setTimeout(function() {f.elements["text"].focus();},250);                
289    window
290    return false;
291 }
292 function hideForm(formId) {
293         var block = document.getElementById(formId);
294         block.style.display = "none";
295 }
296 /**
297 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
298 * если такой существует.
299 */
300 function getXMLHttpRequest()
301 {
302     try {
303         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
304     } catch (e) {
305         try {
306             return new ActiveXObject("Microsoft.XMLHTTP");
307         } catch (E) {
308             if (typeof XMLHttpRequest!='undefined')
309                 return new XMLHttpRequest();
310         }
311     }
312
313     return false;
314 }
315