]> 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                 return ;
40         }
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]);
47                         }       
48                         if (username.substring(0,7) == "http://") {
49                                 links[i].href=username;
50                                 username=username.substring(7,username.length);
51                         } else {
52                                 links[i].href=userListUrl+"/" + username;
53                         }       
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]);
60                         }       
61                         links[i].appendChild(document.createTextNode("Выйти"));
62                         links[i].href=forumScriptUrl+"?logout=1";
63                 }               
64         }       
65 }
66
67 //
68 // Добывает с сервера информацию о модераторах данного форума и
69 // возвращает user, moderator или admin в зависисмости от статуса
70 // указанного пользователя.  
71 //
72 function getUserRights(user) {
73     var status="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);
79         } 
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);
86         xhr.send("");
87         if(xhr.status!=200) continue;
88         
89         var perms=("\n"+xhr.responseText+"\n").match(re);
90         if(perms!=null) {
91             if(perms[1]=="banned") return "banned";
92             if(perms[1]=="admins") return "admin";
93             status="moderator";
94
95         }
96         
97         xhr.open("GET", path+".forum",false);
98         xhr.send("");
99         if(xhr.status==403 || xhr.status==200) break;
100     }
101     return status;
102 }
103
104 // Обработчик body onLoad
105 //  Пробегается по странице и прячет все элементы
106 // управления, которые не разрешены данному пользователю
107 //
108 function customizePage() {
109         getBaseURLs();
110         showUser(getUserName());
111         hideDeniedOperations();
112 }
113 // Заготовка на будущее
114 function hideDeniedOperations() {
115
116     var user = forumUser;
117         var rights = userStatus;
118         if (user && user.indexOf("http://")==0) {
119                 user=user.substring(7,user.length);
120         }
121         if (rights == "admin") {
122                 // Админу можно все
123                 return;
124         } 
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";
131                 }       
132         }
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";
139                                 }
140                         }       
141                 }
142         }       
143         if (rights == "moderator") {
144                 return;
145         }
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";
153                         } else {
154                                 var inputs = forms[i].getElementsByTagName("input"); 
155                                 var my_item = false;
156                                 for (j=0;j<inputs.length;j++) {
157                                         if (inputs[j].name == "move") {
158                                                 inputs[j].style.visibility="hidden";
159                                         }
160                                 }       
161                                 if (user) {
162                                         for (j=0;j<inputs.length;j++) {
163                                                 if (inputs[j].name == "author") {
164                                                         my_item = inputs[j].value == user;
165                                                         break;
166                                                 }       
167                                         }
168                                 }
169                                 if (!my_item) {
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";
174                                                 }
175                                         }
176                                 }       
177                         } 
178                 }          
179         }       
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";
185                 }       
186                 
187         }       
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";
195                 }               
196         }       
197         return; 
198         }
199         // Убираем операции edit и delete для тех объектов, где юзер не
200         // автор
201
202         
203 }
204
205 //
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=");
212    var id;
213    if (start!=-1) {
214                 start+=3;
215                 var end = linktext.indexOf("&",start);
216                 if (end==-1) end=linktext.length;
217                 id = linktext.substring(start,end);
218    }    
219    var f=document.forms[formName];
220    if (id) {
221       f.elements["id"].value=id;
222    }
223    f.style.display="block";
224    // позиционируем форму под текущей ссылкой.
225    return false;        
226 }
227
228 /**
229 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
230 * если такой существует.
231 */
232 function getXMLHttpRequest()
233 {
234     try {
235         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
236     } catch (e) {
237         try {
238             return new ActiveXObject("Microsoft.XMLHTTP");
239         } catch (E) {
240             if (typeof XMLHttpRequest!='undefined')
241                 return new XMLHttpRequest();
242         }
243     }
244
245     return false;
246 }
247