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

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

Fixes. Add a svnwikiJavascript.queryStringInit function that will populate a svnwikiJavascript.queryString ojbect.

File size: 6.3 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}
143
144svnwikiJavascript.queryStringInit = function () {
145  if (svnwikiJavascript.queryString != null)
146    return;
147  var qstr = location.search.substring(1).split('&');
148  for (i in qstr) {
149    var namePos = qstr[i].indexOf("=");
150    var name, value;
151    if (namePos == -1) {
152      name = qstr[i];
153      value = '';
154    } else {
155      name = qstr[i].substring(0, namePos);
156      value = qstr[i].substring(namePos + 1);
157    }
158    name = decodeURIComponent(name);
159    value = decodeURIComponent(value);
160    if (svnwikiJavascript.query_string[name] == null)
161      svnwikiJavascript.query_string[name] = [];
162    svnwikiJavascript.query_string[name].push(value);
163  }
164}
165EOF
166)
167
168(define (start-update-notify env)
169  (let-from-environment env (path-out)
170    (write-file-with-tmp
171      (svnwiki-make-pathname (list "xsvnwiki-helper" "javascript") "javascript")
172      "text/javascript"
173      path-out
174      *svnwiki-javascript*)))
175
176(svnwiki-extension-define 'start-update-notify 'javascript start-update-notify)
177
178(define (html-head-data env)
179  (let-from-environment env (return static-url)
180    (return
181      (html-stream
182        ((script type "text/javascript" src (format #f "~A/xsvnwiki-helper/javascript/javascript" static-url)))))))
183
184(svnwiki-extension-define 'html-head-data 'javascript html-head-data)
185
186(define (svnwiki-javascript-show-top-list env desc top-list-file class)
187  (let-from-environment env (output-format static-url program return path-out-real)
188    (if (eq? output-format 'html)
189      (let ((id (format #f "top-list-~A-~A" class (random 9999999))))
190        (return
191          (html-stream
192            ((div id id class class))
193            ((script type "text/javascript")
194             (format #f "<!--~%if (typeof(svnwikiJavascript.showTopList) == 'function') { svnwikiJavascript.loadXml ('~A/~A/~A', function (x) { svnwikiJavascript.showTopList(x, '~A', '~A'); }); }~%-->"
195                     static-url
196                     (svnwiki-dirname path-out-real)
197                     top-list-file
198                     id
199                     desc)))))
200      stream-null)))
Note: See TracBrowser for help on using the repository browser.