]> www.wagner.pp.ru Git - oss/stilllife.git/blob - templates/belstyle/page.js
хГЛЕМЕМХЪ Б ЬЮАКНМЕ
[oss/stilllife.git] / templates / belstyle / 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         // Strip http:// prefix from OpenID url
87         if (user.substring(0,7) == "http://") {
88                 user=user.substring(7,user.length);
89         } 
90     var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
91     if(hr==null) return status;
92     var depth=hr[1].split(/\//).length;
93     var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
94     for(var path="",i=0;i<depth;path+="../",i++) {
95         xhr.open("GET", path+"perms.txt",false);
96         xhr.send("");
97         if(xhr.status!=200) continue;
98         
99         var perms=("\n"+xhr.responseText+"\n").match(re);
100         if(perms!=null) {
101             if(perms[1]=="banned") return "banned";
102             if(perms[1]=="admins") return "admin";
103             status="moderator";
104
105         }
106         
107         xhr.open("GET", path+".forum",false);
108         xhr.send("");
109         if(xhr.status==403 || xhr.status==200) break;
110     }
111     return status;
112 }
113
114 // Обработчик body onLoad
115 //  Пробегается по странице и прячет все элементы
116 // управления, которые не разрешены данному пользователю
117 //
118 function customizePage() {
119         getBaseURLs();
120         showUser(getUserName());
121         hideDeniedOperations();
122 }
123 // Заготовка на будущее
124 function hideDeniedOperations() {
125
126     var user = forumUser;
127         var rights = userStatus;
128         if (user && user.indexOf("http://")==0) {
129                 user=user.substring(7,user.length);
130         }
131         if (rights == "admin") {
132                 // Админу можно все
133                 return;
134         } 
135         var links=document.getElementsByTagName("a");
136         var forms=document.getElementsByTagName("form");
137         // Убираем только администраторскую функцию setrights
138         for (i=0;i<links.length;i++) {
139                 if (links[i].href.indexOf("setrights=") != -1) {
140                         links[i].style.display="none";
141                 }       
142         }
143         for (i=0;i<forms.length;i++) {
144                 if (forms[i].className == "foruminfo") {
145                         var inputs = forms[i].getElementsByTagName("input");
146                         for (j=0;j<inputs.length;j++) {
147                                 if (inputs[j].name == "setrights") {
148                                         inputs[j].style.display="none";
149                                 }
150                         }       
151                 }
152         }       
153         if (rights == "moderator") {
154                 return;
155         }
156         for (i=0;i<forms.length;i++) {
157                 if (forms[i].className == "foruminfo") {
158                         forms[i].style.display="none";
159                 } else if (forms[i].className == "msginfo"||
160                         forms[i].className=="topicinfo") {
161                         if (rights=="banned") {
162                                 forms[i].style.display="none";
163                         } else {
164                                 var inputs = forms[i].getElementsByTagName("input"); 
165                                 var my_item = false;
166                                 for (j=0;j<inputs.length;j++) {
167                                         if (inputs[j].name == "move") {
168                                                 inputs[j].style.display="none";
169                                         }
170                                 }       
171                                 if (user) {
172                                         for (j=0;j<inputs.length;j++) {
173                                                 if (inputs[j].name == "author") {
174                                                         my_item = inputs[j].value == user;
175                                                         break;
176                                                 }       
177                                         }
178                                 }
179                                 if (!my_item) {
180                                         for (j=0;j<inputs.length;j++) {
181                                                 if (inputs[j].name == "edit" ||
182                                                         inputs[j].name == "delete") {
183                                                         inputs[j].style.display="none";
184                                                 }
185                                         }
186                                 }       
187                         } 
188                 }          
189         }       
190         // Убираем все модераторские операции из ссылок
191         for (i=0;i<links.length;i++) {
192                 if (links[i].href.indexOf("newforum=")!=-1 ||
193                                 links[i].href.indexOf("move=")!=-1) {
194                         links[i].style.display="none";
195                 }       
196                 
197         }       
198         if (!forumUser || rights == "banned") {
199         for (i=0;i<links.length;i++) {
200                 if (links[i].href.indexOf("newtopic=")!=-1 ||
201                         links[i].href.indexOf("edit=")!=-1 ||
202                         links[i].href.indexOf("delete=")!=-1||
203                         (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
204                                 links[i].style.display="none";
205                 }               
206         }       
207         return; 
208         }
209         // Убираем операции edit и delete для тех объектов, где юзер не
210         // автор
211
212         
213 }
214
215 //
216 //  Показывает встроенную в страницу форму под текущей ссылкой
217 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
218 function showForm(link, formName) {
219         var id;
220         var action;
221    if (link.form) {
222         link = link.form;
223         id = link.elements["id"].value;
224         action = link.action;
225    } else {     
226         var linktext=link.href;
227         // Разобрать параметры, получить значение id
228         var start =linktext.indexOf("id=");
229         if (start!=-1) {
230                         start+=3;
231                         var end = linktext.indexOf("&",start);
232                         if (end==-1) end=linktext.length;
233                         id = linktext.substring(start,end);
234         }       
235         start=linktext.indexOf("?");
236         action=linktext.substring(0,start);
237    }
238    var block = document.getElementById(formName);
239    var          f       = block.getElementsByTagName("form")[0];
240         f.action=action;
241    if (id) {
242       f.elements["id"].value=id;
243    }
244    window.setTimeout(function() {f.elements["text"].focus();},250);             
245    linktext = document.location.href;
246    var anchor = linktext.indexOf("#");
247    if (anchor!=-1) {
248           linktext=linktext.substring(0,anchor);
249    }    
250    document.location.href=linktext+"#replyform";
251    return false;
252 }
253 function hideForm(formId) {
254         var block = document.getElementById(formId);
255         block.style.display = "none";
256 }
257 /**
258 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
259 * если такой существует.
260 */
261 function getXMLHttpRequest()
262 {
263     try {
264         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
265     } catch (e) {
266         try {
267             return new ActiveXObject("Microsoft.XMLHTTP");
268         } catch (E) {
269             if (typeof XMLHttpRequest!='undefined')
270                 return new XMLHttpRequest();
271         }
272     }
273
274     return false;
275 }
276