source: main/trunk/greenstone2/macros/style.dm@ 27310

Last change on this file since 27310 was 27310, checked in by ak19, 11 years ago

Forgot to remove some debug alert box statements.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1# this file must be UTF-8 encoded
2#######################################################################
3# PAGE STYLES
4#######################################################################
5
6package Style
7
8# to use this style system output
9# _header_
10# all your page content, then
11# _footer_
12
13# use the page parameter 'style' to choose the appropriate style
14
15# Current values: "html" and "xhtml"
16_compliance_ {html}
17
18# the style system uses
19# _pagetitle_ - what gets displayed at the top of the browser window
20# _pagescriptextra_ - any extra javascript you want included in the header
21# _pagebannerextra_ - anything extra you want displayed in the page banner
22# _pagefooterextra_ - anything extra you want displayed in the footer
23
24# defaults for the above macros
25_pagetitle_ {_collectionname_}
26_pagescriptfileextra_ {}
27_pagescriptextra_ {}
28_pagebannerextra_ {}
29_pagefooterextra_ {}
30
31# collection specific style and script may be set in collection's extra.dm
32# using the following macros
33_collectionspecificstyle_ {}
34_collectionspecificscript_ {}
35
36# it also relies on lots of Globals, the most important of these are:
37# _cookie_ - put in the cgi header
38# _globalscripts_ - javascript stuff
39# _imagecollection_
40# _imagehome_
41# _imagehelp_
42# _imagepref_
43# _imagethispage_ (this is now not an image, but text. should be renamed?)
44# _linkotherversion_
45
46# _httpiconchalk_ - the image down the left of the page - is now done
47# by the style sheet.
48
49_header_ {_cgihead_
50_htmlhead_(class="bgimage")_startspacer__pagebanner_
51}
52
53_header_[v=1] {_cgihead_
54_htmlhead__pagebanner_
55}
56
57# _cgihead_ {Content-type: text/html
58# _cookie_
59#
60# }
61_cgihead_{}
62
63
64# any declarations relating to CSS that should go in the html head part.
65# declarations containing images are done here so the path is correct
66# at runtime.
67
68_csslink_{
69 <link rel="stylesheet" href="_cssfilelink_" type="text/css"
70 title="Greenstone Style" charset="UTF-8" _linktagend_
71 <link rel="alternate stylesheet" href="_httpstyle_/style-print.css"
72 type="text/css" title="Printer" charset="UTF-8" media="print, screen" _linktagend_
73 <link rel="stylesheet" href="_httpstyle_/style-print.css" type="text/css"
74 title="Printer" charset="UTF-8" media="print" _linktagend_
75 _cssfilelinkextra_
76}
77
78_cssheader_ {
79_csslink_
80<style type="text/css">
81body.bgimage \{ background: url("_httpimages_/chalk.gif") scroll repeat-y left top; \}
82div.navbar \{ background-image: url("_httpimages_/bg_green.png"); \}
83div.divbar \{ background-image: url("_httpimages_/bg_green.png"); \}
84a.navlink \{ background-image: url("_httpimages_/bg_off.png"); \}
85a.navlink_sel \{ background-image: url("_httpimages_/bg_green.png"); \}
86a.navlink:hover \{ background-image: url("_httpimages_/bg_on.png"); \}
87p.bannertitle \{background-image: url("_httpimages_/banner_bg.png"); \}
88p.collectiontitle \{background-image: url("_httpimages_/banner_bg.png"); \}
89</style>
90_collectionspecificstyle_
91
92}
93
94# separate macro so it can be easily overridden for customised collections
95_cssfilelink_ {_httpstyle_/style.css}
96
97# separate macro so additional stylesheets (to those included by default) can be specified
98_cssfilelinkextra_ {}
99
100# Languages that should be displayed right-to-left
101_htmlextra_ [l=ar] { dir=rtl }
102_htmlextra_ [l=fa] { dir=rtl }
103_htmlextra_ [l=he] { dir=rtl }
104_htmlextra_ [l=ur] { dir=rtl }
105_htmlextra_ [l=ps] { dir=rtl }
106_htmlextra_ [l=prs] { dir=rtl }
107
108# htmlhead uses:
109# _1_ - extra parameters for the body tag
110# _pagetitle_
111# _globalscripts_
112_htmlhead_ {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
113"http://www.w3.org/TR/html4/loose.dtd">
114
115<html_htmlextra_>
116<head>
117<title>_pagetitle_</title>
118<meta name="_status:textversion_" content="_versionnum_" _metatagend_
119_globalscripts_
120_cssheader_
121_document:documentheader_
122</head>
123
124<body _1_>
125}
126
127# Link and meta tags must be closed differently for HTML/XHTML validation
128_linktagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
129_metatagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
130
131_spacerwidth_ {65}
132
133# _startspacer_ is a spacer that gives pages a left-hand margin.
134# It must eventually be closed by _endspacer_.
135_startspacer_ {
136<div id="page">
137}
138
139# If you want to move the home/help/pref buttons, override this to be empty
140# and then explicitly include _globallinks_ somewhere else
141# on the page
142_optgloballinks_ {_globallinks_}
143
144# _bannertitle_ is defined in nav_css/ns4.dm, and is either text or
145# a banner image
146_pagebanner_ {
147<!-- page banner (\_style:pagebanner\_) -->
148<div id="banner">
149<div class="pageinfo">
150<p class="bannerlinks">_optgloballinks_</p>
151_bannertitle_
152</div>
153<div class="collectimage">_imagecollection_</div>
154</div>
155<div class="bannerextra">_pagebannerextra_</div>
156<!-- end of page banner -->
157_If_("_activateweb20_" eq "2",
158 _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
159)
160}
161
162_pagebanner_[v=1] {
163<!-- page banner - text version [v=1] (\_style:pagebanner\_) -->
164<center><h2><b><u>_imagecollection_</u></b></h2></center><p>
165_optgloballinks_
166_pagebannerextra_
167<p>
168<!-- end of page banner -->
169_If_("_activateweb20_" eq "2",
170 _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
171)
172}
173
174# note we no longer close off one of the startspacer tables here!!
175_footer_ {
176_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
177<!-- page footer (\_style:footer\_) -->
178_pagefooterextra__endspacer__htmlfooter_
179}
180
181# v=1 footer: not using startspacer in the header, so dont put it in the footer
182_footer_ [v=1]{
183_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
184<!-- page footer [v=1] (\_style:footer\_) -->
185_pagefooterextra_
186_htmlfooter_
187}
188
189# close off anything opened by startspacer
190_endspacer_ {
191</div> <!-- id=page -->
192}
193
194
195_htmlfooter_ {
196</body>
197</html>
198}
199
200_loginscript_ {
201 function appendUsernameArgs(id,addOn)
202 \{
203 var a=document.getElementById(id);
204 var url = a.getAttribute("href");
205 if (url == "") \{
206 url = document.location.toString();
207 \}
208
209 //alert("url before = " + url);
210
211 // clear out any earlier user name/authentication values
212 url = url.replace(/(&|\\\\?)uan=\\d\{0,1\}/g,"");
213 url = url.replace(/(&|\\\\?)un=[a-z0-9:\\-]*/g,"");
214 url = url.replace(/(&|\\\\?)pw=[a-z0-9:\\-]*/g,"");
215
216 //alert("url after = " + url);
217
218 var gwcgi = "_gwcgi_";
219
220 var tailUrl = url.substr(url.length-gwcgi.length);
221
222 url += (tailUrl == "_gwcgi_") ? "?" : "&";
223 url += addOn;
224
225 //alert("url with add on = " + url);
226
227 a.setAttribute("href",url);
228 \}
229}
230
231
232# imagescript only used in nav_ns4.dm
233_globalscripts_{
234 <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
235
236 <script language="javascript" type="text/javascript">
237 function gsdefined(val)
238 \{
239 return (typeof(val) != "undefined");
240 \}
241
242 var gsapi = new GSAjaxAPI("_gwcgi_","_cgiargc_");
243
244 // http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss
245 // Call as: alert(timestamp.printTime());
246 function formatTime(timestamp) \{
247 var int_timestamp = parseInt(timestamp, 10); // don't forget the second param
248 var date = new Date(int_timestamp);
249 return date.toLocaleDateString() + " " + date.toLocaleTimeString();
250 \}
251
252 function loadUserComments() \{
253
254 // don't bother loading comments if we're not on a document page (in which case there's no usercommentdiv)
255 var usercommentdiv = document.getElementById("usercomments");
256 if(usercommentdiv == undefined || usercommentdiv == null) \{
257 return;
258 \}
259
260 // else, if we have a usercommentdiv, we would have a docid. Get toplevel section of the docid
261 var doc_id = "_cgiargd_"; //escape("_cgiargd_");
262 var period = doc_id.indexOf(".");
263 if(period != -1) \{
264 doc_id = doc_id.substring(0, period);
265 \}
266
267 var metapos=0; // counter variable
268 var username = null;
269 var timestamp = null;
270 var comment = null;
271
272 var comments_arraymap = []; // array of comment records with timestamp, username and comment fields
273
274 // First retrieve all the usercomments (usernames, associated usertimestamps and usercomments)
275 // from the archives folder, where it is arranged easier than in index because it's in sequence already.
276
277 username = gsapi.getDocumentMetadata(doc_id, "username", metapos);
278
279 // Keep looping, retrieving username, comment and timestamp
280 // Store each triplet in the comments array. Stop when there's no further usernames in archives
281
282 while(username) \{ //&& !username.indexOf("ERROR") == -1) \{
283
284 var errorIndex = username.indexOf("ERROR");
285 if(errorIndex != -1) \{
286 var endIndex = username.indexOf("(");
287 var error = username.substring(errorIndex,endIndex);
288 var errormessage=document.createTextNode("Error retrieving comments. " + error);
289 usercommentdiv.appendChild(errormessage);
290 //alert(username);
291 break;
292 \}
293
294 timestamp = gsapi.getDocumentMetadata(doc_id, "usertimestamp", metapos);
295 comment = gsapi.getDocumentMetadata(doc_id, "usercomment", metapos);
296
297 //alert("username: " + username + "\\ntime: " + timestamp + "\\ncomment: " + comment);
298
299 // array of records (arraymap)
300 // http://stackoverflow.com/questions/8190658/sorting-objects-in-a-javascript-array-by-a-key-value
301 // http://stackoverflow.com/questions/4969121/in-javascript-is-there-an-easy-way-to-sort-key-value-pairs-by-the-value-and-re
302 // http://stackoverflow.com/questions/6298169/how-to-create-a-map-object-in-a-javascript
303
304 // object with member vars t, u and c.
305 var comment_record = \{
306 t: timestamp,
307 u: username,
308 c: comment
309 \};
310
311 comments_arraymap.push(comment_record);
312
313 metapos++;
314 username = gsapi.getDocumentMetadata(doc_id, "username", metapos);
315 \}
316
317 // No need to sort by time,
318 // as the array is already stored sorted and hence retrieved in the right order by using metapos counter
319 // If sorting the array of comment records, which would be by timestamp, see
320 // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
321
322 //comments_arraymap.sort(function(rec1, rec2) \{
323 // return rec1.t-rec2.t; // sort by timestamp
324 //\});
325
326 //alert("Found " + metapos + " number of comments in the archives folder for doc " + doc_id);
327
328 // create the output HTML for all comments in one go now
329 // (we do this here for all values together to hopefully avoid reloading the page for each comment)
330
331 if(metapos > 0) \{
332 var heading=document.createElement("div");
333 var attr=document.createAttribute("class");
334 attr.nodeValue="usercommentheading";
335 heading.setAttributeNode(attr);
336 var txt=document.createTextNode("_text-usercomments-section_");
337 heading.appendChild(txt);
338 usercommentdiv.appendChild(heading);
339 \}
340
341 for(var i = 0; i < metapos; i++) \{
342 var comment_record = comments_arraymap[i];
343
344 username = comment_record.u;
345 timestamp = comment_record.t;
346 comment = comment_record.c;
347
348 // for each usercomment, create a child div with the username, timestamp and comment
349 displayInUserCommentList(usercommentdiv, username, timestamp, comment);
350 \}
351
352
353 \}
354
355 function displayInUserCommentList(usercommentdiv, username, timestamp, comment) \{
356
357 var divgroup=document.createElement("div");
358 var attr=document.createAttribute("class");
359 attr.nodeValue="usercomment";
360 divgroup.setAttributeNode(attr);
361
362 var divuser=document.createElement("div");
363 var divtime=document.createElement("div");
364 var divcomment=document.createElement("div");
365
366
367 divgroup.appendChild(divuser);
368 var txt=document.createTextNode(username);
369 divuser.appendChild(txt);
370
371 divgroup.appendChild(divtime);
372 txt=document.createTextNode(formatTime(timestamp)); // format timestamp for date/time display
373 divtime.appendChild(txt);
374
375 divgroup.appendChild(divcomment);
376 txt=document.createTextNode(comment);
377 divcomment.appendChild(txt);
378
379 usercommentdiv.appendChild(divgroup);
380
381 \}
382
383 // http://stackoverflow.com/questions/807878/javascript-that-executes-after-page-load
384 // ensure we don't replace any other onLoad() functions, but append the loadUserComments()
385 // function to the existing onLoad handlers
386
387 if(window.onload) {\
388 var curronload = window.onload;
389 var newonload = function() {\
390 curronload();
391 loadUserComments();
392 \};
393 window.onload = newonload;
394 \} else {\
395 window.onload = loadUserComments;
396 \}
397 </script>
398
399_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
400
401_If_("_activateweb20_" eq "2",
402 _If_("_activateseaweed_" eq "1",_seaweedscript_)
403 _If_("_activatetalkback_" eq "1",_talkbackscript_)
404)
405_If_(_pagescriptfileextra_,_pagescriptfileextra_)
406<script language="javascript" type="text/javascript">
407_loginscript_
408_If_(_pagescriptextra_,_pagescriptextra_)
409_collectionspecificscript_
410_imagescript_
411</script>
412}
413
414_globalscripts_ [v=1] {
415
416_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
417
418_If_("_activateweb20_" eq "2",
419 <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
420 _If_("_activateseaweed_" eq "1",_seaweedscript_)
421 _If_("_activatetalkback_" eq "1",_talkbackscript_)
422)
423_If_(_pagescriptfileextra_,_pagescriptfileextra_)
424<script language="javascript" type="text/javascript">
425<!--
426_loginscript_
427_If_(_cgiargx_,_scriptdetach_)
428_If_(_pagescriptextra_,_pagescriptextra_)
429_collectionspecificscript_
430// -->
431</script>
432}
433
434_scriptdetach_ {
435 function close\_detach() \{
436 close();
437 \}
438}
439
440
441_jqueryScriptAndStyle_ {
442<link type="text/css" href="_httpstyle_/max-video/jquery-ui-1.8.4.custom.css" rel="stylesheet" />
443<script type="text/javascript" src="_httpscript_/jquery-1.4.2.min.js"></script>
444<script type="text/javascript" src="_httpscript_/jquery-ui-1.8.4.custom.min.js"></script>
445}
446
Note: See TracBrowser for help on using the repository browser.