source: project/release/3/svnwiki-javascript/trunk/svnwiki-javascript.scm @ 14150

Last change on this file since 14150 was 14150, checked in by azul, 11 years ago

Importing Svnwiki JS library.

File size: 5.6 KB
Line 
1(use svnwiki-extensions-support stream-ext srfi-40 html-stream)
2
3(declare (export svnwiki-javascript-show-top-list))
4
5(define *svnwiki-javascript*
6#<<EOF
7svnwikiJavascript = new Object();
8
9svnwikiJavascript.requests = new Array();
10
11svnwikiJavascript.cleanContent = function (element)
12{
13  while (element.hasChildNodes())
14    element.removeChild(element.firstChild);
15  return element;
16}
17
18svnwikiJavascript.makeLink = function ( target, content )
19{
20  var link = svnwikiJavascript.makeElement('A', content);
21  link.setAttribute('href', target);
22  return link;
23}
24
25svnwikiJavascript.makeElement = function (type, content)
26{
27  var elem = document.createElement(type);
28  if (content)
29    elem.appendChild(content);
30  return elem;
31}
32
33svnwikiJavascript.loadXmlDone = function (xmlDoc, proc) {
34  if (xmlDoc.readyState == 4) { // if "loaded"
35    svnwikiJavascript.removeRequest(xmlDoc);
36    if (xmlDoc.status == 200) { // if "OK"
37      proc(xmlDoc.responseXML); // pass DOM
38    } else if (xmlDoc.status >= 400) {
39      alert("There was a problem (status = "+xmlDoc.status+")\nretrieving the XML data:\n" + xmlDoc.statusText);
40    }
41  }
42}
43
44svnwikiJavascript.removeRequest = function (element) {
45  var rd, wr;
46  for (rd = 0, wr = 0; rd < svnwikiJavascript.requests.length; rd ++)
47    if (svnwikiJavascript.requests[rd] != element)
48      svnwikiJavascript.requests[wr ++] = svnwikiJavascript.requests[rd];
49  while (wr < svnwikiJavascript.requests.len)
50    svnwikiJavascript.requests.pop();
51}
52
53svnwikiJavascript.loadXml = function (href, proc, postData) {
54  var xmlDoc;
55
56  if (window.XMLHttpRequest && !(window.ActiveXObject)) {
57    try {
58      xmlDoc = new XMLHttpRequest();
59      xmlDoc.onreadystatechange = function () { svnwikiJavascript.loadXmlDone(xmlDoc, proc); };
60      xmlDoc.open(postData ? "POST" : "GET", href, true);
61      if (postData) {
62        xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
63        xmlDoc.setRequestHeader("Content-length", postData.length);
64        xmlDoc.setRequestHeader("Connection", "close");
65        xmlDoc.send(postData);
66      } else {
67        xmlDoc.send("");
68      }
69    }
70    catch(e) {
71      xmlDoc = false;
72    }
73  }
74
75  if (!xmlDoc && document.implementation && document.implementation.createDocument) {
76    xmlDoc = document.implementation.createDocument("", "", null);
77    xmlDoc.onload = function () { svnwikiJavascript.removeRequest(xmlDoc); proc(xmlDoc) };
78    if (postData) {
79      xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
80      xmlDoc.setRequestHeader("Content-length", data.length);
81      xmlDoc.setRequestHeader("Connection", "close");
82      xmlDoc.send(data);
83    } else {
84      xmlDoc.load(href);
85    }
86  }
87
88  if (!xmlDoc && window.ActiveXObject) {
89    try {
90      xmlDoc = new ActiveXObject("Msxml2.XMLHTTP");
91    }
92    catch(e) {
93      try {
94        xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
95      }
96      catch(e) {
97        xmlDoc = false;
98      }
99    }
100    if (xmlDoc) {
101      xmlDoc.onreadystatechange = function() { svnwikiJavascript.loadXmlDone(xmlDoc, proc); }
102      if (postData) {
103        xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
104        xmlDoc.setRequestHeader("Content-length", data.length);
105        xmlDoc.setRequestHeader("Connection", "close");
106        xmlDoc.send(data);
107      } else {
108        xmlDoc.load(href);
109      }
110    }
111  }
112
113  if (!xmlDoc) {
114    alert('Your browser can\'t handle this script');
115    return;
116  }
117
118  svnwikiJavascript.requests.push(xmlDoc);
119}
120
121svnwikiJavascript.showTopList = function(xmlDoc, objName, desc) {
122  var items = xmlDoc.getElementsByTagName('item');
123  if (!items.length)
124    return;
125
126  var obj = svnwikiJavascript.cleanContent(document.getElementById(objName));
127  obj.appendChild(svnwikiJavascript.makeElement('p', document.createTextNode(desc)));
128  var list = svnwikiJavascript.makeElement('ul');
129  for (var i = 0; i < items.length; i++)
130    {
131      var name = items[i].getAttribute('name');
132      var file = items[i].getAttribute('file');
133      var score = items[i].getAttribute('score');
134
135      var li = svnwikiJavascript.makeElement('li');
136      li.appendChild(svnwikiJavascript.makeLink(file, document.createTextNode(name)));
137      li.appendChild(document.createTextNode(' (' + score + ')'));
138
139      list.appendChild(li);
140    }
141  obj.appendChild(list);
142}
143EOF
144)
145
146(define (start-update-notify env)
147  (let-from-environment env (path-out)
148    (write-file-with-tmp
149      (svnwiki-make-pathname (list "xsvnwiki-helper" "javascript") "javascript")
150      "text/javascript"
151      path-out
152      *svnwiki-javascript*)))
153
154(svnwiki-extension-define 'start-update-notify 'javascript start-update-notify)
155
156(define (html-head-data env)
157  (let-from-environment env (return static-url)
158    (return
159      (html-stream
160        ((script type "text/javascript" src (format #f "~A/xsvnwiki-helper/javascript/javascript" static-url)))))))
161
162(svnwiki-extension-define 'html-head-data 'javascript html-head-data)
163
164(define (svnwiki-javascript-show-top-list env desc top-list-file class)
165  (let-from-environment env (output-format static-url program return path-out-real)
166    (if (eq? output-format 'html)
167      (let ((id (format #f "top-list-~A-~A" class (random 9999999))))
168        (return
169          (html-stream
170            ((div id id class class))
171            ((script type "text/javascript")
172             (format #f "<!--~%if (typeof(svnwikiJavascript.showTopList) == 'function') { svnwikiJavascript.loadXml ('~A/~A/~A', function (x) { svnwikiJavascript.showTopList(x, '~A', '~A'); }); }~%-->"
173                     static-url
174                     (svnwiki-dirname path-out-real)
175                     top-list-file
176                     id
177                     desc)))))
178      stream-null)))
Note: See TracBrowser for help on using the repository browser.