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

Last change on this file since 28482 was 27786, checked in by kjdon, 11 years ago

the name att of a meta tag must be a single token. So lets use a static name rather than language specific name

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.7 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="Greenstone_version_number" 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 un = "_cgiargun_";
243 var ky = "_cgiargky_";
244 var gsapi = new GSAjaxAPI("_gwcgi_","_cgiargc_","_cgiargun_","_cgiargky_");
245
246 // http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss
247 // Call as: alert(timestamp.printTime());
248 function formatTime(timestamp) \{
249 var int_timestamp = parseInt(timestamp, 10); // don't forget the second param
250 var date = new Date(int_timestamp);
251 return date.toLocaleDateString() + " " + date.toLocaleTimeString();
252 \}
253
254 function loadUserComments() \{
255
256 // don't bother loading comments if we're not on a document page (in which case there's no usercommentdiv)
257 var usercommentdiv = document.getElementById("usercomments");
258 if(usercommentdiv == undefined || usercommentdiv == null) \{
259 return;
260 \}
261
262 // else, if we have a usercommentdiv, we would have a docid. Get toplevel section of the docid
263 var doc_id = "_cgiargd_"; //escape("_cgiargd_");
264 var period = doc_id.indexOf(".");
265 if(period != -1) \{
266 doc_id = doc_id.substring(0, period);
267 \}
268
269 var username_rec = \{
270 metaname: "username",
271 metapos: "all"
272 \};
273
274 var timestamp_rec = \{
275 metaname: "usertimestamp",
276 metapos: "all"
277 \};
278
279 var comment_rec = \{
280 metaname: "usercomment",
281 metapos: "all"
282 \};
283
284 var doc_rec = \{
285 docid: doc_id,
286 metatable: [username_rec, timestamp_rec, comment_rec]
287 \};
288
289 var docArray = [doc_rec];
290 //alert(JSON.stringify(docArray));
291
292 var json_result_str = gsapi.getMetadataArray(docArray, "index");
293// alert(json_result_str);
294 var result = JSON.parse(json_result_str);
295 // result contains only one docrec (result[0]), since we asked for the usercomments of one docid
296 var metatable = result[0].metatable;
297// alert(JSON.stringify(metatable));
298
299 var i = 0;
300 var looping = true;
301 var print_heading = true;
302
303 // metatable[0] = list of usernames, metatable[1] = list of timestamps, metatable[2] = list of comments
304 // the 3 lists/arrays should be of even length. Assuming this, loop as long as there's another username
305 while(looping) \{
306 var metaval_rec = metatable[0].metavals[i];
307 if(metaval_rec == undefined) \{
308 looping = false;
309 \}
310 else \{
311
312 if(print_heading) \{
313 var heading=document.createElement("div");
314 var attr=document.createAttribute("class");
315 attr.nodeValue="usercommentheading";
316 heading.setAttributeNode(attr);
317 var txt=document.createTextNode("_text-usercomments-section_");
318 heading.appendChild(txt);
319 usercommentdiv.appendChild(heading);
320
321 print_heading = false;
322 \}
323
324 var username = metaval_rec.metavalue;
325 var timestamp = metatable[1].metavals[i].metavalue;
326 var comment = metatable[2].metavals[i].metavalue;
327
328 //alert("Comment: " + username + " " + timestamp + " " + comment);
329
330 // No need to sort by time, as the meta are already stored sorted
331 // and hence retrieved in the right order by using the i (metapos) counter
332 // If sorting the array of comment records, which would be by timestamp, see
333 // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
334
335 // for each usercomment, create a child div with the username, timestamp and comment
336 displayInUserCommentList(usercommentdiv, username, timestamp, comment);
337
338 i++;
339 \}
340 \}
341
342 \}
343
344
345 function displayInUserCommentList(usercommentdiv, username, timestamp, comment) \{
346
347 var divgroup=document.createElement("div");
348 var attr=document.createAttribute("class");
349 attr.nodeValue="usercomment";
350 divgroup.setAttributeNode(attr);
351
352 var divuser=document.createElement("div");
353 var divtime=document.createElement("div");
354 var divcomment=document.createElement("div");
355
356
357 divgroup.appendChild(divuser);
358 var txt=document.createTextNode(username);
359 divuser.appendChild(txt);
360
361 divgroup.appendChild(divtime);
362 txt=document.createTextNode(formatTime(timestamp)); // format timestamp for date/time display
363 divtime.appendChild(txt);
364
365 // any quotes and colons in the fields would have been protected for transmitting as JSON
366 // so decode their entity values
367 comment = comment.replace(/&quot;/gmi, '"');
368 comment = comment.replace(/&58;/gmi, ':');
369
370 divgroup.appendChild(divcomment);
371 txt=document.createTextNode(comment);
372 divcomment.appendChild(txt);
373
374 usercommentdiv.appendChild(divgroup);
375
376 \}
377
378 // http://stackoverflow.com/questions/807878/javascript-that-executes-after-page-load
379 // ensure we don't replace any other onLoad() functions, but append the loadUserComments()
380 // function to the existing onLoad handlers
381
382 if(window.onload) {\
383 var curronload = window.onload;
384 var newonload = function() {\
385 curronload();
386 loadUserComments();
387 \};
388 window.onload = newonload;
389 \} else {\
390 window.onload = loadUserComments;
391 \}
392 </script>
393
394_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
395
396_If_("_activateweb20_" eq "2",
397 _If_("_activateseaweed_" eq "1",_seaweedscript_)
398 _If_("_activatetalkback_" eq "1",_talkbackscript_)
399)
400_If_(_pagescriptfileextra_,_pagescriptfileextra_)
401<script language="javascript" type="text/javascript">
402_loginscript_
403_If_(_pagescriptextra_,_pagescriptextra_)
404_collectionspecificscript_
405_imagescript_
406</script>
407}
408
409_globalscripts_ [v=1] {
410
411_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
412
413_If_("_activateweb20_" eq "2",
414 <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
415 _If_("_activateseaweed_" eq "1",_seaweedscript_)
416 _If_("_activatetalkback_" eq "1",_talkbackscript_)
417)
418_If_(_pagescriptfileextra_,_pagescriptfileextra_)
419<script language="javascript" type="text/javascript">
420<!--
421_loginscript_
422_If_(_cgiargx_,_scriptdetach_)
423_If_(_pagescriptextra_,_pagescriptextra_)
424_collectionspecificscript_
425// -->
426</script>
427}
428
429_scriptdetach_ {
430 function close\_detach() \{
431 close();
432 \}
433}
434
435
436_jqueryScriptAndStyle_ {
437<link type="text/css" href="_httpstyle_/max-video/jquery-ui-1.8.4.custom.css" rel="stylesheet" />
438<script type="text/javascript" src="_httpscript_/jquery-1.4.2.min.js"></script>
439<script type="text/javascript" src="_httpscript_/jquery-ui-1.8.4.custom.min.js"></script>
440}
441
Note: See TracBrowser for help on using the repository browser.