1 // Библиотека стандартных функций, используемых на страницах форума
3 // Извлекает из кук имя текущего пользователя и возвращает его, а также
4 // сохраняет в глобальной переменной forumUser;
7 function getUserName() {
8 var cookietext =document.cookie;
9 var pos = cookietext.indexOf("sluser=");
14 var end = cookietext.indexOf(";",start);
15 if (end == -1) end=cookietext.length;
16 var value= cookietext.substring(start,end);
17 forumUser = decodeURIComponent(value);
21 // Шаблон страницы содержит два специальных тэга link с rel=forum-script
22 // и rel=forum-user-list
23 // Эта функция извлекает их в глобальные переменные forumScriptUrl
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;
37 function showUser(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]);
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]);
58 if (username.substring(0,7) == "http://") {
59 links[i].href=username;
60 username=username.substring(7,username.length);
62 links[i].href=userListUrl+"/" + username;
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]);
71 links[i].appendChild(document.createTextNode("Выйти"));
72 links[i].href=forumScriptUrl+"?logout=1";
78 // Добывает с сервера информацию о модераторах данного форума и
79 // возвращает user, moderator или admin в зависисмости от статуса
80 // указанного пользователя.
82 function getUserRights(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);
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);
97 if(xhr.status!=200) continue;
99 var perms=("\n"+xhr.responseText+"\n").match(re);
101 if(perms[1]=="banned") return "banned";
102 if(perms[1]=="admins") return "admin";
107 xhr.open("GET", path+".forum",false);
109 if(xhr.status==403 || xhr.status==200) break;
114 // Обработчик body onLoad
115 // Пробегается по странице и прячет все элементы
116 // управления, которые не разрешены данному пользователю
118 function customizePage() {
120 showUser(getUserName());
121 hideDeniedOperations();
123 // Заготовка на будущее
124 function hideDeniedOperations() {
126 var user = forumUser;
127 var rights = userStatus;
128 if (user && user.indexOf("http://")==0) {
129 user=user.substring(7,user.length);
131 if (rights == "admin") {
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";
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";
153 if (rights == "moderator") {
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";
164 var inputs = forms[i].getElementsByTagName("input");
166 for (j=0;j<inputs.length;j++) {
167 if (inputs[j].name == "move") {
168 inputs[j].style.display="none";
172 for (j=0;j<inputs.length;j++) {
173 if (inputs[j].name == "author") {
174 my_item = inputs[j].value == user;
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";
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";
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";
209 // Убираем операции edit и delete для тех объектов, где юзер не
216 // Показывает встроенную в страницу форму под текущей ссылкой
217 // Использование <a href="forum?operation=1&id=id" // onClick="showform(this,operation)">
218 function showForm(link, formName) {
223 id = link.elements["id"].value;
224 action = link.action;
226 var linktext=link.href;
227 // Разобрать параметры, получить значение id
228 var start =linktext.indexOf("id=");
231 var end = linktext.indexOf("&",start);
232 if (end==-1) end=linktext.length;
233 id = linktext.substring(start,end);
235 start=linktext.indexOf("?");
236 action=linktext.substring(0,start);
238 var block = document.getElementById(formName);
239 var f = block.getElementsByTagName("form")[0];
242 f.elements["id"].value=id;
244 window.setTimeout(function() {f.elements["text"].focus();},250);
245 linktext = document.location.href;
246 var anchor = linktext.indexOf("#");
248 linktext=linktext.substring(0,anchor);
250 document.location.href=linktext+"#replyform";
253 function hideForm(formId) {
254 var block = document.getElementById(formId);
255 block.style.display = "none";
258 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
259 * если такой существует.
261 function getXMLHttpRequest()
264 return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
267 return new ActiveXObject("Microsoft.XMLHTTP");
269 if (typeof XMLHttpRequest!='undefined')
270 return new XMLHttpRequest();