]> www.wagner.pp.ru Git - oss/stilllife.git/blobdiff - templates/belstyle/page.js
хГЛЕМЕМХЪ Б ЬЮАКНМЕ
[oss/stilllife.git] / templates / belstyle / page.js
diff --git a/templates/belstyle/page.js b/templates/belstyle/page.js
new file mode 100644 (file)
index 0000000..f321c31
--- /dev/null
@@ -0,0 +1,276 @@
+// Библиотека стандартных функций, используемых на страницах форума
+//
+// Извлекает из кук имя текущего пользователя и возвращает его, а также
+// сохраняет в глобальной переменной forumUser;
+var forumUser;
+var userStatus;
+function getUserName() {
+       var cookietext =document.cookie;
+       var pos = cookietext.indexOf("sluser=");
+       if (pos == -1)  {
+               return undefined;
+       }
+       var start = pos+7;
+       var end = cookietext.indexOf(";",start);
+       if (end == -1) end=cookietext.length;
+       var value= cookietext.substring(start,end);
+       forumUser = decodeURIComponent(value);
+       return forumUser;
+}
+//
+// Шаблон страницы содержит два специальных тэга link с rel=forum-script
+// и rel=forum-user-list
+// Эта функция извлекает их в глобальные переменные forumScriptUrl
+// и userListUrl;
+var forumScriptUrl;
+var userListUrl;
+function getBaseURLs() {
+       var links=document.getElementsByTagName("link");
+       for (i=0;i<links.length;i++) {
+               if (links[i].rel == "forum-script") {
+                       forumScriptUrl = links[i].href;
+               } else if (links[i].rel == "forum-user-list") {
+                       userListUrl = links[i].href;
+               }
+       }       
+}
+function showUser(username) {
+       if (!username) {
+               // Прячем ссылку на профиль 
+               var links=document.getElementsByTagName("a");
+               for (i=0;i<links.length;i++) {
+                       if (links[i].href.substring(0,forumScriptUrl.length)==
+                       forumScriptUrl && links[i].href.indexOf("profile=")!=-1) {
+                               while (links[i].childNodes.length>0) {
+                                       links[i].removeChild(links[i].childNodes[0]);
+                               }       
+                       }       
+               }
+               return ;
+       }
+       userStatus = getUserRights(username);
+       var links=document.getElementsByTagName("a");
+       for (i=0;i<links.length;i++) {
+               if (links[i].className == "userurl") {
+                       while (links[i].childNodes.length>0) {
+                               links[i].removeChild(links[i].childNodes[0]);
+                       }       
+                       if (username.substring(0,7) == "http://") {
+                               links[i].href=username;
+                               username=username.substring(7,username.length);
+                       } else {
+                               links[i].href=userListUrl+"/" + username;
+                       }       
+                       links[i].appendChild(document.createTextNode(username));
+                       links[i].className = userStatus;
+               } else if (links[i].href.substring(0,forumScriptUrl.length)==
+                       forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
+                       while (links[i].childNodes.length>0) {
+                               links[i].removeChild(links[i].childNodes[0]);
+                       }       
+                       links[i].appendChild(document.createTextNode("Выйти"));
+                       links[i].href=forumScriptUrl+"?logout=1";
+               }               
+       }       
+}
+
+//
+// Добывает с сервера информацию о модераторах данного форума и
+// возвращает user, moderator или admin в зависисмости от статуса
+// указанного пользователя.  
+//
+function getUserRights(user) {
+    var status="user";
+    var xhr=getXMLHttpRequest();
+    if(!xhr) return status;
+       // Strip http:// prefix from OpenID url
+       if (user.substring(0,7) == "http://") {
+               user=user.substring(7,user.length);
+       } 
+    var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
+    if(hr==null) return status;
+    var depth=hr[1].split(/\//).length;
+    var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
+    for(var path="",i=0;i<depth;path+="../",i++) {
+       xhr.open("GET", path+"perms.txt",false);
+       xhr.send("");
+       if(xhr.status!=200) continue;
+       
+       var perms=("\n"+xhr.responseText+"\n").match(re);
+       if(perms!=null) {
+           if(perms[1]=="banned") return "banned";
+           if(perms[1]=="admins") return "admin";
+           status="moderator";
+
+       }
+       
+       xhr.open("GET", path+".forum",false);
+       xhr.send("");
+       if(xhr.status==403 || xhr.status==200) break;
+    }
+    return status;
+}
+
+// Обработчик body onLoad
+//  Пробегается по странице и прячет все элементы
+// управления, которые не разрешены данному пользователю
+//
+function customizePage() {
+       getBaseURLs();
+       showUser(getUserName());
+       hideDeniedOperations();
+}
+// Заготовка на будущее
+function hideDeniedOperations() {
+
+    var user = forumUser;
+       var rights = userStatus;
+       if (user && user.indexOf("http://")==0) {
+               user=user.substring(7,user.length);
+       }
+       if (rights == "admin") {
+               // Админу можно все
+               return;
+       } 
+       var links=document.getElementsByTagName("a");
+       var forms=document.getElementsByTagName("form");
+       // Убираем только администраторскую функцию setrights
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("setrights=") != -1) {
+                       links[i].style.display="none";
+               }       
+       }
+       for (i=0;i<forms.length;i++) {
+               if (forms[i].className == "foruminfo") {
+                       var inputs = forms[i].getElementsByTagName("input");
+                       for (j=0;j<inputs.length;j++) {
+                               if (inputs[j].name == "setrights") {
+                                       inputs[j].style.display="none";
+                               }
+                       }       
+               }
+       }       
+       if (rights == "moderator") {
+               return;
+       }
+       for (i=0;i<forms.length;i++) {
+               if (forms[i].className == "foruminfo") {
+                       forms[i].style.display="none";
+               } else if (forms[i].className == "msginfo"||
+                       forms[i].className=="topicinfo") {
+                       if (rights=="banned") {
+                               forms[i].style.display="none";
+                       } else {
+                               var inputs = forms[i].getElementsByTagName("input"); 
+                               var my_item = false;
+                               for (j=0;j<inputs.length;j++) {
+                                       if (inputs[j].name == "move") {
+                                               inputs[j].style.display="none";
+                                       }
+                               }       
+                               if (user) {
+                                       for (j=0;j<inputs.length;j++) {
+                                               if (inputs[j].name == "author") {
+                                                       my_item = inputs[j].value == user;
+                                                       break;
+                                               }       
+                                       }
+                               }
+                               if (!my_item) {
+                                       for (j=0;j<inputs.length;j++) {
+                                               if (inputs[j].name == "edit" ||
+                                                       inputs[j].name == "delete") {
+                                                       inputs[j].style.display="none";
+                                               }
+                                       }
+                               }       
+                       } 
+               }          
+       }       
+       // Убираем все модераторские операции из ссылок
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("newforum=")!=-1 ||
+                               links[i].href.indexOf("move=")!=-1) {
+                       links[i].style.display="none";
+               }       
+               
+       }       
+       if (!forumUser || rights == "banned") {
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("newtopic=")!=-1 ||
+                       links[i].href.indexOf("edit=")!=-1 ||
+                       links[i].href.indexOf("delete=")!=-1||
+                       (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
+                               links[i].style.display="none";
+               }               
+       }       
+       return; 
+       }
+       // Убираем операции edit и delete для тех объектов, где юзер не
+       // автор
+
+       
+}
+
+//
+//  Показывает встроенную в страницу форму под текущей ссылкой
+//  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
+function showForm(link, formName) {
+       var id;
+       var action;
+   if (link.form) {
+       link = link.form;
+       id = link.elements["id"].value;
+       action = link.action;
+   } else {    
+       var linktext=link.href;
+       // Разобрать параметры, получить значение id
+       var start =linktext.indexOf("id=");
+       if (start!=-1) {
+                       start+=3;
+                       var end = linktext.indexOf("&",start);
+                       if (end==-1) end=linktext.length;
+                       id = linktext.substring(start,end);
+       }       
+       start=linktext.indexOf("?");
+       action=linktext.substring(0,start);
+   }
+   var block = document.getElementById(formName);
+   var         f       = block.getElementsByTagName("form")[0];
+       f.action=action;
+   if (id) {
+      f.elements["id"].value=id;
+   }
+   window.setTimeout(function() {f.elements["text"].focus();},250);            
+   linktext = document.location.href;
+   var anchor = linktext.indexOf("#");
+   if (anchor!=-1) {
+         linktext=linktext.substring(0,anchor);
+   }   
+   document.location.href=linktext+"#replyform";
+   return false;
+}
+function hideForm(formId) {
+       var block = document.getElementById(formId);
+       block.style.display = "none";
+}
+/**
+* Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
+* если такой существует.
+*/
+function getXMLHttpRequest()
+{
+    try {
+        return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+    } catch (e) {
+        try {
+            return new ActiveXObject("Microsoft.XMLHTTP");
+        } catch (E) {
+           if (typeof XMLHttpRequest!='undefined')
+               return new XMLHttpRequest();
+        }
+    }
+
+    return false;
+}
+