]> www.wagner.pp.ru Git - oss/stilllife.git/blob - templates/basicset/page.js
9eca966bb8ceaa642ba95ef0d49abc71d644312e
[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         xhr.open("GET", path+".forum",false);
98         xhr.send("");
99         if(xhr.status==403 || xhr.status==200) break;
100     }
101     
102     return status;
103 }
104
105 // Обработчик body onLoad
106 //  Пробегается по странице и прячет все элементы
107 // управления, которые не разрешены данному пользователю
108 //
109 function hideDeniedOperations() {
110     var user =getUserName();
111         var rights;
112         if (user) {     
113                 rights = getUserRights;
114         }
115         if (rights == "admin") {
116                 // Админу можно все
117                 return;
118         } else if (rights == "moderator") {
119                 // Убираем только администраторскую функцию setrights
120         } else if (user) {
121             // Убираем модераторские функции move и newforum
122                 
123                 // Пробегаемся по всем репликам и там, где автор != user
124                 // убираем edit и delete
125     } else {
126             // Убираем вообще все, включая reply
127         }        
128         
129 }
130
131 //
132 //  Показывает встроенную в страницу форму под текущей ссылкой
133 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
134 function showForm(link, formName) {
135    var linktext=link.href;
136    // Разобрать параметры, получить значение id
137    var start =linktext.indexOf("id=");
138    var id;
139    if (start!=-1) {
140                 start+=3;
141                 var end = linktext.indexOf("&",start);
142                 if (end==-1) end=linktext.length;
143                 id = linktext.substring(start,end);
144    }    
145    var f=document.forms[formName];
146    if (id) {
147       f.elements["id"].value=id;
148    }
149    f.style.display="block";
150    // позиционируем форму под текущей ссылкой.
151    return false;        
152 }
153
154 /**
155 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
156 * если такой существует.
157 */
158 function getXMLHttpRequest()
159 {
160     try {
161         return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
162     } catch (e) {
163         try {
164             return new ActiveXObject("Microsoft.XMLHTTP");
165         } catch (E) {
166             if (typeof XMLHttpRequest!='undefined')
167                 return new XMLHttpRequest();
168         }
169     }
170
171     return false;
172 }
173