]> www.wagner.pp.ru Git - oss/stilllife.git/blob - templates/basicset/page.js
89fc24345733ddc2d4d15e71f137646ce6ecc61e
[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 = userStatus;
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         // Strip http:// prefix from OpenID url
78         if (user.substring(0,7) == "http://") {
79                 user=user.substring(7,user.length);
80         } 
81     var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
82     if(hr==null) return status;
83     var depth=hr[1].split(/\//).length;
84     var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
85     for(var path="",i=0;i<depth;path+="../",i++) {
86         xhr.open("GET", path+"perms.txt",false);
87         xhr.send("");
88         if(xhr.status!=200) continue;
89         
90         var perms=("\n"+xhr.responseText+"\n").match(re);
91         if(perms!=null) {
92             if(perms[1]=="banned") return "banned";
93             if(perms[1]=="admins") return "admin";
94             status="moderator";
95
96         }
97         
98         xhr.open("GET", path+".forum",false);
99         xhr.send("");
100         if(xhr.status==403 || xhr.status==200) break;
101     }
102     return status;
103 }
104
105 // Обработчик body onLoad
106 //  Пробегается по странице и прячет все элементы
107 // управления, которые не разрешены данному пользователю
108 //
109 function customizePage() {
110         showUser(getUserName());
111 }
112 // Заготовка на будущее
113 function hideDeniedOperations() {
114
115     var user =getUserName();
116         var rights;
117         if (user) {     
118                 rights = getUserRights;
119         }
120         if (rights == "admin") {
121                 // Админу можно все
122                 return;
123         } else if (rights == "moderator") {
124                 // Убираем только администраторскую функцию setrights
125         } else if (user) {
126             // Убираем модераторские функции move и newforum
127                 
128                 // Пробегаемся по всем репликам и там, где автор != user
129                 // убираем edit и delete
130     } else {
131             // Убираем вообще все, включая reply
132         }        
133         
134 }
135
136 //
137 //  Показывает встроенную в страницу форму под текущей ссылкой
138 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
139 function showForm(link, formName) {
140    var linktext=link.href;
141    // Разобрать параметры, получить значение id
142    var start =linktext.indexOf("id=");
143    var id;
144    if (start!=-1) {
145                 start+=3;
146                 var end = linktext.indexOf("&",start);
147                 if (end==-1) end=linktext.length;
148                 id = linktext.substring(start,end);
149    }    
150    var f=document.forms[formName];
151    if (id) {
152       f.elements["id"].value=id;
153    }
154    f.style.display="block";
155    // позиционируем форму под текущей ссылкой.
156    return false;        
157 }
158
159 /**
160 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
161 * если такой существует.
162 */
163 function getXMLHttpRequest()
164 {
165     try {
166         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
167     } catch (e) {
168         try {
169             return new ActiveXObject("Microsoft.XMLHTTP");
170         } catch (E) {
171             if (typeof XMLHttpRequest!='undefined')
172                 return new XMLHttpRequest();
173         }
174     }
175
176     return false;
177 }
178