]> www.wagner.pp.ru Git - oss/stilllife.git/blob - templates/basicset/page.js
Call getUserRights and set link class of username link to status.
[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 = value;
18         return decodeURIComponent(value);
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         getBaseURLs();
39         if (!username) {
40                 return ;
41         }
42         userStatus = getUserRights(username);
43         var links=document.getElementsByTagName("a");
44         for (i=0;i<links.length;i++) {
45                 if (links[i].className == "userurl") {
46                         while (links[i].childNodes.length>0) {
47                                 links[i].removeChild(links[i].childNodes[0]);
48                         }       
49                         if (username.substring(0,7) == "http://") {
50                                 links[i].href=username;
51                                 username=username.substring(7,username.length);
52                         } else {
53                                 links[i].href=userListUrl+"/" + username;
54                         }       
55                         links[i].appendChild(document.createTextNode(username));
56                         links[i].className = status;
57                 } else if (links[i].href.substring(0,forumScriptUrl.length)==
58                         forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
59                         while (links[i].childNodes.length>0) {
60                                 links[i].removeChild(links[i].childNodes[0]);
61                         }       
62                         links[i].appendChild(document.createTextNode("Выйти"));
63                         links[i].href=forumScriptUrl+"?logout=1";
64                 }               
65         }       
66 }
67
68 //
69 // Добывает с сервера информацию о модераторах данного форума и
70 // возвращает user, moderator или admin в зависисмости от статуса
71 // указанного пользователя.  
72 //
73 function getUserRights(user) {
74     var status="user";
75     var xhr=getXMLHttpRequest();
76     if(!xhr) return status;
77     
78     var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
79     if(hr==null) return status;
80     var depth=hr[1].split(/\//).length;
81     var re=new RegExp("\n\[\s*(admins|moderators|banned)\s*\]\s*[^[]+\n"+user+"\n","m");
82     for(var path="",i=0;i<depth;path+="../",i++) {
83         xhr.open(GET, path+"perms.txt",false);
84         xhr.send("");
85         if(xhr.status!=200) continue;
86         
87         var perms=("\n"+xhr.responsText+"\n").match(re);
88         if(perms!=null) {
89             if(perms[1]=="banned") return "banned";
90             if(perms[1]=="admins") return "admin";
91             status=="moderator";
92         }
93         
94         xhr.open(GET, path+".forum",false);
95         xhr.send("");
96         if(xhr.status==403 || xhr.status==200) break;
97     }
98     
99     return status;
100 }
101
102 // Обработчик body onLoad
103 //  Пробегается по странице и прячет все элементы
104 // управления, которые не разрешены данному пользователю
105 //
106 function hideDeniedOperations() {
107     var user =getUserName();
108         var rights;
109         if (user) {     
110                 rights = getUserRights;
111         }
112         if (rights == "admin") {
113                 // Админу можно все
114                 return;
115         } else if (rights == "moderator") {
116                 // Убираем только администраторскую функцию setrights
117         } else if (user) {
118             // Убираем модераторские функции move и newforum
119                 
120                 // Пробегаемся по всем репликам и там, где автор != user
121                 // убираем edit и delete
122     } else {
123             // Убираем вообще все, включая reply
124         }        
125         
126 }
127
128 //
129 //  Показывает встроенную в страницу форму под текущей ссылкой
130 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
131 function showForm(link, formName) {
132    var linktext=link.href;
133    // Разобрать параметры, получить значение id
134    var start =linktext.indexOf("id=");
135    var id;
136    if (start!=-1) {
137                 start+=3;
138                 var end = linktext.indexOf("&",start);
139                 if (end==-1) end=linktext.length;
140                 id = linktext.substring(start,end);
141    }    
142    var f=document.forms[formName];
143    if (id) {
144       f.elements["id"].value=id;
145    }
146    f.style.display="block";
147    // позиционируем форму под текущей ссылкой.
148    return false;        
149 }
150
151 /**
152 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
153 * если такой существует.
154 */
155 function getXMLHttpRequest()
156 {
157     try {
158         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
159     } catch (e) {
160         try {
161             return new ActiveXObject("Microsoft.XMLHTTP");
162         } catch (E) {
163             if (typeof XMLHttpRequest!='undefined')
164                 return new XMLHttpRequest();
165         }
166     }
167
168     return false;
169 }
170